@pascal-app/nodes 1.0.0 → 1.0.3

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 (439) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +4 -1
  3. package/dist/block/face-host.d.ts.map +1 -1
  4. package/dist/block/face-host.js +19 -2
  5. package/dist/block/hosted-edit.d.ts +13 -0
  6. package/dist/block/hosted-edit.d.ts.map +1 -0
  7. package/dist/block/hosted-edit.js +205 -0
  8. package/dist/block/last-operation.d.ts +1 -1
  9. package/dist/block/last-operation.d.ts.map +1 -1
  10. package/dist/block/last-operation.js +6 -4
  11. package/dist/block/modal-session.d.ts +2 -1
  12. package/dist/block/modal-session.d.ts.map +1 -1
  13. package/dist/block/modal-session.js +2 -2
  14. package/dist/block/selection.d.ts.map +1 -1
  15. package/dist/block/selection.js +82 -24
  16. package/dist/block/surface.d.ts +4 -0
  17. package/dist/block/surface.d.ts.map +1 -0
  18. package/dist/block/surface.js +54 -0
  19. package/dist/block/use-block-face-operation.d.ts +2 -2
  20. package/dist/block/use-block-face-operation.d.ts.map +1 -1
  21. package/dist/block/use-block-face-operation.js +25 -11
  22. package/dist/box-vent/definition.d.ts.map +1 -1
  23. package/dist/box-vent/definition.js +1 -0
  24. package/dist/box-vent/panel.js +4 -4
  25. package/dist/building/renderer.d.ts.map +1 -1
  26. package/dist/building/renderer.js +1 -1
  27. package/dist/cabinet/appliance-layout.d.ts +26 -0
  28. package/dist/cabinet/appliance-layout.d.ts.map +1 -0
  29. package/dist/cabinet/appliance-layout.js +52 -0
  30. package/dist/cabinet/countertop-layout.d.ts +173 -0
  31. package/dist/cabinet/countertop-layout.d.ts.map +1 -0
  32. package/dist/cabinet/countertop-layout.js +80 -0
  33. package/dist/cabinet/definition.d.ts.map +1 -1
  34. package/dist/cabinet/definition.js +17 -8
  35. package/dist/cabinet/geometry/cooktop.d.ts.map +1 -1
  36. package/dist/cabinet/geometry/cooktop.js +2 -2
  37. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  38. package/dist/cabinet/geometry/run.js +10 -71
  39. package/dist/cabinet/geometry/sink.d.ts +2 -12
  40. package/dist/cabinet/geometry/sink.d.ts.map +1 -1
  41. package/dist/cabinet/geometry/sink.js +8 -39
  42. package/dist/cabinet/hosted-resize.d.ts +5 -0
  43. package/dist/cabinet/hosted-resize.d.ts.map +1 -0
  44. package/dist/cabinet/hosted-resize.js +14 -0
  45. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  46. package/dist/cabinet/placement-snap.js +4 -2
  47. package/dist/cabinet/run-layout.d.ts +8 -1
  48. package/dist/cabinet/run-layout.d.ts.map +1 -1
  49. package/dist/cabinet/run-layout.js +22 -14
  50. package/dist/cabinet/run-ops.d.ts +3 -3
  51. package/dist/cabinet/run-ops.js +3 -3
  52. package/dist/cabinet/run-panel.d.ts +1 -1
  53. package/dist/cabinet/run-panel.d.ts.map +1 -1
  54. package/dist/cabinet/run-panel.js +16 -7
  55. package/dist/cabinet/surfaces.d.ts +5 -0
  56. package/dist/cabinet/surfaces.d.ts.map +1 -0
  57. package/dist/cabinet/surfaces.js +113 -0
  58. package/dist/cabinet/tool.d.ts.map +1 -1
  59. package/dist/cabinet/tool.js +8 -4
  60. package/dist/cabinet/tree-structure.d.ts.map +1 -1
  61. package/dist/cabinet/tree-structure.js +10 -9
  62. package/dist/ceiling/definition.d.ts.map +1 -1
  63. package/dist/ceiling/definition.js +6 -1
  64. package/dist/ceiling/floorplan-affordances.d.ts +4 -4
  65. package/dist/ceiling/panel.js +1 -1
  66. package/dist/ceiling/renderer.d.ts.map +1 -1
  67. package/dist/ceiling/renderer.js +3 -2
  68. package/dist/chimney/definition.d.ts.map +1 -1
  69. package/dist/chimney/definition.js +1 -0
  70. package/dist/chimney/panel.js +9 -9
  71. package/dist/column/definition.d.ts.map +1 -1
  72. package/dist/column/definition.js +10 -3
  73. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  74. package/dist/column/floorplan-affordances.js +6 -1
  75. package/dist/column/floorplan.d.ts.map +1 -1
  76. package/dist/column/floorplan.js +23 -11
  77. package/dist/column/hosted-resize.d.ts +116 -0
  78. package/dist/column/hosted-resize.d.ts.map +1 -0
  79. package/dist/column/hosted-resize.js +9 -0
  80. package/dist/column/panel.d.ts.map +1 -1
  81. package/dist/column/panel.js +6 -3
  82. package/dist/column/renderer.d.ts.map +1 -1
  83. package/dist/column/renderer.js +25 -103
  84. package/dist/column/shape.d.ts +22 -0
  85. package/dist/column/shape.d.ts.map +1 -0
  86. package/dist/column/shape.js +120 -0
  87. package/dist/column/surface.d.ts +4 -0
  88. package/dist/column/surface.d.ts.map +1 -0
  89. package/dist/column/surface.js +66 -0
  90. package/dist/cupola/definition.d.ts.map +1 -1
  91. package/dist/cupola/definition.js +1 -0
  92. package/dist/cupola/panel.js +1 -1
  93. package/dist/door/definition.d.ts.map +1 -1
  94. package/dist/door/definition.js +40 -1
  95. package/dist/door/door-math.d.ts +1 -1
  96. package/dist/door/door-math.d.ts.map +1 -1
  97. package/dist/door/door-math.js +7 -10
  98. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  99. package/dist/door/floorplan-affordances.js +8 -12
  100. package/dist/door/move-tool.d.ts.map +1 -1
  101. package/dist/door/move-tool.js +3 -4
  102. package/dist/door/panel.d.ts.map +1 -1
  103. package/dist/door/panel.js +28 -57
  104. package/dist/door/tool.d.ts.map +1 -1
  105. package/dist/door/tool.js +20 -2
  106. package/dist/dormer/definition.d.ts.map +1 -1
  107. package/dist/dormer/definition.js +1 -0
  108. package/dist/dormer/panel-position-section.js +2 -2
  109. package/dist/dormer/panel.js +1 -1
  110. package/dist/downspout/definition.d.ts.map +1 -1
  111. package/dist/downspout/definition.js +1 -0
  112. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  113. package/dist/duct-segment/parametrics.js +5 -1
  114. package/dist/duct-segment/tool.d.ts +1 -0
  115. package/dist/duct-segment/tool.d.ts.map +1 -1
  116. package/dist/duct-segment/tool.js +21 -8
  117. package/dist/duct-terminal/tool.d.ts.map +1 -1
  118. package/dist/duct-terminal/tool.js +77 -8
  119. package/dist/elevator/definition.d.ts.map +1 -1
  120. package/dist/elevator/definition.js +2 -0
  121. package/dist/elevator/parametrics.d.ts.map +1 -1
  122. package/dist/elevator/parametrics.js +98 -1
  123. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  124. package/dist/eyebrow-vent/definition.js +1 -0
  125. package/dist/eyebrow-vent/panel.js +1 -1
  126. package/dist/fence/definition.d.ts.map +1 -1
  127. package/dist/fence/definition.js +1 -0
  128. package/dist/fence/inspector-editors.js +1 -1
  129. package/dist/fence/tool.js +2 -2
  130. package/dist/guide/definition.d.ts.map +1 -1
  131. package/dist/guide/definition.js +1 -0
  132. package/dist/gutter/definition.d.ts.map +1 -1
  133. package/dist/gutter/definition.js +1 -0
  134. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  135. package/dist/hvac-equipment/tool.js +8 -2
  136. package/dist/imported-mesh/definition.d.ts +5 -0
  137. package/dist/imported-mesh/definition.d.ts.map +1 -0
  138. package/dist/imported-mesh/definition.js +38 -0
  139. package/dist/imported-mesh/floorplan.d.ts +4 -0
  140. package/dist/imported-mesh/floorplan.d.ts.map +1 -0
  141. package/dist/imported-mesh/floorplan.js +34 -0
  142. package/dist/imported-mesh/geometry.d.ts +5 -0
  143. package/dist/imported-mesh/geometry.d.ts.map +1 -0
  144. package/dist/imported-mesh/geometry.js +34 -0
  145. package/dist/imported-mesh/index.d.ts +4 -0
  146. package/dist/imported-mesh/index.d.ts.map +1 -0
  147. package/dist/imported-mesh/index.js +3 -0
  148. package/dist/imported-mesh/schema.d.ts +2 -0
  149. package/dist/imported-mesh/schema.d.ts.map +1 -0
  150. package/dist/imported-mesh/schema.js +1 -0
  151. package/dist/index.d.ts +2 -0
  152. package/dist/index.d.ts.map +1 -1
  153. package/dist/index.js +8 -0
  154. package/dist/item/__fixtures__/main-floorplan.d.ts +26 -0
  155. package/dist/item/__fixtures__/main-floorplan.d.ts.map +1 -0
  156. package/dist/item/__fixtures__/main-floorplan.js +297 -0
  157. package/dist/item/definition.d.ts.map +1 -1
  158. package/dist/item/definition.js +3 -1
  159. package/dist/item/floorplan-move.d.ts +9 -1
  160. package/dist/item/floorplan-move.d.ts.map +1 -1
  161. package/dist/item/floorplan-move.js +231 -99
  162. package/dist/item/floorplan.d.ts +22 -0
  163. package/dist/item/floorplan.d.ts.map +1 -1
  164. package/dist/item/floorplan.js +72 -2
  165. package/dist/item/move-tool.d.ts +1 -1
  166. package/dist/item/move-tool.d.ts.map +1 -1
  167. package/dist/item/move-tool.js +15 -7
  168. package/dist/item/panel.js +1 -1
  169. package/dist/item/renderer.d.ts.map +1 -1
  170. package/dist/item/renderer.js +8 -2
  171. package/dist/level/renderer.js +1 -1
  172. package/dist/lineset/tool.d.ts.map +1 -1
  173. package/dist/lineset/tool.js +1 -0
  174. package/dist/liquid-line/tool.d.ts.map +1 -1
  175. package/dist/liquid-line/tool.js +5 -1
  176. package/dist/measurement/definition.d.ts.map +1 -1
  177. package/dist/measurement/definition.js +1 -0
  178. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  179. package/dist/pipe-segment/parametrics.js +5 -1
  180. package/dist/pipe-segment/tool.d.ts.map +1 -1
  181. package/dist/pipe-segment/tool.js +14 -3
  182. package/dist/pipe-trap/tool.d.ts.map +1 -1
  183. package/dist/pipe-trap/tool.js +7 -8
  184. package/dist/procedural-item/definition.d.ts +4 -0
  185. package/dist/procedural-item/definition.d.ts.map +1 -0
  186. package/dist/procedural-item/definition.js +257 -0
  187. package/dist/procedural-item/geometry.d.ts +31 -0
  188. package/dist/procedural-item/geometry.d.ts.map +1 -0
  189. package/dist/procedural-item/geometry.js +88 -0
  190. package/dist/procedural-item/index.d.ts +3 -0
  191. package/dist/procedural-item/index.d.ts.map +1 -0
  192. package/dist/procedural-item/index.js +2 -0
  193. package/dist/procedural-item/move-session.d.ts +15 -0
  194. package/dist/procedural-item/move-session.d.ts.map +1 -0
  195. package/dist/procedural-item/move-session.js +197 -0
  196. package/dist/procedural-item/move-tool.d.ts +5 -0
  197. package/dist/procedural-item/move-tool.d.ts.map +1 -0
  198. package/dist/procedural-item/move-tool.js +193 -0
  199. package/dist/procedural-item/renderer.d.ts +5 -0
  200. package/dist/procedural-item/renderer.d.ts.map +1 -0
  201. package/dist/procedural-item/renderer.js +66 -0
  202. package/dist/ridge-vent/definition.d.ts.map +1 -1
  203. package/dist/ridge-vent/definition.js +1 -0
  204. package/dist/ridge-vent/panel.js +4 -4
  205. package/dist/roof/definition.d.ts.map +1 -1
  206. package/dist/roof/definition.js +4 -1
  207. package/dist/roof/panel-model.d.ts +4 -0
  208. package/dist/roof/panel-model.d.ts.map +1 -0
  209. package/dist/roof/panel-model.js +151 -0
  210. package/dist/roof/panel.d.ts.map +1 -1
  211. package/dist/roof/panel.js +9 -8
  212. package/dist/roof/parametrics.d.ts.map +1 -1
  213. package/dist/roof/parametrics.js +16 -1
  214. package/dist/roof-segment/definition.d.ts.map +1 -1
  215. package/dist/roof-segment/definition.js +1 -0
  216. package/dist/roof-segment/panel.d.ts.map +1 -1
  217. package/dist/roof-segment/panel.js +5 -5
  218. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  219. package/dist/roof-segment/parametrics.js +176 -1
  220. package/dist/scan/definition.d.ts.map +1 -1
  221. package/dist/scan/definition.js +1 -0
  222. package/dist/shared/automatic-run-end-cap.d.ts +1 -0
  223. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -1
  224. package/dist/shared/automatic-run-end-cap.js +10 -0
  225. package/dist/shared/commit-opening-move.d.ts +4 -0
  226. package/dist/shared/commit-opening-move.d.ts.map +1 -0
  227. package/dist/shared/commit-opening-move.js +9 -0
  228. package/dist/shared/curtain-opening-limits.d.ts +14 -0
  229. package/dist/shared/curtain-opening-limits.d.ts.map +1 -0
  230. package/dist/shared/curtain-opening-limits.js +53 -0
  231. package/dist/shared/distribution-run-tool.d.ts +10 -0
  232. package/dist/shared/distribution-run-tool.d.ts.map +1 -1
  233. package/dist/shared/distribution-run-tool.js +56 -11
  234. package/dist/shared/draft-axis-guides.d.ts +0 -6
  235. package/dist/shared/draft-axis-guides.d.ts.map +1 -1
  236. package/dist/shared/draft-axis-guides.js +1 -8
  237. package/dist/shared/hosted-resize.d.ts +12 -0
  238. package/dist/shared/hosted-resize.d.ts.map +1 -0
  239. package/dist/shared/hosted-resize.js +166 -0
  240. package/dist/shared/opening-grid-follow.d.ts +8 -0
  241. package/dist/shared/opening-grid-follow.d.ts.map +1 -0
  242. package/dist/shared/opening-grid-follow.js +12 -0
  243. package/dist/shared/opening-property-preview-host.d.ts +3 -0
  244. package/dist/shared/opening-property-preview-host.d.ts.map +1 -0
  245. package/dist/shared/opening-property-preview-host.js +21 -0
  246. package/dist/shared/opening-property-preview.d.ts +19 -0
  247. package/dist/shared/opening-property-preview.d.ts.map +1 -0
  248. package/dist/shared/opening-property-preview.js +99 -0
  249. package/dist/shared/panel-fields.d.ts +15 -0
  250. package/dist/shared/panel-fields.d.ts.map +1 -0
  251. package/dist/shared/panel-fields.js +31 -0
  252. package/dist/shared/resting-surface-plan.d.ts +4 -0
  253. package/dist/shared/resting-surface-plan.d.ts.map +1 -0
  254. package/dist/shared/resting-surface-plan.js +53 -0
  255. package/dist/shared/surface-counterparts.d.ts +12 -0
  256. package/dist/shared/surface-counterparts.d.ts.map +1 -0
  257. package/dist/shared/surface-counterparts.js +27 -0
  258. package/dist/shared/wall-attach-target.d.ts +1 -0
  259. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  260. package/dist/shared/wall-attach-target.js +4 -1
  261. package/dist/shared/wall-event-from-grid.d.ts +5 -0
  262. package/dist/shared/wall-event-from-grid.d.ts.map +1 -0
  263. package/dist/shared/wall-event-from-grid.js +36 -0
  264. package/dist/shelf/definition.d.ts.map +1 -1
  265. package/dist/shelf/definition.js +5 -2
  266. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  267. package/dist/shelf/floorplan-affordances.js +5 -3
  268. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  269. package/dist/shelf/floorplan-move.js +3 -2
  270. package/dist/shelf/floorplan.d.ts.map +1 -1
  271. package/dist/shelf/floorplan.js +9 -2
  272. package/dist/shelf/geometry.d.ts.map +1 -1
  273. package/dist/shelf/geometry.js +2 -10
  274. package/dist/site/renderer.d.ts.map +1 -1
  275. package/dist/site/renderer.js +9 -2
  276. package/dist/skylight/definition.d.ts.map +1 -1
  277. package/dist/skylight/definition.js +1 -0
  278. package/dist/skylight/panel.js +6 -6
  279. package/dist/slab/definition.d.ts.map +1 -1
  280. package/dist/slab/definition.js +4 -0
  281. package/dist/slab/panel.js +1 -1
  282. package/dist/solar-panel/definition.d.ts.map +1 -1
  283. package/dist/solar-panel/definition.js +1 -0
  284. package/dist/solar-panel/panel.js +2 -2
  285. package/dist/spawn/definition.d.ts.map +1 -1
  286. package/dist/spawn/definition.js +1 -0
  287. package/dist/spawn/panel.js +1 -1
  288. package/dist/stair/definition.d.ts.map +1 -1
  289. package/dist/stair/definition.js +2 -0
  290. package/dist/stair/panel.d.ts.map +1 -1
  291. package/dist/stair/panel.js +9 -7
  292. package/dist/stair/parametrics.d.ts.map +1 -1
  293. package/dist/stair/parametrics.js +164 -1
  294. package/dist/stair-segment/definition.d.ts.map +1 -1
  295. package/dist/stair-segment/definition.js +1 -0
  296. package/dist/stair-segment/panel.js +4 -4
  297. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  298. package/dist/stair-segment/parametrics.js +81 -1
  299. package/dist/turbine-vent/definition.d.ts.map +1 -1
  300. package/dist/turbine-vent/definition.js +1 -0
  301. package/dist/turbine-vent/panel.js +1 -1
  302. package/dist/unit/definition.d.ts +10 -0
  303. package/dist/unit/definition.d.ts.map +1 -0
  304. package/dist/unit/definition.js +38 -0
  305. package/dist/unit/index.d.ts +2 -0
  306. package/dist/unit/index.d.ts.map +1 -0
  307. package/dist/unit/index.js +1 -0
  308. package/dist/unit/parametrics.d.ts +3 -0
  309. package/dist/unit/parametrics.d.ts.map +1 -0
  310. package/dist/unit/parametrics.js +4 -0
  311. package/dist/unit/schema.d.ts +2 -0
  312. package/dist/unit/schema.d.ts.map +1 -0
  313. package/dist/unit/schema.js +1 -0
  314. package/dist/unit/unit-panel.d.ts +5 -0
  315. package/dist/unit/unit-panel.d.ts.map +1 -0
  316. package/dist/unit/unit-panel.js +61 -0
  317. package/dist/wall/actions.d.ts +3 -0
  318. package/dist/wall/actions.d.ts.map +1 -0
  319. package/dist/wall/actions.js +56 -0
  320. package/dist/wall/curtain-opening-frame.d.ts +14 -0
  321. package/dist/wall/curtain-opening-frame.d.ts.map +1 -0
  322. package/dist/wall/curtain-opening-frame.js +111 -0
  323. package/dist/wall/curtain-panel-highlight.d.ts +3 -0
  324. package/dist/wall/curtain-panel-highlight.d.ts.map +1 -0
  325. package/dist/wall/curtain-panel-highlight.js +113 -0
  326. package/dist/wall/curtain-wall-adapter.d.ts +3 -0
  327. package/dist/wall/curtain-wall-adapter.d.ts.map +1 -0
  328. package/dist/wall/curtain-wall-adapter.js +55 -0
  329. package/dist/wall/curtain-wall-floorplan.d.ts +3 -0
  330. package/dist/wall/curtain-wall-floorplan.d.ts.map +1 -0
  331. package/dist/wall/curtain-wall-floorplan.js +91 -0
  332. package/dist/wall/curtain-wall-geometry.d.ts +4 -0
  333. package/dist/wall/curtain-wall-geometry.d.ts.map +1 -0
  334. package/dist/wall/curtain-wall-geometry.js +226 -0
  335. package/dist/wall/curtain-wall-layout.d.ts +16 -0
  336. package/dist/wall/curtain-wall-layout.d.ts.map +1 -0
  337. package/dist/wall/curtain-wall-layout.js +176 -0
  338. package/dist/wall/curtain-wall-materials.d.ts +5 -0
  339. package/dist/wall/curtain-wall-materials.d.ts.map +1 -0
  340. package/dist/wall/curtain-wall-materials.js +55 -0
  341. package/dist/wall/curtain-wall-panel.d.ts +14 -0
  342. package/dist/wall/curtain-wall-panel.d.ts.map +1 -0
  343. package/dist/wall/curtain-wall-panel.js +167 -0
  344. package/dist/wall/curtain-wall-piece-geometry.d.ts +5 -0
  345. package/dist/wall/curtain-wall-piece-geometry.d.ts.map +1 -0
  346. package/dist/wall/curtain-wall-piece-geometry.js +220 -0
  347. package/dist/wall/curtain-wall-shadow.d.ts +4 -0
  348. package/dist/wall/curtain-wall-shadow.d.ts.map +1 -0
  349. package/dist/wall/curtain-wall-shadow.js +15 -0
  350. package/dist/wall/definition.d.ts +0 -15
  351. package/dist/wall/definition.d.ts.map +1 -1
  352. package/dist/wall/definition.js +65 -4
  353. package/dist/wall/drawing-mode.d.ts +12 -0
  354. package/dist/wall/drawing-mode.d.ts.map +1 -0
  355. package/dist/wall/drawing-mode.js +38 -0
  356. package/dist/wall/floorplan-tool.d.ts +4 -0
  357. package/dist/wall/floorplan-tool.d.ts.map +1 -0
  358. package/dist/wall/floorplan-tool.js +107 -0
  359. package/dist/wall/floorplan.d.ts.map +1 -1
  360. package/dist/wall/floorplan.js +6 -2
  361. package/dist/wall/length-patch.d.ts +3 -0
  362. package/dist/wall/length-patch.d.ts.map +1 -0
  363. package/dist/wall/length-patch.js +14 -0
  364. package/dist/wall/move-tool.d.ts.map +1 -1
  365. package/dist/wall/move-tool.js +23 -1
  366. package/dist/wall/paint.d.ts.map +1 -1
  367. package/dist/wall/paint.js +39 -4
  368. package/dist/wall/panel-model.d.ts +4 -0
  369. package/dist/wall/panel-model.d.ts.map +1 -0
  370. package/dist/wall/panel-model.js +117 -0
  371. package/dist/wall/panel.d.ts.map +1 -1
  372. package/dist/wall/panel.js +20 -24
  373. package/dist/wall/property-preview.d.ts +7 -0
  374. package/dist/wall/property-preview.d.ts.map +1 -0
  375. package/dist/wall/property-preview.js +31 -0
  376. package/dist/wall/rectangle-command.d.ts +149 -0
  377. package/dist/wall/rectangle-command.d.ts.map +1 -0
  378. package/dist/wall/rectangle-command.js +22 -0
  379. package/dist/wall/rectangle-tool.d.ts +2 -0
  380. package/dist/wall/rectangle-tool.d.ts.map +1 -0
  381. package/dist/wall/rectangle-tool.js +147 -0
  382. package/dist/wall/renderer.d.ts.map +1 -1
  383. package/dist/wall/renderer.js +7 -4
  384. package/dist/wall/slots.d.ts +2 -2
  385. package/dist/wall/slots.d.ts.map +1 -1
  386. package/dist/wall/slots.js +10 -2
  387. package/dist/wall/split-floorplan-layer.d.ts +4 -0
  388. package/dist/wall/split-floorplan-layer.d.ts.map +1 -0
  389. package/dist/wall/split-floorplan-layer.js +71 -0
  390. package/dist/wall/split-pointer.d.ts +3 -0
  391. package/dist/wall/split-pointer.d.ts.map +1 -0
  392. package/dist/wall/split-pointer.js +95 -0
  393. package/dist/wall/split-preview.d.ts +55 -0
  394. package/dist/wall/split-preview.d.ts.map +1 -0
  395. package/dist/wall/split-preview.js +106 -0
  396. package/dist/wall/split-session.d.ts +16 -0
  397. package/dist/wall/split-session.d.ts.map +1 -0
  398. package/dist/wall/split-session.js +138 -0
  399. package/dist/wall/split-store.d.ts +16 -0
  400. package/dist/wall/split-store.d.ts.map +1 -0
  401. package/dist/wall/split-store.js +6 -0
  402. package/dist/wall/split-tool.d.ts +10 -0
  403. package/dist/wall/split-tool.d.ts.map +1 -0
  404. package/dist/wall/split-tool.js +95 -0
  405. package/dist/wall/system.d.ts.map +1 -1
  406. package/dist/wall/system.js +3 -1
  407. package/dist/wall/tool.d.ts.map +1 -1
  408. package/dist/wall/tool.js +14 -6
  409. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  410. package/dist/wall/wall-batch-system.js +3 -0
  411. package/dist/window/definition.d.ts.map +1 -1
  412. package/dist/window/definition.js +48 -1
  413. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  414. package/dist/window/floorplan-affordances.js +8 -10
  415. package/dist/window/move-tool.d.ts.map +1 -1
  416. package/dist/window/move-tool.js +4 -6
  417. package/dist/window/panel.d.ts.map +1 -1
  418. package/dist/window/panel.js +22 -60
  419. package/dist/window/tool.d.ts.map +1 -1
  420. package/dist/window/tool.js +34 -2
  421. package/dist/window/window-math.d.ts +1 -1
  422. package/dist/window/window-math.d.ts.map +1 -1
  423. package/dist/window/window-math.js +8 -11
  424. package/dist/zone/definition.d.ts.map +1 -1
  425. package/dist/zone/definition.js +8 -1
  426. package/dist/zone/floorplan.d.ts +1 -3
  427. package/dist/zone/floorplan.d.ts.map +1 -1
  428. package/dist/zone/floorplan.js +43 -28
  429. package/dist/zone/quantities-panel.d.ts.map +1 -1
  430. package/dist/zone/quantities-panel.js +32 -44
  431. package/dist/zone/renderer.d.ts.map +1 -1
  432. package/dist/zone/renderer.js +21 -7
  433. package/dist/zone/unit-membership.d.ts +12 -0
  434. package/dist/zone/unit-membership.d.ts.map +1 -0
  435. package/dist/zone/unit-membership.js +22 -0
  436. package/package.json +15 -9
  437. package/dist/shared/opening-documentation-fields.d.ts +0 -16
  438. package/dist/shared/opening-documentation-fields.d.ts.map +0 -1
  439. package/dist/shared/opening-documentation-fields.js +0 -54
