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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +67 -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 +9 -1
  138. package/dist/fence/lift.d.ts +15 -0
  139. package/dist/fence/lift.d.ts.map +1 -0
  140. package/dist/fence/lift.js +23 -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 +41 -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
@@ -0,0 +1,7 @@
1
+ import { buildWallHostedOpeningContextualDimensions } from '../wall/contextual-dimensions';
2
+ export function buildWindowContextualDimensions(node, ctx) {
3
+ return buildWallHostedOpeningContextualDimensions(node, ctx, {
4
+ showClearancesWhileMoving: true,
5
+ useExteriorNormal: true,
6
+ });
7
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/window/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,kBAAkB,CAAA;AAUzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAwIrC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CA6F9D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/window/definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,cAAc,EAIf,MAAM,kBAAkB,CAAA;AAiBzB,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAkIrC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,gBAAgB,EAAE,cAAc,CAAC,OAAO,UAAU,CAqG9D,CAAA"}
@@ -1,7 +1,10 @@
1
+ import { buildWindowFloorplanSchedule, computeWindowFloorplanLevelData, } from '../shared/opening-documentation';
1
2
  import { publishOpeningResizeGuides } from '../shared/opening-guides-runtime';
2
3
  import { readRoofFaceHeightMax, readRoofFaceWidthMax } from '../shared/roof-opening-host';
3
4
  import { buildRoofWallOpeningCut } from '../shared/roof-wall-opening-cut';
5
+ import { readHostWallCeiling } from '../shared/wall-opening-ceiling';
4
6
  import { wallFloorplanSiblingOverrides } from '../wall/floorplan-overrides';
7
+ import { buildWindowContextualDimensions } from './contextual-dimensions';
5
8
  import { buildWindowFloorplan } from './floorplan';
6
9
  import { windowWidthAffordance } from './floorplan-affordances';
7
10
  import { windowFloorplanMoveTarget } from './floorplan-move';
@@ -24,12 +27,6 @@ function readWallLength(w, scene) {
24
27
  return Number.POSITIVE_INFINITY;
25
28
  return Math.hypot(wall.end[0] - wall.start[0], wall.end[1] - wall.start[1]);
26
29
  }
27
- function readWallHeight(w, scene) {
28
- if (!w.wallId)
29
- return Number.POSITIVE_INFINITY;
30
- const wall = scene.get(w.wallId);
31
- return wall?.height ?? Number.POSITIVE_INFINITY;
32
- }
33
30
  function windowWidthHandle(side) {
34
31
  const sign = side === 'right' ? 1 : -1;
35
32
  return {
@@ -88,9 +85,9 @@ function windowHeightHandle(edge) {
88
85
  if (roofMax !== null)
89
86
  return Math.max(MIN_WINDOW_HEIGHT, roofMax);
90
87
  // Maximum: distance from the anchored edge to the wall's allowed Y
91
- // bounds. Top arrow caps at wall.height - bottom; bottom arrow caps
92
- // at top (positive Y room above the floor).
93
- const wallH = readWallHeight(n, scene);
88
+ // bounds. Top arrow caps at the wall's resolved ceiling - bottom;
89
+ // bottom arrow caps at top (positive Y room above the floor).
90
+ const wallH = readHostWallCeiling(n.wallId, scene);
94
91
  const anchored = edge === 'top' ? n.position[1] - n.height / 2 : n.position[1] + n.height / 2;
95
92
  return edge === 'top'
96
93
  ? Math.max(MIN_WINDOW_HEIGHT, wallH - anchored)
@@ -154,9 +151,15 @@ export const windowDefinition = {
154
151
  kind: 'window',
155
152
  snapProfile: 'item',
156
153
  facingIndicator: true,
157
- schemaVersion: 1,
154
+ schemaVersion: 2,
158
155
  schema: WindowNode,
159
156
  category: 'structure',
157
+ extensions: {
158
+ 'pascal:editor/floorplan': {
159
+ contextualDimensions: buildWindowContextualDimensions,
160
+ schedule: buildWindowFloorplanSchedule,
161
+ },
162
+ },
160
163
  // Same schema-driven defaults trick as door: parse a stub, strip
161
164
  // id/type. Window also has many fields with zod `.default()` set.
162
165
  defaults: () => {
@@ -191,6 +194,7 @@ export const windowDefinition = {
191
194
  kind: 'parametric',
192
195
  module: () => import('./renderer'),
193
196
  },
197
+ preview: () => import('./preview'),
194
198
  system: {
195
199
  module: () => import('./system'),
196
200
  priority: 3,
@@ -198,6 +202,7 @@ export const windowDefinition = {
198
202
  // Stage C: floor-plan polygon. ctx.parent gives the wall for direction
199
203
  // + thickness — same shape as door.
200
204
  floorplan: buildWindowFloorplan,
205
+ computeFloorplanLevelData: computeWindowFloorplanLevelData,
201
206
  floorplanDependsOnSiblings: true,
202
207
  // Opening symbols position from `ctx.parent` (the host wall); merge the
203
208
  // walls' live drag overrides so the symbol tracks a wall / group drag in
@@ -12,11 +12,8 @@ import { type FloorplanAffordance, type WindowNode } from '@pascal-app/core';
12
12
  * - `'end'`: arrow at the edge closer to `wall.end`. The wall-start
13
13
  * edge stays fixed.
14
14
  *
15
- * Uses the scene-write preview pattern (writes directly to `useScene`
16
- * each tick): the registry layer's `effectiveNode` only merges live
17
- * overrides for walls, so an override-based preview wouldn't show on
18
- * windows. The dispatcher snapshots / pauses history at start, so
19
- * per-tick scene writes still collapse to one undoable entry on commit.
15
+ * Preview state stays in the live override store so the scene graph is
16
+ * written only once, when the drag commits.
20
17
  */
21
18
  export declare const windowWidthAffordance: FloorplanAffordance<WindowNode>;
22
19
  //# sourceMappingURL=floorplan-affordances.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAIxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAMzB;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAAmB,CAAC,UAAU,CAwEjE,CAAA"}
1
+ {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAKxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAMzB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAAmB,CAAC,UAAU,CAqEjE,CAAA"}
@@ -1,4 +1,4 @@
1
- import { useScene, } from '@pascal-app/core';
1
+ import { useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
2
  const MIN_WINDOW_WIDTH = 0.3;
3
3
  /**
4
4
  * 2D drag affordance for the window's width side-arrows. Sister to the 3D
@@ -13,11 +13,8 @@ const MIN_WINDOW_WIDTH = 0.3;
13
13
  * - `'end'`: arrow at the edge closer to `wall.end`. The wall-start
14
14
  * edge stays fixed.
15
15
  *
16
- * Uses the scene-write preview pattern (writes directly to `useScene`
17
- * each tick): the registry layer's `effectiveNode` only merges live
18
- * overrides for walls, so an override-based preview wouldn't show on
19
- * windows. The dispatcher snapshots / pauses history at start, so
20
- * per-tick scene writes still collapse to one undoable entry on commit.
16
+ * Preview state stays in the live override store so the scene graph is
17
+ * written only once, when the drag commits.
21
18
  */
22
19
  export const windowWidthAffordance = {
23
20
  start({ node, payload, nodes, initialPlanPoint }) {
@@ -53,20 +50,17 @@ export const windowWidthAffordance = {
53
50
  const newWindowX = anchorX + growDir * (newWidth / 2);
54
51
  lastWidth = newWidth;
55
52
  lastWindowX = newWindowX;
56
- useScene.getState().updateNodes([
57
- {
58
- id: windowId,
59
- data: {
60
- width: newWidth,
61
- position: [newWindowX, initialWindowY, initialWindowZ],
62
- },
63
- },
64
- ]);
53
+ useLiveNodeOverrides.getState().set(windowId, {
54
+ width: newWidth,
55
+ position: [newWindowX, initialWindowY, initialWindowZ],
56
+ });
57
+ useScene.getState().markDirty(windowId);
65
58
  },
66
59
  canCommit() {
67
60
  return true;
68
61
  },
69
62
  commit() {
63
+ useLiveNodeOverrides.getState().clear(windowId);
70
64
  useScene.getState().updateNodes([
71
65
  {
72
66
  id: windowId,
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAOxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,UAAU,CAgPrE,CAAA"}
1
+ {"version":3,"file":"floorplan-move.d.ts","sourceRoot":"","sources":["../../src/window/floorplan-move.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAOxB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AAmBzB;;;;;;;;;;GAUG;AAEH,eAAO,MAAM,yBAAyB,EAAE,mBAAmB,CAAC,UAAU,CAiPrE,CAAA"}
@@ -152,7 +152,7 @@ export const windowFloorplanMoveTarget = ({ node }) => {
152
152
  nodes,
153
153
  });
154
154
  const snappedLocalX = neighborX ?? snapToHalf(hit.localX);
155
- const { clampedX, clampedY } = clampToWall(hit.wall, snappedLocalX, startLocalY, node.width, node.height);
155
+ const { clampedX, clampedY } = clampToWall(hit.wall, snappedLocalX, startLocalY, node.width, node.height, nodes);
156
156
  // One click per real position step, keyed on the SNAPPED along-wall value
157
157
  // so it ticks only when the window actually moves to a new cell.
158
158
  tickGridStep(clampedX);
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/window/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEf,UAAU,EACX,MAAM,kBAAkB,CAAA;AAGzB;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAmJ1B"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/window/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EAEf,UAAU,EACX,MAAM,kBAAkB,CAAA;AAQzB;;;;;;;;;;;;GAYG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CA4J1B"}
@@ -1,3 +1,5 @@
1
+ import { floorplanGeometryMetadata, readFloorplanContext } from '@pascal-app/editor';
2
+ import { buildOpeningMarkAnnotation, } from '../shared/opening-documentation';
1
3
  import { buildOpeningPlacementDimensions } from '../shared/opening-placement-dimensions';
2
4
  /**
3
5
  * Stage C floor-plan builder for window. Mirrors the legacy
@@ -84,6 +86,7 @@ export function buildWindowFloorplan(node, ctx) {
84
86
  strokeWidth: showSelectedChrome ? 1.9 : 1.25,
85
87
  vectorEffect: 'non-scaling-stroke',
86
88
  strokeLinejoin: 'round',
89
+ metadata: floorplanGeometryMetadata({ annotationObstacle: 'bounds' }),
87
90
  },
88
91
  // Inset glass-pane outline.
89
92
  {
@@ -142,10 +145,13 @@ export function buildWindowFloorplan(node, ctx) {
142
145
  }
143
146
  // Placement-measurement dimensions when actively moving — same
144
147
  // contract as door (see `nodes/src/door/floorplan.ts`).
145
- if (view?.moving) {
148
+ if (view?.moving && readFloorplanContext(ctx).automaticDimensions) {
146
149
  for (const dim of buildOpeningPlacementDimensions(node, ctx)) {
147
150
  children.push(dim);
148
151
  }
149
152
  }
153
+ const markAnnotation = buildOpeningMarkAnnotation(node, wall, ctx.levelData, { stroke: showSelectedChrome ? '#f97316' : '#334155' });
154
+ if (markAnnotation)
155
+ children.push(markAnnotation);
150
156
  return { kind: 'group', children };
151
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/window/move-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYL,UAAU,EACX,MAAM,kBAAkB,CAAA;AAqDzB;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CA0/BlD,CAAA;AAED,eAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"move-tool.d.ts","sourceRoot":"","sources":["../../src/window/move-tool.tsx"],"names":[],"mappings":"AAAA,OAAO,EAYL,UAAU,EACX,MAAM,kBAAkB,CAAA;AAqDzB;;;;;;;;;;;GAWG;AACH,QAAA,MAAM,cAAc,EAAE,KAAK,CAAC,EAAE,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,CAigClD,CAAA;AAED,eAAe,cAAc,CAAA"}
@@ -174,7 +174,7 @@ const MoveWindowTool = ({ node: movingWindowNode }) => {
174
174
  const y = movingWindowNode.position[1];
175
175
  return y > 0.1 ? y : DEFAULT_WINDOW_SILL_M + movingWindowNode.height / 2;
176
176
  };
177
- const getSlabElevation = (wallEvent) => spatialGridManager.getSlabElevationForWall(wallEvent.node.parentId ?? '', wallEvent.node.start, wallEvent.node.end);
177
+ const getSlabElevation = (wallEvent) => spatialGridManager.getSlabElevationForWall(wallEvent.node.parentId ?? '', wallEvent.node.start, wallEvent.node.end, wallEvent.node.curveOffset ?? 0, wallEvent.node.thickness, wallEvent.node.supportSlabId);
178
178
  const hideCursor = () => {
179
179
  if (cursorGroupRef.current)
180
180
  cursorGroupRef.current.visible = false;
@@ -256,7 +256,7 @@ const MoveWindowTool = ({ node: movingWindowNode }) => {
256
256
  // component lives in `snapToHalf` (itself mode-aware).
257
257
  applySnap: isMagneticSnapActive(),
258
258
  });
259
- const { clampedX, clampedY } = clampToWall(event.node, localX, targetLocalY, movingWindowNode.width, movingWindowNode.height);
259
+ const { clampedX, clampedY } = clampToWall(event.node, localX, targetLocalY, movingWindowNode.width, movingWindowNode.height, useScene.getState().nodes);
260
260
  const valid = !hasWallChildOverlap(event.node.id, clampedX, clampedY, movingWindowNode.width, movingWindowNode.height, movingWindowNode.id);
261
261
  return {
262
262
  wallNode: event.node,
@@ -838,7 +838,7 @@ const MoveWindowTool = ({ node: movingWindowNode }) => {
838
838
  if (hostWall?.type === 'wall') {
839
839
  const wallAngle = Math.atan2(hostWall.end[1] - hostWall.start[1], hostWall.end[0] - hostWall.start[0]);
840
840
  const ghostYaw = movingWindowNode.rotation[1] - wallAngle;
841
- const seedPos = wallLocalToWorld(hostWall, movingWindowNode.position[0], movingWindowNode.position[1], getLevelYOffset(), spatialGridManager.getSlabElevationForWall(hostWall.parentId ?? '', hostWall.start, hostWall.end));
841
+ const seedPos = wallLocalToWorld(hostWall, movingWindowNode.position[0], movingWindowNode.position[1], getLevelYOffset(), spatialGridManager.getSlabElevationForWall(hostWall.parentId ?? '', hostWall.start, hostWall.end, hostWall.curveOffset ?? 0, hostWall.thickness, hostWall.supportSlabId));
842
842
  publishPlacementSurface(new Vector3(...seedPos), new Vector3(Math.sin(ghostYaw), 0, Math.cos(ghostYaw)));
843
843
  // Claim the pointer for the wall so the floor free-follow stands down for
844
844
  // the first frames after grab. Otherwise the first `grid:move` (the window
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/window/panel.tsx"],"names":[],"mappings":"AA4FA,MAAM,CAAC,OAAO,UAAU,WAAW,uCAw0BlC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/window/panel.tsx"],"names":[],"mappings":"AA6FA,MAAM,CAAC,OAAO,UAAU,WAAW,uCAy1BlC"}
@@ -5,6 +5,7 @@ import { ActionButton, ActionGroup, cn, PanelSection, PanelWrapper, SegmentedCon
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Copy, FlipHorizontal2, Move, Trash2 } from 'lucide-react';
7
7
  import { useCallback, useRef } from 'react';
8
+ import { OpeningDocumentationFields } from '../shared/opening-documentation-fields';
8
9
  function isSameWindowValue(current, next) {
9
10
  if (typeof current === 'number' && typeof next === 'number') {
10
11
  return Math.abs(current - next) < 1e-6;
@@ -153,6 +154,8 @@ export default function WindowPanel() {
153
154
  parentId: node.parentId,
154
155
  width: node.width,
155
156
  height: node.height,
157
+ roughOpeningWidth: node.roughOpeningWidth,
158
+ roughOpeningHeight: node.roughOpeningHeight,
156
159
  windowType: node.windowType,
157
160
  operationState: node.operationState,
158
161
  awningDirection: node.awningDirection,
@@ -314,7 +317,7 @@ export default function WindowPanel() {
314
317
  }), options: [
315
318
  { value: 'window', label: 'Window' },
316
319
  { value: 'opening', label: 'Opening' },
317
- ], value: node.openingKind ?? 'window' }) }), showWindowTypeSection && (_jsxs(PanelSection, { title: "Window Type", children: [_jsx("div", { className: "grid grid-cols-2 gap-2 px-1 pt-1", children: windowTypeOptions.map((option) => {
320
+ ], value: node.openingKind ?? 'window' }) }), _jsx(PanelSection, { title: "Documentation", children: _jsx(OpeningDocumentationFields, { constructionType: node.constructionType, dimensionReference: node.dimensionReference, finishOpeningHeight: node.finishOpeningHeight, finishOpeningWidth: node.finishOpeningWidth, mark: node.mark, masonryOpeningHeight: node.masonryOpeningHeight, masonryOpeningWidth: node.masonryOpeningWidth, onChange: handleUpdate, roughOpeningHeight: node.roughOpeningHeight, roughOpeningWidth: node.roughOpeningWidth }) }), showWindowTypeSection && (_jsxs(PanelSection, { title: "Window Type", children: [_jsx("div", { className: "grid grid-cols-2 gap-2 px-1 pt-1", children: windowTypeOptions.map((option) => {
318
321
  const isSelected = displayedWindowType === option.value;
319
322
  return (_jsx("button", { className: cn('flex min-h-12 items-center rounded-lg border px-3 py-2.5 text-left text-xs transition-colors', isSelected
320
323
  ? 'border-orange-400/60 bg-orange-400/10 text-foreground'
@@ -1,2 +1,2 @@
1
- export { WindowNode } from '@pascal-app/core';
1
+ export { WindowConstructionType, WindowDimensionReference, WindowNode, } from '@pascal-app/core';
2
2
  //# sourceMappingURL=schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/window/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/window/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,UAAU,GACX,MAAM,kBAAkB,CAAA"}
@@ -1 +1 @@
1
- export { WindowNode } from '@pascal-app/core';
1
+ export { WindowConstructionType, WindowDimensionReference, WindowNode, } from '@pascal-app/core';
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/window/tool.tsx"],"names":[],"mappings":"AA6EA;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAuqBvB,CAAA;AAED,eAAe,UAAU,CAAA"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/window/tool.tsx"],"names":[],"mappings":"AAgFA;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EA6uBvB,CAAA;AAED,eAAe,UAAU,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { emitter, isCurvedWall, sceneRegistry, spatialGridManager, useScene, WindowNode, } from '@pascal-app/core';
3
- import { calculateCursorRotation, calculateItemRotation, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isValidWallSideFace, snapToHalf, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, } from '@pascal-app/editor';
2
+ import { emitter, isCurvedWall, sceneRegistry, spatialGridManager, useScene, WallNode as WallNodeSchema, WindowNode, } from '@pascal-app/core';
3
+ import { calculateCursorRotation, calculateItemRotation, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isValidWallSideFace, snapToHalf, 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';
@@ -58,6 +58,36 @@ const WindowTool = () => {
58
58
  const frameDepthRef = useRef(ghostStub.frameDepth);
59
59
  useEffect(() => {
60
60
  useScene.temporal.getState().pause();
61
+ const ownedPreviewIds = new Set();
62
+ const fallbackPreview = WindowNode.parse({
63
+ position: [0, 0, 0],
64
+ rotation: [0, 0, 0],
65
+ side: 'front',
66
+ });
67
+ const fallbackWallId = WallNodeSchema.parse({
68
+ end: [1, 0],
69
+ start: [0, 0],
70
+ thickness: 0.1,
71
+ }).id;
72
+ const publishPlacementPreview = (node, parentNode) => {
73
+ ownedPreviewIds.add(node.id);
74
+ usePlacementPreview.getState().set(node, parentNode);
75
+ };
76
+ const clearPlacementPreview = () => {
77
+ const current = usePlacementPreview.getState().node;
78
+ if (current && ownedPreviewIds.has(current.id))
79
+ usePlacementPreview.getState().clear();
80
+ };
81
+ const publishDraftPreview = (parentNode) => {
82
+ const draft = draftRef.current;
83
+ if (!draft)
84
+ return;
85
+ const live = useScene.getState().nodes[draft.id];
86
+ if (live?.type !== 'window')
87
+ return;
88
+ draftRef.current = live;
89
+ publishPlacementPreview(live, parentNode);
90
+ };
61
91
  let hostKind = null;
62
92
  // timeStamp of the most recent wall/roof mesh event. A wall/roof hover and
63
93
  // the grid raycast from the SAME pointermove share the source DOM event's
@@ -78,16 +108,20 @@ const WindowTool = () => {
78
108
  const id = getLevelId();
79
109
  return id ? (sceneRegistry.nodes.get(id)?.position.y ?? 0) : 0;
80
110
  };
81
- const getSlabElevationForWall = (wall) => spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end);
111
+ const getSlabElevationForWall = (wall) => spatialGridManager.getSlabElevationForWall(wall.parentId ?? '', wall.start, wall.end, wall.curveOffset ?? 0, wall.thickness, wall.supportSlabId);
82
112
  const markHostDirty = (hostId) => {
83
113
  useScene.getState().dirtyNodes.add(hostId);
84
114
  };
85
115
  const destroyDraft = () => {
86
- if (!draftRef.current)
116
+ const draft = draftRef.current;
117
+ if (!draft) {
118
+ clearPlacementPreview();
87
119
  return;
88
- const wallId = draftRef.current.parentId;
89
- useScene.getState().deleteNode(draftRef.current.id);
120
+ }
121
+ const wallId = draft.parentId;
122
+ useScene.getState().deleteNode(draft.id);
90
123
  draftRef.current = null;
124
+ clearPlacementPreview();
91
125
  // Rebuild wall so it removes the cutout from the deleted draft
92
126
  if (wallId)
93
127
  markHostDirty(wallId);
@@ -99,6 +133,7 @@ const WindowTool = () => {
99
133
  clearOpeningGuides3D();
100
134
  setFallbackPose(null);
101
135
  useFacingPose.getState().clear();
136
+ clearPlacementPreview();
102
137
  };
103
138
  // Alignment candidates — anchors of every alignable object; refreshed
104
139
  // after each placement. A window aligns by the plan position of its centre
@@ -138,6 +173,23 @@ const WindowTool = () => {
138
173
  floorY,
139
174
  side: sideFlip ? 'back' : 'front',
140
175
  });
176
+ const halfWidth = fallbackPreview.width / 2 + 0.5;
177
+ const wall = WallNodeSchema.parse({
178
+ end: [position[0] + halfWidth, position[2]],
179
+ id: fallbackWallId,
180
+ start: [position[0] - halfWidth, position[2]],
181
+ thickness: 0.1,
182
+ });
183
+ const ghost = WindowNode.parse({
184
+ ...fallbackPreview,
185
+ metadata: { isTransient: true },
186
+ parentId: wall.id,
187
+ position: [halfWidth, FALLBACK_SILL_LIFT + fallbackPreview.height / 2, 0],
188
+ rotation: [0, sideFlip ? Math.PI : 0, 0],
189
+ side: sideFlip ? 'back' : 'front',
190
+ wallId: wall.id,
191
+ });
192
+ publishPlacementPreview(ghost, wall);
141
193
  useAlignmentGuides.getState().clear();
142
194
  clearOpeningGuides3D();
143
195
  // Off-host (invalid) floating ghost — no direction triangle.
@@ -191,7 +243,7 @@ const WindowTool = () => {
191
243
  width,
192
244
  height,
193
245
  });
194
- const { clampedX, clampedY } = clampToWall(wall, localX, localY, width, height);
246
+ const { clampedX, clampedY } = clampToWall(wall, localX, localY, width, height, useScene.getState().nodes);
195
247
  const valid = !hasWallChildOverlap(wall.id, clampedX, clampedY, width, height, ignoreId);
196
248
  return { clampedX, clampedY, valid };
197
249
  };
@@ -236,6 +288,7 @@ const WindowTool = () => {
236
288
  roofFace: undefined,
237
289
  });
238
290
  }
291
+ publishDraftPreview(wall);
239
292
  updateCursor(wallLocalToWorld(wall, clampedX, clampedY, getLevelYOffset(), getSlabElevationForWall(wall)), cursorRotationY, valid, -clampedY);
240
293
  if (draftRef.current) {
241
294
  publishOpeningGuidesForWallEvent({
@@ -258,6 +311,7 @@ const WindowTool = () => {
258
311
  const draft = draftRef.current;
259
312
  if (!draft)
260
313
  return;
314
+ clearPlacementPreview();
261
315
  draftRef.current = null;
262
316
  hostKind = null;
263
317
  useScene.getState().deleteNode(draft.id);
@@ -438,6 +492,7 @@ const WindowTool = () => {
438
492
  useScene.getState().createNode(node, segment.id);
439
493
  draftRef.current = node;
440
494
  }
495
+ publishDraftPreview(segment);
441
496
  // Opening guides are wall-specific; clear them while over a roof face.
442
497
  clearOpeningGuides3D();
443
498
  updateRoofCursor(target, event.node);
@@ -454,6 +509,7 @@ const WindowTool = () => {
454
509
  return;
455
510
  const { segment, face, position } = target;
456
511
  const draft = draftRef.current;
512
+ clearPlacementPreview();
457
513
  draftRef.current = null;
458
514
  hostKind = null;
459
515
  useScene.getState().deleteNode(draft.id);
@@ -549,6 +605,7 @@ const WindowTool = () => {
549
605
  return () => {
550
606
  destroyDraft();
551
607
  hideCursor();
608
+ clearPlacementPreview();
552
609
  useAlignmentGuides.getState().clear();
553
610
  clearOpeningGuides3D();
554
611
  useScene.temporal.getState().resume();
@@ -1,4 +1,4 @@
1
- import type { WallNode } from '@pascal-app/core';
1
+ import type { AnyNode, AnyNodeId, WallNode } from '@pascal-app/core';
2
2
  /**
3
3
  * Default sill height (metres from the floor to the BOTTOM of a window) for a
4
4
  * fresh window that has no wall-face height yet — the off-wall ghost and the
@@ -16,9 +16,13 @@ export declare const DEFAULT_WINDOW_SILL_M = 0.5;
16
16
  */
17
17
  export declare function wallLocalToWorld(wallNode: WallNode, localX: number, localY: number, levelYOffset?: number, slabElevation?: number): [number, number, number];
18
18
  /**
19
- * Clamps window center position so it stays fully within wall bounds.
19
+ * Clamps window center position so it stays fully within wall bounds. The Y
20
+ * ceiling is the wall's RESOLVED top (storey plane for plane-bound walls,
21
+ * stored height for explicit ones, minus the elected slab base) — `nodes` is
22
+ * required because a plane-bound wall's top lives on its level, not on the
23
+ * wall record.
20
24
  */
21
- export declare function clampToWall(wallNode: WallNode, localX: number, localY: number, width: number, height: number): {
25
+ export declare function clampToWall(wallNode: WallNode, localX: number, localY: number, width: number, height: number, nodes: Readonly<Record<AnyNodeId, AnyNode>>): {
22
26
  clampedX: number;
23
27
  clampedY: number;
24
28
  };
@@ -1 +1 @@
1
- {"version":3,"file":"window-math.d.ts","sourceRoot":"","sources":["../../src/window/window-math.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,SAAI,EAChB,aAAa,SAAI,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAU1B;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CASxC;AAED;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA"}
1
+ {"version":3,"file":"window-math.d.ts","sourceRoot":"","sources":["../../src/window/window-math.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGpE;;;;;;GAMG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAA;AAExC;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,YAAY,SAAI,EAChB,aAAa,SAAI,GAChB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAU1B;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,GAC1C;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CASxC;AAED;;;;GAIG;AACH,OAAO,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAA"}
@@ -1,3 +1,4 @@
1
+ import { resolveWallOpeningCeiling } from '../shared/wall-opening-ceiling';
1
2
  /**
2
3
  * Default sill height (metres from the floor to the BOTTOM of a window) for a
3
4
  * fresh window that has no wall-face height yet — the off-wall ghost and the
@@ -22,13 +23,17 @@ export function wallLocalToWorld(wallNode, localX, localY, levelYOffset = 0, sla
22
23
  ];
23
24
  }
24
25
  /**
25
- * Clamps window center position so it stays fully within wall bounds.
26
+ * Clamps window center position so it stays fully within wall bounds. The Y
27
+ * ceiling is the wall's RESOLVED top (storey plane for plane-bound walls,
28
+ * stored height for explicit ones, minus the elected slab base) — `nodes` is
29
+ * required because a plane-bound wall's top lives on its level, not on the
30
+ * wall record.
26
31
  */
27
- export function clampToWall(wallNode, localX, localY, width, height) {
32
+ export function clampToWall(wallNode, localX, localY, width, height, nodes) {
28
33
  const dx = wallNode.end[0] - wallNode.start[0];
29
34
  const dz = wallNode.end[1] - wallNode.start[1];
30
35
  const wallLength = Math.sqrt(dx * dx + dz * dz);
31
- const wallHeight = wallNode.height ?? 2.5;
36
+ const wallHeight = resolveWallOpeningCeiling(wallNode, nodes);
32
37
  const clampedX = Math.max(width / 2, Math.min(wallLength - width / 2, localX));
33
38
  const clampedY = Math.max(height / 2, Math.min(wallHeight - height / 2, localY));
34
39
  return { clampedX, clampedY };
@@ -0,0 +1,3 @@
1
+ import { type FloorplanGeometry, type GeometryContext, type ZoneNode } from '@pascal-app/core';
2
+ export declare function buildZoneContextualDimensions(node: ZoneNode, ctx: GeometryContext): FloorplanGeometry | null;
3
+ //# sourceMappingURL=contextual-dimensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextual-dimensions.d.ts","sourceRoot":"","sources":["../../src/zone/contextual-dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAEpB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAGzB,wBAAgB,6BAA6B,CAC3C,IAAI,EAAE,QAAQ,EACd,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAc1B"}
@@ -0,0 +1,43 @@
1
+ import { resolveAutoZonePolygon, } from '@pascal-app/core';
2
+ import { formatAreaLabel } from '@pascal-app/editor';
3
+ export function buildZoneContextualDimensions(node, ctx) {
4
+ const polygon = resolveAutoZonePolygon(node, ctx.resolve);
5
+ if (polygon.length < 3)
6
+ return null;
7
+ const { area, centroid } = polygonAreaAndCentroid(polygon);
8
+ if (area <= 1e-6)
9
+ return null;
10
+ return {
11
+ kind: 'dimension-label',
12
+ appearance: 'outlined',
13
+ cx: centroid[0],
14
+ cy: centroid[1],
15
+ text: formatAreaLabel(area, ctx.viewState?.unit ?? 'metric', 1),
16
+ angle: 0,
17
+ };
18
+ }
19
+ function polygonAreaAndCentroid(points) {
20
+ let twiceSignedArea = 0;
21
+ let weightedX = 0;
22
+ let weightedY = 0;
23
+ for (let index = 0; index < points.length; index += 1) {
24
+ const current = points[index];
25
+ const next = points[(index + 1) % points.length];
26
+ const cross = current[0] * next[1] - next[0] * current[1];
27
+ twiceSignedArea += cross;
28
+ weightedX += (current[0] + next[0]) * cross;
29
+ weightedY += (current[1] + next[1]) * cross;
30
+ }
31
+ const area = Math.abs(twiceSignedArea) / 2;
32
+ if (Math.abs(twiceSignedArea) <= 1e-9) {
33
+ const sum = points.reduce((acc, point) => [acc[0] + point[0], acc[1] + point[1]], [0, 0]);
34
+ return {
35
+ area,
36
+ centroid: [sum[0] / points.length, sum[1] / points.length],
37
+ };
38
+ }
39
+ return {
40
+ area,
41
+ centroid: [weightedX / (3 * twiceSignedArea), weightedY / (3 * twiceSignedArea)],
42
+ };
43
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/zone/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AAYzB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CAwE1D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/zone/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,cAAc,EAGpB,MAAM,kBAAkB,CAAA;AAezB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAEnC;;;;;GAKG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CA8E1D,CAAA"}
@@ -1,10 +1,12 @@
1
1
  import { resolveAutoZonePolygon, ZoneNode as ZoneNodeSchema, } from '@pascal-app/core';
2
2
  import { polygonMeasurementFeatures } from '../shared/polygon-measurement';
3
+ import { buildZoneContextualDimensions } from './contextual-dimensions';
3
4
  import { buildZoneFloorplan } from './floorplan';
4
5
  import { zoneAddVertexAffordance, zoneDeleteVertexAffordance, zoneMoveEdgeAffordance, zoneMoveVertexAffordance, } from './floorplan-affordances';
5
6
  import { zoneFloorplanMoveTarget } from './floorplan-move';
6
7
  import { zoneParametrics } from './parametrics';
7
8
  import { zoneQuickMeasurement } from './quick-measurement';
9
+ import { buildRoomFloorplanSchedule } from './room-documentation';
8
10
  import { ZoneNode } from './schema';
9
11
  /**
10
12
  * Zone — Stage A. Custom-behavior escape hatch: zone uses TSL shader
@@ -15,9 +17,15 @@ import { ZoneNode } from './schema';
15
17
  export const zoneDefinition = {
16
18
  kind: 'zone',
17
19
  snapProfile: 'structural',
18
- schemaVersion: 1,
20
+ schemaVersion: 2,
19
21
  schema: ZoneNode,
20
22
  category: 'site',
23
+ extensions: {
24
+ 'pascal:editor/floorplan': {
25
+ contextualDimensions: buildZoneContextualDimensions,
26
+ schedule: buildRoomFloorplanSchedule,
27
+ },
28
+ },
21
29
  defaults: () => {
22
30
  const stub = ZoneNodeSchema.parse({ id: 'zone_default', type: 'zone' });
23
31
  const { id: _id, type: _type, ...rest } = stub;