@@ -0,0 +1,53 @@
1
+ import { getCurtainWallConfig, getWallCurveLength, } from '@pascal-app/core';
2
+ import { resolveWallOpeningCeiling } from './wall-opening-ceiling';
3
+ export function curtainOpeningResizeMax(opening, nodes, axis, sign) {
4
+ const limits = curtainOpeningLimits(opening, nodes);
5
+ if (!limits)
6
+ return undefined;
7
+ if (axis === 'y') {
8
+ const anchor = opening.position[1] - (sign * opening.height) / 2;
9
+ return Math.max(0, sign > 0 ? limits.top - anchor : anchor - limits.bottom);
10
+ }
11
+ const direction = Math.cos(opening.rotation[1]) >= 0 ? sign : -sign;
12
+ const anchor = opening.position[0] - (direction * opening.width) / 2;
13
+ return Math.max(0, direction > 0 ? limits.length - limits.margin - anchor : anchor - limits.margin);
14
+ }
15
+ export function curtainOpeningLimits(opening, nodes) {
16
+ const wall = nodes[(opening.parentId ?? opening.wallId)];
17
+ if (wall?.type !== 'wall' || wall.wallType !== 'curtain')
18
+ return null;
19
+ const margin = getCurtainWallConfig(wall).perimeterWidth;
20
+ const length = getWallCurveLength(wall);
21
+ const top = resolveWallOpeningCeiling(wall, nodes) - margin;
22
+ const bottom = opening.type === 'door' ? 0 : margin;
23
+ return {
24
+ margin,
25
+ length,
26
+ top,
27
+ bottom,
28
+ width: Math.max(0, 2 * Math.min(opening.position[0] - margin, length - margin - opening.position[0])),
29
+ height: Math.max(0, opening.type === 'door'
30
+ ? top
31
+ : 2 * Math.min(opening.position[1] - bottom, top - opening.position[1])),
32
+ };
33
+ }
34
+ export function constrainCurtainOpening(opening, patch, nodes) {
35
+ const limits = curtainOpeningLimits(opening, nodes);
36
+ if (!limits || !('width' in patch || 'height' in patch || 'position' in patch))
37
+ return patch;
38
+ const next = { ...opening, ...patch };
39
+ const moving = patch.position !== undefined && patch.width === undefined && patch.height === undefined;
40
+ const availableWidth = Math.max(0, limits.length - 2 * limits.margin);
41
+ const availableHeight = Math.max(0, limits.top - limits.bottom);
42
+ const widthLimit = moving || limits.width < 0.01 ? availableWidth : limits.width;
43
+ const heightLimit = moving || limits.height < 0.01 ? availableHeight : limits.height;
44
+ const width = Math.min(Math.max(0.01, next.width), widthLimit);
45
+ const height = Math.min(Math.max(0.01, next.height), heightLimit);
46
+ if (width < 0.01 || height < 0.01)
47
+ return {};
48
+ const x = Math.max(limits.margin + width / 2, Math.min(limits.length - limits.margin - width / 2, next.position[0]));
49
+ const y = opening.type === 'door'
50
+ ? height / 2
51
+ : Math.max(limits.bottom + height / 2, Math.min(limits.top - height / 2, next.position[1]));
52
+ return { ...patch, width, height, position: [x, y, next.position[2]] };
53
+ }
@@ -29,6 +29,16 @@ export type CameraDirectionProjection = {
29
29
  point: RunPoint;
30
30
  direction: RunPoint;
31
31
  };
32
+ type RunWallSurfaceTarget = Extract<RunSurfaceTarget, {
33
+ kind: 'wall';
34
+ }>;
35
+ export declare function shouldLockRunWallSurface(target: RunSurfaceTarget | null | undefined, connection: RunConnection): target is RunWallSurfaceTarget;
36
+ export declare function isSameRunWallSurface(target: RunWallSurfaceTarget, hit: {
37
+ kind?: string;
38
+ hostId?: string;
39
+ face?: string;
40
+ side?: string;
41
+ } | undefined): boolean;
32
42
  /** Build a stable 2D drawing frame for a floor, wall, ceiling, or sloped face. */
33
43
  export declare function createRunSurfaceFrame(origin: readonly number[], surfaceNormal?: readonly number[]): RunSurfaceFrame;
34
44
  export declare function projectRunPointToSurface(point: readonly number[], frame: RunSurfaceFrame): RunPoint;
@@ -1 +1 @@
1
- {"version":3,"file":"distribution-run-tool.d.ts","sourceRoot":"","sources":["../../src/shared/distribution-run-tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,SAAS,EAAoD,MAAM,kBAAkB,CAAA;AACnG,OAAO,EAIL,KAAK,iBAAiB,EAUvB,MAAM,oBAAoB,CAAA;AAG3B,OAAO,EAAE,KAAK,SAAS,EAA4C,MAAM,OAAO,CAAA;AAEhF,OAAO,EAAE,KAAK,KAAK,EAAW,MAAM,OAAO,CAAA;AAC3C,OAAO,KAAK,EAAoB,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAErF,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAEpD,OAAO,EAEL,KAAK,gBAAgB,EAGtB,MAAM,0BAA0B,CAAA;AACjC,OAAO,EAAkB,KAAK,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGtE,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,QAAQ,CAAA;IAChB,MAAM,EAAE,QAAQ,CAAA;IAChB,OAAO,EAAE,QAAQ,CAAA;IACjB,SAAS,EAAE,QAAQ,CAAA;CACpB,CAAA;AAID,MAAM,MAAM,aAAa,GAAG;IAC1B,IAAI,EAAE,SAAS,GAAG,IAAI,CAAA;IACtB,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,SAAS,EAAE,QAAQ,CAAA;IACnB,cAAc,EAAE,aAAa,CAAA;CAC9B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACzB,MAAM,EAAE,QAAQ,CAAA;IAChB,SAAS,EAAE,QAAQ,CAAA;CACpB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,KAAK,EAAE,QAAQ,CAAA;IACf,SAAS,EAAE,QAAQ,CAAA;CACpB,CAAA;AAkCD,kFAAkF;AAClF,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,MAAM,EAAE,EACzB,aAAa,GAAE,SAAS,MAAM,EAAO,GACpC,eAAe,CAkBjB;AAED,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,eAAe,GACrB,QAAQ,CAYV;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,KAAK,EAAE,eAAe,EACtB,IAAI,EAAE,MAAM,GACX,QAAQ,CAeV;AAED,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,GAAG,EAAE,SAAS,MAAM,EAAE,EACtB,KAAK,EAAE,eAAe,EACtB,eAAe,GAAE,SAAS,MAAM,EAAE,GAAG,IAAW,GAC/C,QAAQ,CAwBV;AAED,KAAK,yBAAyB,GAAG;IAC/B,MAAM,EAAE,OAAO,CAAA;IACf,OAAO,EAAE,SAAS,GAAG,IAAI,CAAA;IACzB,QAAQ,EAAE,cAAc,GAAG,cAAc,CAAA;IACzC,YAAY,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC9B,iBAAiB,CAAC,EAAE,aAAa,GAAG,IAAI,CAAA;IACxC,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,KAAK,UAAU,GAAG,IAAI,CAAA;IAClF,gBAAgB,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,KAAK,MAAM,CAAA;IAC/D,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,eAAe,EAAE,aAAa,KAAK,QAAQ,CAAA;IAC7F,uEAAuE;IACvE,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,qBAAqB,CAAC,EAAE,CAAC,UAAU,EAAE,aAAa,KAAK,IAAI,CAAA;IAC3D,MAAM,EAAE,CAAC,IAAI,EAAE;QACb,KAAK,EAAE,QAAQ,CAAA;QACf,GAAG,EAAE,QAAQ,CAAA;QACb,eAAe,EAAE,aAAa,CAAA;QAC9B,aAAa,EAAE,aAAa,CAAA;QAC5B,aAAa,EAAE,gBAAgB,GAAG,IAAI,CAAA;KACvC,KAAK,eAAe,GAAG,IAAI,CAAA;IAC5B,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,EAAE,QAAQ,GAAG,IAAI,KAAK,IAAI,CAAA;CACpE,CAAA;AAID,eAAO,MAAM,mBAAmB,OAAO,CAAA;AACvC,eAAO,MAAM,qBAAqB,YAAY,CAAA;AAE9C,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,MAAM,GAAG,MAAM,CAEjE;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhE;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,SAAS,MAAM,EAAE,EAAE,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAKrF;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,QAAQ,EACb,eAAe,GAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAW,GAC/D,QAAQ,CAsBV;AAWD,wBAAgB,aAAa,CAAC,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,CAMrF;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,QAAQ,EACb,SAAS,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAC3C,QAAQ,CAUV;AAED,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,YAAY,EACjB,eAAe,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAClD,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM,EAChB,UAAU,aAA4C,EACtD,YAAY,CAAC,EAAE,eAAe,EAC9B,MAAM,CAAC,EAAE;IACP,OAAO,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IACrD,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACzB,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;CAC1B,GACA,yBAAyB,GAAG,IAAI,CA8DlC;AAED,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,CAAC,GAAG,CAAC,CAAC,GAChB,MAAM,CAMR;AAgHD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,yBAAyB;;;;;;;;;;iCAiDxB,MAAM;mCA2iBnB,QAAQ;;;;EAS1C;AAED,wBAAgB,qBAAqB,CAAC,EACpC,MAAM,EACN,KAAK,EACL,UAAU,EACV,UAAU,EACV,SAAS,EACT,IAAI,EACJ,UAAe,EACf,SAAS,EACT,aAAa,EACb,cAAc,EACd,WAAW,EACX,iBAAiB,EACjB,mBAAmB,EACnB,iBAAiB,GAClB,EAAE;IACD,MAAM,EAAE,QAAQ,GAAG,IAAI,CAAA;IACvB,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;IACtB,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAA;IAC3B,UAAU,CAAC,EAAE,eAAe,GAAG,IAAI,CAAA;IACnC,SAAS,EAAE,OAAO,CAAA;IAClB,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC3B,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAA;IAChC,SAAS,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,IAAI,CAAC,CAAA;IACnC,aAAa,EAAE,gBAAgB,CAAA;IAC/B,cAAc,CAAC,EAAE,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IACzD,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAA;IAC7B,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IAC7C,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAA;CAClD,sCA4HA"}
1
+ {"version":3,"file":"distribution-run-tool.d.ts","sourceRoot":"","sources":["../../src/shared/distribution-run-tool.tsx"],"names":[],"mappings":"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"}
@@ -12,6 +12,15 @@ import { resolveRunCursorPlane } from './run-cursor';
12
12
  import { RunDirectionFeedback, run3DDirectionCandidates, runHorizontalDirectionCandidates, } from './run-direction-feedback';
13
13
  import { findScreenPort } from './run-port-snap';
14
14
  import { chooseScreenDirection, screenDirectionScore } from './run-screen-direction';
15
+ export function shouldLockRunWallSurface(target, connection) {
16
+ return target?.kind === 'wall' && !connection.port && !connection.body;
17
+ }
18
+ export function isSameRunWallSurface(target, hit) {
19
+ return (hit?.kind === 'wall' &&
20
+ hit.hostId === target.hostId &&
21
+ hit.face === 'side' &&
22
+ hit.side === target.side);
23
+ }
15
24
  const UP = [0, 1, 0];
16
25
  const X_AXIS = [1, 0, 0];
17
26
  const Z_AXIS = [0, 0, 1];
@@ -347,6 +356,7 @@ export function useDistributionRunTool(config) {
347
356
  const refreshCursorRef = useRef(() => { });
348
357
  const lastClientYRef = useRef(null);
349
358
  const lastResolvedRef = useRef(null);
359
+ const lockedWallTargetRef = useRef(null);
350
360
  const forcedDirectionRef = useRef(null);
351
361
  const hoveredDirectionRef = useRef(null);
352
362
  const lengthInputRef = useRef('');
@@ -409,17 +419,29 @@ export function useDistributionRunTool(config) {
409
419
  const hit = surfacePointFromEvent(event, adapter.levelId);
410
420
  const currentStart = startRef.current;
411
421
  const previous = lastResolvedRef.current;
412
- // A wall is only an attachment candidate, not a constraint for the
413
- // whole run. Once the ray leaves the wall, continue on a horizontal
414
- // plane through the start point so the user can route freely at the
415
- // same elevation (or use angle lock for a deliberate diagonal).
416
- const working = !event.surfaceHit && previous?.surfaceTarget?.kind === 'wall' && currentStart
417
- ? createRunSurfaceFrame(currentStart, UP)
418
- : (previous?.frame ?? (currentStart ? createRunSurfaceFrame(currentStart) : null));
422
+ const lockedWallTarget = currentStart ? lockedWallTargetRef.current : null;
423
+ const lockedWallHit = lockedWallTarget && isSameRunWallSurface(lockedWallTarget, event.surfaceHit);
424
+ const working = lockedWallTarget
425
+ ? {
426
+ ...lockedWallTarget.frame,
427
+ origin: lockedWallTarget.frame.origin.map((value, index) => value +
428
+ lockedWallTarget.frame.normal[index] *
429
+ (adapter.surfaceClearance?.(lockedWallTarget) ?? 0)),
430
+ }
431
+ : !event.surfaceHit && previous?.surfaceTarget?.kind === 'wall' && currentStart
432
+ ? createRunSurfaceFrame(currentStart, UP)
433
+ : (previous?.frame ?? (currentStart ? createRunSurfaceFrame(currentStart) : null));
419
434
  const hasSurface = !!event.surfaceHit || !working || !event.localRay;
420
- const target = hasSurface ? hit.target : null;
435
+ const target = lockedWallTarget ?? (hasSurface ? hit.target : null);
436
+ const hitForCursor = lockedWallTarget
437
+ ? lockedWallHit
438
+ ? { point: hit.point, frame: lockedWallTarget.frame }
439
+ : null
440
+ : hasSurface
441
+ ? { point: hit.point, frame: hit.frame }
442
+ : null;
421
443
  const resolved = resolveRunCursorPlane({
422
- hit: hasSurface ? { point: hit.point, frame: hit.frame } : null,
444
+ hit: hitForCursor,
423
445
  working,
424
446
  ray: event.localRay,
425
447
  fallback: previous?.point ?? currentStart ?? hit.point,
@@ -592,7 +614,7 @@ export function useDistributionRunTool(config) {
592
614
  resolved = {
593
615
  ...resolved,
594
616
  frame: { ...lastResolvedRef.current.frame, origin: resolved.point },
595
- surfaceTarget: null,
617
+ surfaceTarget: lockedWallTargetRef.current,
596
618
  };
597
619
  lastResolvedRef.current = resolved;
598
620
  const currentStart = startRef.current;
@@ -654,6 +676,24 @@ export function useDistributionRunTool(config) {
654
676
  setValidationMessage('Fitting clearance is too small for this connection');
655
677
  return;
656
678
  }
679
+ const lockedWallTarget = lockedWallTargetRef.current;
680
+ if (lockedWallTarget) {
681
+ const offset = result.nextStart.map((value, index) => value - lockedWallTarget.frame.origin[index]);
682
+ const clearance = configRef.current.surfaceClearance?.(lockedWallTarget) ?? 0;
683
+ if (Math.abs(dotRun(offset, lockedWallTarget.frame.normal) - clearance) > 1e-4) {
684
+ lockedWallTargetRef.current = null;
685
+ lastResolvedRef.current = {
686
+ point: result.nextStart,
687
+ frame: createRunSurfaceFrame(result.nextStart),
688
+ surfaceTarget: null,
689
+ snapped: null,
690
+ directionMode: 'free',
691
+ port: null,
692
+ body: null,
693
+ };
694
+ clearPlacementSurface();
695
+ }
696
+ }
657
697
  triggerSFX('sfx:item-place');
658
698
  startRef.current = result.nextStart;
659
699
  setStart(result.nextStart);
@@ -706,11 +746,14 @@ export function useDistributionRunTool(config) {
706
746
  const resolved = applyTypedLength(resolvePoint(event));
707
747
  updateCursor(resolved);
708
748
  if (!currentStart) {
709
- triggerSFX('sfx:grid-snap');
710
749
  const connection = {
711
750
  port: resolved.port,
712
751
  body: resolved.port ? null : resolved.body,
713
752
  };
753
+ if (shouldLockRunWallSurface(resolved.surfaceTarget, connection)) {
754
+ lockedWallTargetRef.current = resolved.surfaceTarget;
755
+ }
756
+ triggerSFX('sfx:grid-snap');
714
757
  startConnectionRef.current = connection;
715
758
  configRef.current.inheritFromConnection?.(connection);
716
759
  startRef.current = resolved.point;
@@ -805,6 +848,7 @@ export function useDistributionRunTool(config) {
805
848
  setDirectionMode('free');
806
849
  };
807
850
  const onCancel = () => {
851
+ lockedWallTargetRef.current = null;
808
852
  clearDrawAlignment();
809
853
  if (!startRef.current)
810
854
  return;
@@ -857,6 +901,7 @@ export function useDistributionRunTool(config) {
857
901
  window.removeEventListener('keyup', onKeyUp);
858
902
  altAnchorRef.current = null;
859
903
  lastPointerRef.current = null;
904
+ lockedWallTargetRef.current = null;
860
905
  refreshCursorRef.current = () => { };
861
906
  clearPlacementSurface();
862
907
  clearDrawAlignment();
@@ -27,10 +27,4 @@ export declare function DraftAngleArc({ arc, color }: {
27
27
  arc: DraftAngleLabel['arc'];
28
28
  color: string;
29
29
  }): import("react").JSX.Element;
30
- export declare function DraftMeasurementLabel({ color, label, position, shadowColor, }: {
31
- color: string;
32
- label: string;
33
- position: [number, number, number];
34
- shadowColor: string;
35
- }): import("react").JSX.Element;
36
30
  //# sourceMappingURL=draft-axis-guides.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"draft-axis-guides.d.ts","sourceRoot":"","sources":["../../src/shared/draft-axis-guides.tsx"],"names":[],"mappings":"AAAA,OAAO,EAML,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AA6B3B,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,GAAG,EAAE;QACH,MAAM,EAAE,aAAa,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,CAAC,EAAE,MAAM,CAAA;KACV,CAAA;CACF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,SAAS,EAAE,aAAa,GAAG,IAAI,CAAA;IAC/B,CAAC,EAAE,MAAM,CAAA;IACT,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CACnC,GAAG,IAAI,CAAA;AAeR,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,EAClB,CAAC,EAAE,MAAM,GACR,eAAe,GAAG,IAAI,CAyCxB;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,gBAAgB,GACjB,EAAE;IACD,KAAK,EAAE,mBAAmB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;CACzB,sCA2CA;AAoBD,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAkC3F;AAED,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,KAAK,EACL,QAAQ,EACR,WAAW,GACZ,EAAE;IACD,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,WAAW,EAAE,MAAM,CAAA;CACpB,+BAmBA"}
1
+ {"version":3,"file":"draft-axis-guides.d.ts","sourceRoot":"","sources":["../../src/shared/draft-axis-guides.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAA;AA4B3B,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;IAClC,GAAG,EAAE;QACH,MAAM,EAAE,aAAa,CAAA;QACrB,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,QAAQ,EAAE,MAAM,CAAA;QAChB,CAAC,EAAE,MAAM,CAAA;KACV,CAAA;CACF,CAAA;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,aAAa,CAAA;IACrB,SAAS,EAAE,aAAa,GAAG,IAAI,CAAA;IAC/B,CAAC,EAAE,MAAM,CAAA;IACT,UAAU,EAAE,eAAe,GAAG,IAAI,CAAA;CACnC,GAAG,IAAI,CAAA;AAeR,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,aAAa,EACpB,GAAG,EAAE,aAAa,EAClB,CAAC,EAAE,MAAM,GACR,eAAe,GAAG,IAAI,CAyCxB;AAED,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,gBAAgB,GACjB,EAAE;IACD,KAAK,EAAE,mBAAmB,CAAA;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,gBAAgB,EAAE,MAAM,CAAA;CACzB,sCA2CA;AAoBD,wBAAgB,aAAa,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;IAAE,GAAG,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,+BAkC3F"}
@@ -1,6 +1,5 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
- import { EDITOR_LAYER, formatAngleRadians, getAngleArcToSegmentReference, getAngleToSegmentReference, } from '@pascal-app/editor';
3
- import { Html } from '@react-three/drei';
2
+ import { DraftMeasurementLabel, EDITOR_LAYER, formatAngleRadians, getAngleArcToSegmentReference, getAngleToSegmentReference, } from '@pascal-app/editor';
4
3
  import { useMemo } from 'react';
5
4
  import { BufferGeometry, Vector3 } from 'three';
6
5
  /**
@@ -99,9 +98,3 @@ export function DraftAngleArc({ arc, color }) {
99
98
  }, [arc]);
100
99
  return (_jsx("line", { frustumCulled: false, geometry: geometry, layers: EDITOR_LAYER, renderOrder: 2, children: _jsx("lineBasicNodeMaterial", { color: color, depthTest: false, depthWrite: false, linewidth: 2, opacity: 0.95, transparent: true }) }));
101
100
  }
102
- export function DraftMeasurementLabel({ color, label, position, shadowColor, }) {
103
- return (_jsx(Html, { center: true, position: position, style: { pointerEvents: 'none', userSelect: 'none' }, zIndexRange: [100, 0], children: _jsx("div", { className: "whitespace-nowrap font-bold font-mono text-[15px]", style: {
104
- color,
105
- textShadow: `-1.5px -1.5px 0 ${shadowColor}, 1.5px -1.5px 0 ${shadowColor}, -1.5px 1.5px 0 ${shadowColor}, 1.5px 1.5px 0 ${shadowColor}, 0 0 4px ${shadowColor}, 0 0 4px ${shadowColor}`,
106
- }, children: label }) }));
107
- }
@@ -0,0 +1,12 @@
1
+ import { type AnyNode, type AnyNodeId, type HandleDescriptor, type SceneApi } from '@pascal-app/core';
2
+ export type HostedEditPolicy = {
3
+ host: (node: AnyNode) => boolean;
4
+ child: (node: AnyNode) => boolean;
5
+ };
6
+ type Nodes = Record<AnyNodeId, AnyNode>;
7
+ export type HostedUpdate = readonly [AnyNodeId, Partial<AnyNode>];
8
+ export declare function hostedChildUpdates(before: Nodes, after: Nodes, policy: HostedEditPolicy): HostedUpdate[] | null;
9
+ export declare function planHostedEdit(sceneApi: SceneApi, apply: (staged: SceneApi) => void, policy: HostedEditPolicy): HostedUpdate[] | null;
10
+ export declare function withHostedChildren<N extends AnyNode>(descriptor: HandleDescriptor<N>, policy: HostedEditPolicy): HandleDescriptor<N>;
11
+ export {};
12
+ //# sourceMappingURL=hosted-resize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-resize.d.ts","sourceRoot":"","sources":["../../src/shared/hosted-resize.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,SAAS,EAGd,KAAK,gBAAgB,EAGrB,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AAGzB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;IAChC,KAAK,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,CAAA;CAClC,CAAA;AAED,KAAK,KAAK,GAAG,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AACvC,MAAM,MAAM,YAAY,GAAG,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAA;AASjE,wBAAgB,kBAAkB,CAChC,MAAM,EAAE,KAAK,EACb,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,gBAAgB,GACvB,YAAY,EAAE,GAAG,IAAI,CA4EvB;AAED,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,CAAC,MAAM,EAAE,QAAQ,KAAK,IAAI,EACjC,MAAM,EAAE,gBAAgB,GACvB,YAAY,EAAE,GAAG,IAAI,CA8BvB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,OAAO,EAClD,UAAU,EAAE,gBAAgB,CAAC,CAAC,CAAC,EAC/B,MAAM,EAAE,gBAAgB,GACvB,gBAAgB,CAAC,CAAC,CAAC,CA6DrB"}
@@ -0,0 +1,166 @@
1
+ import { getScaledDimensions, getSurfaceProvider, nodeRegistry, surfaceRegionContainsFootprint, } from '@pascal-app/core';
2
+ import { boundsOf, boxCorners, frame, transformPoint } from '@pascal-app/core/procedural-items';
3
+ function surfaceScene(nodes) {
4
+ return {
5
+ nodes: () => nodes,
6
+ get: (id) => nodes[id],
7
+ };
8
+ }
9
+ export function hostedChildUpdates(before, after, policy) {
10
+ const updates = [];
11
+ for (const host of Object.values(before)) {
12
+ if (!policy.host(host))
13
+ continue;
14
+ const children = (host.children ?? [])
15
+ .map((id) => before[id])
16
+ .filter((child) => child?.parentId === host.id && policy.child(child));
17
+ if (!children.length)
18
+ continue;
19
+ const nextHost = after[host.id];
20
+ if (!nextHost || !policy.host(nextHost))
21
+ return null;
22
+ const provider = getSurfaceProvider(host);
23
+ const nextSurfaces = provider.surfaces?.(nextHost, { scene: surfaceScene(after) }) ?? [];
24
+ if (JSON.stringify(provider.surfaces?.(host, { scene: surfaceScene(before) })) ===
25
+ JSON.stringify(nextSurfaces))
26
+ continue;
27
+ for (const child of children) {
28
+ if (!child || !('position' in child) || !('rotation' in child))
29
+ continue;
30
+ const bounds = child.type === 'item'
31
+ ? { size: getScaledDimensions(child), center: undefined }
32
+ : nodeRegistry.get(child.type)?.capabilities.dragBounds?.(child, before);
33
+ if (!bounds)
34
+ continue;
35
+ const center = bounds.center ?? [0, bounds.size[1] / 2, 0];
36
+ const localBounds = {
37
+ min: center.map((v, i) => v - bounds.size[i] / 2),
38
+ max: center.map((v, i) => v + bounds.size[i] / 2),
39
+ };
40
+ const position = child.position;
41
+ const rotation = (typeof child.rotation === 'number' ? [0, child.rotation, 0] : child.rotation);
42
+ const projected = boundsOf(boxCorners(localBounds.min, localBounds.max).map((p) => transformPoint(frame(position, rotation), p)));
43
+ const hit = {
44
+ point: [
45
+ (projected.min[0] + projected.max[0]) / 2,
46
+ projected.min[1],
47
+ (projected.min[2] + projected.max[2]) / 2,
48
+ ],
49
+ normalWorldY: 1,
50
+ };
51
+ const previousSurface = provider.resolveHit(host, hit, { scene: surfaceScene(before) });
52
+ if (!previousSurface || Math.abs(previousSurface.position[1] - projected.min[1]) > 1e-5)
53
+ continue;
54
+ const nextSurface = nextSurfaces.find((surface) => surface.id === previousSurface.id);
55
+ if (!nextSurface)
56
+ return null;
57
+ const nextPosition = [
58
+ position[0],
59
+ position[1] + nextSurface.position[1] - previousSurface.position[1],
60
+ position[2],
61
+ ];
62
+ const surfaceLocal = [
63
+ nextPosition[0] - nextSurface.position[0],
64
+ nextPosition[1] - nextSurface.position[1],
65
+ nextPosition[2] - nextSurface.position[2],
66
+ ];
67
+ if (!surfaceRegionContainsFootprint(nextSurface.region, surfaceLocal, bounds.size, rotation, localBounds))
68
+ return null;
69
+ if (Math.abs(nextPosition[1] - position[1]) > 1e-8)
70
+ updates.push([child.id, { position: nextPosition }]);
71
+ }
72
+ }
73
+ return updates;
74
+ }
75
+ export function planHostedEdit(sceneApi, apply, policy) {
76
+ const before = sceneApi.nodes();
77
+ const after = { ...before };
78
+ const updates = new Map();
79
+ let supported = true;
80
+ const staged = {
81
+ ...sceneApi,
82
+ ...surfaceScene(after),
83
+ update(id, data) {
84
+ if (!after[id])
85
+ return;
86
+ after[id] = { ...after[id], ...data };
87
+ updates.set(id, { ...updates.get(id), ...data });
88
+ },
89
+ upsert(node) {
90
+ supported = false;
91
+ return node.id;
92
+ },
93
+ delete() {
94
+ supported = false;
95
+ },
96
+ markDirty() { },
97
+ pauseHistory() { },
98
+ resumeHistory() { },
99
+ };
100
+ apply(staged);
101
+ if (!supported)
102
+ return null;
103
+ const children = hostedChildUpdates(before, after, policy);
104
+ if (!children)
105
+ return null;
106
+ for (const [id, data] of children)
107
+ updates.set(id, data);
108
+ return [...updates];
109
+ }
110
+ export function withHostedChildren(descriptor, policy) {
111
+ if (descriptor.kind === 'radial-resize')
112
+ return {
113
+ ...descriptor,
114
+ apply(node, value, scene) {
115
+ const patch = descriptor.apply(node, value, scene);
116
+ if (planHostedEdit(scene, (staged) => staged.update(node.id, patch), policy))
117
+ return patch;
118
+ return Object.fromEntries(Object.keys(patch).map((key) => [key, node[key]]));
119
+ },
120
+ };
121
+ if (descriptor.kind !== 'linear-resize')
122
+ return descriptor;
123
+ const plan = (node, patch, sceneApi, modifiers) => planHostedEdit(sceneApi, (staged) => {
124
+ if (descriptor.commit)
125
+ descriptor.commit(node, patch, staged, modifiers);
126
+ else
127
+ staged.update(descriptor.overrideTarget?.(node, staged) ?? node.id, patch);
128
+ }, policy);
129
+ const hasHostedChildren = (scene) => Object.values(scene?.nodes() ?? {}).some((node) => policy.host(node) &&
130
+ (node.children ?? []).some((id) => {
131
+ const child = scene.get(id);
132
+ return child && policy.child(child);
133
+ }));
134
+ return {
135
+ ...descriptor,
136
+ apply(node, value, sceneApi, modifiers) {
137
+ const patch = descriptor.apply(node, value, sceneApi, modifiers);
138
+ if (!hasHostedChildren(sceneApi) || plan(node, patch, sceneApi, modifiers))
139
+ return patch;
140
+ const target = sceneApi.get(descriptor.overrideTarget?.(node, sceneApi) ?? node.id) ?? node;
141
+ return Object.fromEntries(Object.keys(patch).map((key) => [key, target[key]]));
142
+ },
143
+ previewOverrides(node, value, sceneApi, modifiers) {
144
+ if (!hasHostedChildren(sceneApi))
145
+ return descriptor.previewOverrides?.(node, value, sceneApi, modifiers) ?? [];
146
+ const patch = descriptor.apply(node, value, sceneApi, modifiers);
147
+ return plan(node, patch, sceneApi, modifiers) ?? [];
148
+ },
149
+ commit(node, patch, sceneApi, modifiers) {
150
+ if (!hasHostedChildren(sceneApi)) {
151
+ if (descriptor.commit)
152
+ descriptor.commit(node, patch, sceneApi, modifiers);
153
+ else
154
+ sceneApi.update(descriptor.overrideTarget?.(node, sceneApi) ?? node.id, patch);
155
+ return;
156
+ }
157
+ const updates = plan(node, patch, sceneApi, modifiers);
158
+ if (!updates)
159
+ return;
160
+ for (const [id, data] of updates) {
161
+ sceneApi.update(id, data);
162
+ sceneApi.markDirty(id);
163
+ }
164
+ },
165
+ };
166
+ }
@@ -0,0 +1,8 @@
1
+ export declare function shouldFollowOpeningGrid(args: {
2
+ eventTime: number;
3
+ hasActiveHost: boolean;
4
+ lastHostEventTime: number;
5
+ pointerType?: string;
6
+ }): boolean;
7
+ export declare function shouldHandleOpeningHostLeave(nativeEvent: unknown): boolean;
8
+ //# sourceMappingURL=opening-grid-follow.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-grid-follow.d.ts","sourceRoot":"","sources":["../../src/shared/opening-grid-follow.ts"],"names":[],"mappings":"AAAA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,EAAE,OAAO,CAAA;IACtB,iBAAiB,EAAE,MAAM,CAAA;IACzB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GAAG,OAAO,CAGV;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,OAAO,GAAG,OAAO,CAS1E"}
@@ -0,0 +1,12 @@
1
+ export function shouldFollowOpeningGrid(args) {
2
+ if (args.pointerType === 'xr' && args.hasActiveHost)
3
+ return false;
4
+ return args.eventTime !== args.lastHostEventTime;
5
+ }
6
+ export function shouldHandleOpeningHostLeave(nativeEvent) {
7
+ if (!nativeEvent || typeof nativeEvent !== 'object')
8
+ return true;
9
+ const event = nativeEvent;
10
+ const isSpatialPointer = event.inputSource != null || event.pointerState?.inputSource != null;
11
+ return !isSpatialPointer || event.openingHoverBridge === true;
12
+ }
@@ -0,0 +1,3 @@
1
+ import type { OpeningPropertyPreviewDependencies } from './opening-property-preview';
2
+ export declare const openingPropertyPreviewHost: OpeningPropertyPreviewDependencies;
3
+ //# sourceMappingURL=opening-property-preview-host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-property-preview-host.d.ts","sourceRoot":"","sources":["../../src/shared/opening-property-preview-host.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kCAAkC,EAAE,MAAM,4BAA4B,CAAA;AAEpF,eAAO,MAAM,0BAA0B,EAAE,kCAiBxC,CAAA"}
@@ -0,0 +1,21 @@
1
+ import { useLiveNodeOverrides, useScene } from '@pascal-app/core';
2
+ export const openingPropertyPreviewHost = {
3
+ nodes: () => useScene.getState().nodes,
4
+ override: (id) => useLiveNodeOverrides.getState().get(id),
5
+ setOverride: (id, patch) => useLiveNodeOverrides.getState().set(id, patch),
6
+ clearOverrideFields: (id, fields) => useLiveNodeOverrides.getState().clearFields(id, fields),
7
+ markDirty: (id) => useScene.getState().markDirty(id),
8
+ updateNode: (id, patch) => useScene.getState().updateNode(id, patch),
9
+ scheduleFrame: (callback) => {
10
+ if (typeof requestAnimationFrame === 'function')
11
+ return requestAnimationFrame(callback);
12
+ callback(0);
13
+ return 0;
14
+ },
15
+ cancelFrame: (handle) => {
16
+ if (typeof cancelAnimationFrame === 'function')
17
+ cancelAnimationFrame(handle);
18
+ },
19
+ scheduleDelay: (callback, delay) => setTimeout(callback, delay),
20
+ cancelDelay: (handle) => clearTimeout(handle),
21
+ };
@@ -0,0 +1,19 @@
1
+ import type { AnyNode, AnyNodeId, DoorNode, WindowNode } from '@pascal-app/core';
2
+ export type OpeningPropertyPreviewDependencies = {
3
+ nodes: () => Readonly<Record<AnyNodeId, AnyNode>>;
4
+ override: (id: AnyNodeId) => Partial<AnyNode> | undefined;
5
+ setOverride: (id: AnyNodeId, patch: Partial<AnyNode>) => void;
6
+ clearOverrideFields: (id: AnyNodeId, fields: string[]) => void;
7
+ markDirty: (id: AnyNodeId) => void;
8
+ updateNode: (id: AnyNodeId, patch: Partial<AnyNode>) => void;
9
+ scheduleFrame: (callback: FrameRequestCallback) => number;
10
+ cancelFrame: (handle: number) => void;
11
+ scheduleDelay: (callback: () => void, delay: number) => number;
12
+ cancelDelay: (handle: number) => void;
13
+ };
14
+ export declare function createOpeningPropertyPreview<T extends DoorNode | WindowNode>(id: AnyNodeId, dependencies: OpeningPropertyPreviewDependencies): {
15
+ preview(patch: Partial<T>): void;
16
+ commit(patch?: Partial<T>): void;
17
+ cancel: () => void;
18
+ };
19
+ //# sourceMappingURL=opening-property-preview.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opening-property-preview.d.ts","sourceRoot":"","sources":["../../src/shared/opening-property-preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAGhF,MAAM,MAAM,kCAAkC,GAAG;IAC/C,KAAK,EAAE,MAAM,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAA;IACjD,QAAQ,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,SAAS,CAAA;IACzD,WAAW,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC7D,mBAAmB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,IAAI,CAAA;IAC9D,SAAS,EAAE,CAAC,EAAE,EAAE,SAAS,KAAK,IAAI,CAAA;IAClC,UAAU,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,CAAA;IAC5D,aAAa,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,MAAM,CAAA;IACzD,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACrC,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,CAAA;IAC9D,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;CACtC,CAAA;AAID,wBAAgB,4BAA4B,CAAC,CAAC,SAAS,QAAQ,GAAG,UAAU,EAC1E,EAAE,EAAE,SAAS,EACb,YAAY,EAAE,kCAAkC;mBAsD/B,OAAO,CAAC,CAAC,CAAC;mBAcV,OAAO,CAAC,CAAC,CAAC;;EAyB5B"}
@@ -0,0 +1,99 @@
1
+ import { constrainCurtainOpening } from './curtain-opening-limits';
2
+ const CURTAIN_PARENT_PREVIEW_INTERVAL_MS = 100;
3
+ export function createOpeningPropertyPreview(id, dependencies) {
4
+ let pending;
5
+ let dirtyFrame;
6
+ let parentDelay;
7
+ const parent = () => {
8
+ const parentId = dependencies.nodes()[id]?.parentId;
9
+ return parentId ? dependencies.nodes()[parentId] : undefined;
10
+ };
11
+ const dirtyOpening = () => {
12
+ dependencies.markDirty(id);
13
+ };
14
+ const dirtyParent = () => {
15
+ const parentId = dependencies.nodes()[id]?.parentId;
16
+ if (parentId)
17
+ dependencies.markDirty(parentId);
18
+ };
19
+ const cancelScheduledDirty = () => {
20
+ if (dirtyFrame === undefined)
21
+ return;
22
+ dependencies.cancelFrame(dirtyFrame);
23
+ dirtyFrame = undefined;
24
+ };
25
+ const scheduleDirty = () => {
26
+ if (dirtyFrame !== undefined)
27
+ return;
28
+ let completedSynchronously = false;
29
+ const handle = dependencies.scheduleFrame(() => {
30
+ completedSynchronously = true;
31
+ dirtyFrame = undefined;
32
+ dirtyOpening();
33
+ const parentNode = parent();
34
+ if (parentNode?.type !== 'wall' || parentNode.wallType !== 'curtain') {
35
+ dirtyParent();
36
+ return;
37
+ }
38
+ if (parentDelay !== undefined)
39
+ return;
40
+ parentDelay = dependencies.scheduleDelay(() => {
41
+ parentDelay = undefined;
42
+ dirtyParent();
43
+ }, CURTAIN_PARENT_PREVIEW_INTERVAL_MS);
44
+ });
45
+ if (!completedSynchronously)
46
+ dirtyFrame = handle;
47
+ };
48
+ const clear = () => {
49
+ if (!pending)
50
+ return;
51
+ cancelScheduledDirty();
52
+ if (parentDelay !== undefined) {
53
+ dependencies.cancelDelay(parentDelay);
54
+ parentDelay = undefined;
55
+ }
56
+ dependencies.clearOverrideFields(id, [...Object.keys(pending), 'metadata']);
57
+ pending = undefined;
58
+ dirtyOpening();
59
+ dirtyParent();
60
+ };
61
+ return {
62
+ preview(patch) {
63
+ const nodes = dependencies.nodes();
64
+ const node = nodes[id];
65
+ if (node?.type !== 'door' && node?.type !== 'window')
66
+ return;
67
+ const live = dependencies.override(id);
68
+ const effective = live ? { ...node, ...live } : node;
69
+ patch = constrainCurtainOpening(effective, patch, nodes);
70
+ pending = { ...pending, ...patch };
71
+ dependencies.setOverride(id, {
72
+ ...patch,
73
+ metadata: { ...node.metadata, ...effective.metadata, deferParentRebuild: true },
74
+ });
75
+ scheduleDirty();
76
+ },
77
+ commit(patch) {
78
+ const live = dependencies.override(id);
79
+ if (pending && !Object.keys(pending).some((key) => live && key in live)) {
80
+ clear();
81
+ return;
82
+ }
83
+ const current = pending && live
84
+ ? Object.fromEntries(Object.keys(pending)
85
+ .filter((key) => key in live)
86
+ .map((key) => [key, live[key]]))
87
+ : undefined;
88
+ const nodes = dependencies.nodes();
89
+ const node = nodes[id];
90
+ const updates = node?.type === 'door' || node?.type === 'window'
91
+ ? constrainCurtainOpening(node, { ...current, ...patch }, nodes)
92
+ : {};
93
+ if (Object.keys(updates).length)
94
+ dependencies.updateNode(id, updates);
95
+ clear();
96
+ },
97
+ cancel: clear,
98
+ };
99
+ }
@@ -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"}