@pascal-app/nodes 1.0.1 → 1.0.4

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 (867) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +22 -4
  3. package/dist/block/face-host.d.ts.map +1 -1
  4. package/dist/block/face-host.js +19 -2
  5. package/dist/block/floorplan.d.ts +11 -1
  6. package/dist/block/floorplan.d.ts.map +1 -1
  7. package/dist/block/floorplan.js +81 -13
  8. package/dist/block/geometry.d.ts +2 -2
  9. package/dist/block/geometry.d.ts.map +1 -1
  10. package/dist/block/geometry.js +39 -24
  11. package/dist/block/hosted-edit.d.ts +13 -0
  12. package/dist/block/hosted-edit.d.ts.map +1 -0
  13. package/dist/block/hosted-edit.js +230 -0
  14. package/dist/block/last-operation.d.ts +1 -1
  15. package/dist/block/last-operation.d.ts.map +1 -1
  16. package/dist/block/last-operation.js +6 -4
  17. package/dist/block/material-slots.d.ts +1 -3
  18. package/dist/block/material-slots.d.ts.map +1 -1
  19. package/dist/block/material-slots.js +1 -11
  20. package/dist/block/modal-session.d.ts +2 -1
  21. package/dist/block/modal-session.d.ts.map +1 -1
  22. package/dist/block/modal-session.js +2 -2
  23. package/dist/block/paint.d.ts.map +1 -1
  24. package/dist/block/paint.js +4 -10
  25. package/dist/block/panel.d.ts.map +1 -1
  26. package/dist/block/panel.js +8 -3
  27. package/dist/block/selection.d.ts.map +1 -1
  28. package/dist/block/selection.js +83 -25
  29. package/dist/block/surface.d.ts +4 -0
  30. package/dist/block/surface.d.ts.map +1 -0
  31. package/dist/block/surface.js +54 -0
  32. package/dist/block/use-block-face-operation.d.ts +2 -2
  33. package/dist/block/use-block-face-operation.d.ts.map +1 -1
  34. package/dist/block/use-block-face-operation.js +25 -11
  35. package/dist/box-vent/definition.d.ts.map +1 -1
  36. package/dist/box-vent/definition.js +3 -5
  37. package/dist/box-vent/panel.d.ts.map +1 -1
  38. package/dist/box-vent/panel.js +5 -28
  39. package/dist/building/renderer.d.ts.map +1 -1
  40. package/dist/building/renderer.js +1 -1
  41. package/dist/cabinet/countertop-layout.d.ts +13 -2
  42. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  43. package/dist/cabinet/definition.d.ts.map +1 -1
  44. package/dist/cabinet/definition.js +4 -3
  45. package/dist/cabinet/floorplan.d.ts.map +1 -1
  46. package/dist/cabinet/floorplan.js +125 -28
  47. package/dist/cabinet/geometry/shared.d.ts +1 -2
  48. package/dist/cabinet/geometry/shared.d.ts.map +1 -1
  49. package/dist/cabinet/geometry/shared.js +1 -2
  50. package/dist/cabinet/hosted-resize.d.ts +3 -6
  51. package/dist/cabinet/hosted-resize.d.ts.map +1 -1
  52. package/dist/cabinet/hosted-resize.js +9 -153
  53. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  54. package/dist/cabinet/placement-snap.js +4 -2
  55. package/dist/cabinet/run-layout.d.ts.map +1 -1
  56. package/dist/cabinet/run-layout.js +8 -5
  57. package/dist/cabinet/run-ops.d.ts +13 -2
  58. package/dist/cabinet/run-ops.d.ts.map +1 -1
  59. package/dist/cabinet/surfaces.d.ts +1 -0
  60. package/dist/cabinet/surfaces.d.ts.map +1 -1
  61. package/dist/cabinet/surfaces.js +13 -1
  62. package/dist/cabinet/tool.d.ts.map +1 -1
  63. package/dist/cabinet/tool.js +30 -28
  64. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  65. package/dist/cabinet/wall-snap.js +8 -8
  66. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  67. package/dist/ceiling/boundary-editor.js +5 -3
  68. package/dist/ceiling/definition.d.ts +4 -4
  69. package/dist/ceiling/definition.d.ts.map +1 -1
  70. package/dist/ceiling/definition.js +20 -15
  71. package/dist/ceiling/floorplan-affordances.d.ts +84 -4
  72. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  73. package/dist/ceiling/floorplan-affordances.js +0 -1
  74. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  75. package/dist/ceiling/floorplan-move.js +0 -1
  76. package/dist/ceiling/floorplan.d.ts +1 -1
  77. package/dist/ceiling/floorplan.d.ts.map +1 -1
  78. package/dist/ceiling/floorplan.js +2 -1
  79. package/dist/ceiling/height-bounds.d.ts +19 -0
  80. package/dist/ceiling/height-bounds.d.ts.map +1 -0
  81. package/dist/ceiling/height-bounds.js +24 -0
  82. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  83. package/dist/ceiling/hole-editor.js +3 -4
  84. package/dist/ceiling/materials.d.ts +1 -1
  85. package/dist/ceiling/materials.d.ts.map +1 -1
  86. package/dist/ceiling/materials.js +10 -3
  87. package/dist/ceiling/paint.d.ts +2 -8
  88. package/dist/ceiling/paint.d.ts.map +1 -1
  89. package/dist/ceiling/paint.js +121 -24
  90. package/dist/ceiling/panel.d.ts.map +1 -1
  91. package/dist/ceiling/panel.js +40 -23
  92. package/dist/ceiling/renderer.d.ts.map +1 -1
  93. package/dist/ceiling/renderer.js +43 -6
  94. package/dist/chimney/definition.d.ts.map +1 -1
  95. package/dist/chimney/definition.js +1 -0
  96. package/dist/chimney/move-tool.d.ts.map +1 -1
  97. package/dist/chimney/move-tool.js +8 -2
  98. package/dist/chimney/paint.d.ts.map +1 -1
  99. package/dist/chimney/paint.js +3 -10
  100. package/dist/column/definition.d.ts.map +1 -1
  101. package/dist/column/definition.js +34 -5
  102. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  103. package/dist/column/floorplan-affordances.js +11 -1
  104. package/dist/column/floorplan.d.ts +1 -1
  105. package/dist/column/floorplan.d.ts.map +1 -1
  106. package/dist/column/floorplan.js +69 -12
  107. package/dist/column/hosted-resize.d.ts +215 -0
  108. package/dist/column/hosted-resize.d.ts.map +1 -0
  109. package/dist/column/hosted-resize.js +9 -0
  110. package/dist/column/panel.d.ts.map +1 -1
  111. package/dist/column/panel.js +153 -149
  112. package/dist/column/renderer.d.ts.map +1 -1
  113. package/dist/column/renderer.js +29 -105
  114. package/dist/column/shape.d.ts +22 -0
  115. package/dist/column/shape.d.ts.map +1 -0
  116. package/dist/column/shape.js +120 -0
  117. package/dist/column/surface.d.ts +4 -0
  118. package/dist/column/surface.d.ts.map +1 -0
  119. package/dist/column/surface.js +73 -0
  120. package/dist/construction-dimension/floorplan.js +7 -3
  121. package/dist/cupola/definition.d.ts.map +1 -1
  122. package/dist/cupola/definition.js +3 -8
  123. package/dist/cupola/panel.d.ts.map +1 -1
  124. package/dist/cupola/panel.js +5 -23
  125. package/dist/door/definition.d.ts.map +1 -1
  126. package/dist/door/definition.js +52 -4
  127. package/dist/door/door-math.d.ts +6 -11
  128. package/dist/door/door-math.d.ts.map +1 -1
  129. package/dist/door/door-math.js +13 -17
  130. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  131. package/dist/door/floorplan-affordances.js +8 -12
  132. package/dist/door/floorplan-move.d.ts.map +1 -1
  133. package/dist/door/floorplan-move.js +3 -1
  134. package/dist/door/floorplan.d.ts.map +1 -1
  135. package/dist/door/floorplan.js +55 -21
  136. package/dist/door/mechanism.d.ts +4 -0
  137. package/dist/door/mechanism.d.ts.map +1 -0
  138. package/dist/door/mechanism.js +24 -0
  139. package/dist/door/move-tool.d.ts.map +1 -1
  140. package/dist/door/move-tool.js +75 -52
  141. package/dist/door/paint.d.ts.map +1 -1
  142. package/dist/door/paint.js +3 -0
  143. package/dist/door/panel.d.ts.map +1 -1
  144. package/dist/door/panel.js +54 -308
  145. package/dist/door/placement.d.ts +45 -0
  146. package/dist/door/placement.d.ts.map +1 -0
  147. package/dist/door/placement.js +51 -0
  148. package/dist/door/preview.d.ts.map +1 -1
  149. package/dist/door/preview.js +2 -0
  150. package/dist/door/renderer.d.ts.map +1 -1
  151. package/dist/door/renderer.js +3 -2
  152. package/dist/door/tool.d.ts.map +1 -1
  153. package/dist/door/tool.js +112 -23
  154. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  155. package/dist/dormer/csg-geometry.js +2 -0
  156. package/dist/dormer/definition.d.ts.map +1 -1
  157. package/dist/dormer/definition.js +1 -0
  158. package/dist/dormer/paint.d.ts.map +1 -1
  159. package/dist/dormer/paint.js +2 -5
  160. package/dist/dormer/panel.d.ts.map +1 -1
  161. package/dist/dormer/panel.js +4 -14
  162. package/dist/downspout/definition.d.ts.map +1 -1
  163. package/dist/downspout/definition.js +3 -2
  164. package/dist/duct-fitting/definition.d.ts.map +1 -1
  165. package/dist/duct-fitting/definition.js +2 -1
  166. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  167. package/dist/duct-fitting/geometry.js +1 -1
  168. package/dist/duct-fitting/move-tool.d.ts.map +1 -1
  169. package/dist/duct-fitting/move-tool.js +8 -2
  170. package/dist/duct-segment/definition.d.ts.map +1 -1
  171. package/dist/duct-segment/definition.js +2 -2
  172. package/dist/duct-segment/geometry.d.ts.map +1 -1
  173. package/dist/duct-segment/geometry.js +1 -1
  174. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  175. package/dist/duct-segment/move-tool.js +8 -2
  176. package/dist/duct-segment/tool.d.ts.map +1 -1
  177. package/dist/duct-segment/tool.js +11 -0
  178. package/dist/duct-terminal/tool.d.ts.map +1 -1
  179. package/dist/duct-terminal/tool.js +77 -8
  180. package/dist/elevator/definition.d.ts.map +1 -1
  181. package/dist/elevator/definition.js +3 -2
  182. package/dist/elevator/panel.d.ts.map +1 -1
  183. package/dist/elevator/panel.js +5 -27
  184. package/dist/elevator/parametrics.d.ts.map +1 -1
  185. package/dist/elevator/parametrics.js +98 -1
  186. package/dist/elevator/renderer.d.ts.map +1 -1
  187. package/dist/elevator/renderer.js +3 -4
  188. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  189. package/dist/eyebrow-vent/definition.js +3 -5
  190. package/dist/eyebrow-vent/paint.d.ts.map +1 -1
  191. package/dist/eyebrow-vent/paint.js +3 -6
  192. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  193. package/dist/eyebrow-vent/panel.js +5 -23
  194. package/dist/fence/actions/move-endpoint.d.ts +1 -1
  195. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  196. package/dist/fence/actions/move-endpoint.js +2 -1
  197. package/dist/fence/definition.d.ts +2 -1
  198. package/dist/fence/definition.d.ts.map +1 -1
  199. package/dist/fence/definition.js +84 -28
  200. package/dist/fence/drafting.d.ts +36 -0
  201. package/dist/fence/drafting.d.ts.map +1 -0
  202. package/dist/fence/drafting.js +210 -0
  203. package/dist/fence/feature-tool.d.ts +4 -0
  204. package/dist/fence/feature-tool.d.ts.map +1 -0
  205. package/dist/fence/feature-tool.js +140 -0
  206. package/dist/fence/features.d.ts +2 -0
  207. package/dist/fence/features.d.ts.map +1 -0
  208. package/dist/fence/features.js +12 -0
  209. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  210. package/dist/fence/floorplan-affordances.js +2 -1
  211. package/dist/fence/floorplan.d.ts +2 -3
  212. package/dist/fence/floorplan.d.ts.map +1 -1
  213. package/dist/fence/floorplan.js +131 -71
  214. package/dist/fence/geometry-parts.d.ts +50 -0
  215. package/dist/fence/geometry-parts.d.ts.map +1 -0
  216. package/dist/fence/geometry-parts.js +1144 -0
  217. package/dist/fence/geometry.d.ts +2 -3
  218. package/dist/fence/geometry.d.ts.map +1 -1
  219. package/dist/fence/geometry.js +84 -7
  220. package/dist/fence/index.d.ts +1 -0
  221. package/dist/fence/index.d.ts.map +1 -1
  222. package/dist/fence/index.js +1 -0
  223. package/dist/fence/inspector-editors.d.ts +15 -0
  224. package/dist/fence/inspector-editors.d.ts.map +1 -1
  225. package/dist/fence/inspector-editors.js +128 -3
  226. package/dist/fence/lift.d.ts.map +1 -1
  227. package/dist/fence/lift.js +5 -2
  228. package/dist/fence/move-tool.js +2 -1
  229. package/dist/fence/panel-model.d.ts +4 -0
  230. package/dist/fence/panel-model.d.ts.map +1 -0
  231. package/dist/fence/panel-model.js +12 -0
  232. package/dist/fence/parametrics.d.ts +0 -12
  233. package/dist/fence/parametrics.d.ts.map +1 -1
  234. package/dist/fence/parametrics.js +185 -18
  235. package/dist/fence/system.d.ts.map +1 -1
  236. package/dist/fence/system.js +141 -31
  237. package/dist/fence/tool.d.ts.map +1 -1
  238. package/dist/fence/tool.js +257 -48
  239. package/dist/fence-feature/actions.d.ts +7 -0
  240. package/dist/fence-feature/actions.d.ts.map +1 -0
  241. package/dist/fence-feature/actions.js +26 -0
  242. package/dist/fence-feature/definition.d.ts +4 -0
  243. package/dist/fence-feature/definition.d.ts.map +1 -0
  244. package/dist/fence-feature/definition.js +112 -0
  245. package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
  246. package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
  247. package/dist/fence-feature/floorplan-affordances.js +37 -0
  248. package/dist/fence-feature/floorplan.d.ts +4 -0
  249. package/dist/fence-feature/floorplan.d.ts.map +1 -0
  250. package/dist/fence-feature/floorplan.js +120 -0
  251. package/dist/fence-feature/geometry.d.ts +5 -0
  252. package/dist/fence-feature/geometry.d.ts.map +1 -0
  253. package/dist/fence-feature/geometry.js +43 -0
  254. package/dist/fence-feature/handles.d.ts +5 -0
  255. package/dist/fence-feature/handles.d.ts.map +1 -0
  256. package/dist/fence-feature/handles.js +84 -0
  257. package/dist/fence-feature/inspector.d.ts +6 -0
  258. package/dist/fence-feature/inspector.d.ts.map +1 -0
  259. package/dist/fence-feature/inspector.js +214 -0
  260. package/dist/fence-feature/interaction.d.ts +3 -0
  261. package/dist/fence-feature/interaction.d.ts.map +1 -0
  262. package/dist/fence-feature/interaction.js +41 -0
  263. package/dist/fence-feature/move-session.d.ts +9 -0
  264. package/dist/fence-feature/move-session.d.ts.map +1 -0
  265. package/dist/fence-feature/move-session.js +48 -0
  266. package/dist/fence-feature/move-tool.d.ts +5 -0
  267. package/dist/fence-feature/move-tool.d.ts.map +1 -0
  268. package/dist/fence-feature/move-tool.js +58 -0
  269. package/dist/fence-feature/pick-target.d.ts +7 -0
  270. package/dist/fence-feature/pick-target.d.ts.map +1 -0
  271. package/dist/fence-feature/pick-target.js +52 -0
  272. package/dist/floor-opening/definition.d.ts +3 -0
  273. package/dist/floor-opening/definition.d.ts.map +1 -0
  274. package/dist/floor-opening/definition.js +41 -0
  275. package/dist/floor-opening/floorplan.d.ts +156 -0
  276. package/dist/floor-opening/floorplan.d.ts.map +1 -0
  277. package/dist/floor-opening/floorplan.js +63 -0
  278. package/dist/guide/definition.d.ts.map +1 -1
  279. package/dist/guide/definition.js +1 -0
  280. package/dist/gutter/definition.d.ts.map +1 -1
  281. package/dist/gutter/definition.js +3 -2
  282. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  283. package/dist/hvac-equipment/tool.js +8 -2
  284. package/dist/imported-mesh/definition.d.ts.map +1 -1
  285. package/dist/imported-mesh/definition.js +2 -0
  286. package/dist/imported-mesh/geometry.d.ts +1 -1
  287. package/dist/imported-mesh/geometry.d.ts.map +1 -1
  288. package/dist/imported-mesh/geometry.js +40 -12
  289. package/dist/index.d.ts +13 -2
  290. package/dist/index.d.ts.map +1 -1
  291. package/dist/index.js +20 -2
  292. package/dist/item/authored-face-host.d.ts +10 -0
  293. package/dist/item/authored-face-host.d.ts.map +1 -0
  294. package/dist/item/authored-face-host.js +87 -0
  295. package/dist/item/authored-params.d.ts +15 -0
  296. package/dist/item/authored-params.d.ts.map +1 -0
  297. package/dist/item/authored-params.js +72 -0
  298. package/dist/item/definition.d.ts +2 -2
  299. package/dist/item/definition.d.ts.map +1 -1
  300. package/dist/item/definition.js +35 -4
  301. package/dist/item/floorplan-move.d.ts.map +1 -1
  302. package/dist/item/floorplan-move.js +209 -130
  303. package/dist/item/floorplan.d.ts +22 -0
  304. package/dist/item/floorplan.d.ts.map +1 -1
  305. package/dist/item/floorplan.js +95 -6
  306. package/dist/item/index.d.ts +1 -0
  307. package/dist/item/index.d.ts.map +1 -1
  308. package/dist/item/index.js +1 -0
  309. package/dist/item/model-loader.d.ts +2 -0
  310. package/dist/item/model-loader.d.ts.map +1 -1
  311. package/dist/item/model-loader.js +55 -23
  312. package/dist/item/move-tool.d.ts +1 -1
  313. package/dist/item/move-tool.d.ts.map +1 -1
  314. package/dist/item/move-tool.js +19 -11
  315. package/dist/item/paint.d.ts.map +1 -1
  316. package/dist/item/paint.js +5 -24
  317. package/dist/item/panel.d.ts +1 -3
  318. package/dist/item/panel.d.ts.map +1 -1
  319. package/dist/item/panel.js +20 -24
  320. package/dist/item/placement-notice.d.ts +14 -0
  321. package/dist/item/placement-notice.d.ts.map +1 -0
  322. package/dist/item/placement-notice.js +38 -0
  323. package/dist/item/plan-symbols.d.ts +67 -0
  324. package/dist/item/plan-symbols.d.ts.map +1 -0
  325. package/dist/item/plan-symbols.js +407 -0
  326. package/dist/item/renderer.d.ts +10 -0
  327. package/dist/item/renderer.d.ts.map +1 -1
  328. package/dist/item/renderer.js +72 -40
  329. package/dist/item/script-param-defaults.d.ts +12 -0
  330. package/dist/item/script-param-defaults.d.ts.map +1 -0
  331. package/dist/item/script-param-defaults.js +34 -0
  332. package/dist/lean-to-extension/definition.d.ts.map +1 -1
  333. package/dist/lean-to-extension/definition.js +1 -2
  334. package/dist/lean-to-extension/geometry.d.ts.map +1 -1
  335. package/dist/lean-to-extension/geometry.js +1 -1
  336. package/dist/lean-to-extension/layout.d.ts.map +1 -1
  337. package/dist/lean-to-extension/layout.js +2 -3
  338. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
  339. package/dist/lean-to-extension/placement-validation.js +5 -5
  340. package/dist/lean-to-extension/tool.d.ts.map +1 -1
  341. package/dist/lean-to-extension/tool.js +5 -5
  342. package/dist/level/renderer.js +1 -1
  343. package/dist/lineset/move-tool.d.ts.map +1 -1
  344. package/dist/lineset/move-tool.js +8 -2
  345. package/dist/lineset/tool.d.ts.map +1 -1
  346. package/dist/lineset/tool.js +1 -0
  347. package/dist/liquid-line/move-tool.d.ts.map +1 -1
  348. package/dist/liquid-line/move-tool.js +8 -2
  349. package/dist/liquid-line/tool.d.ts.map +1 -1
  350. package/dist/liquid-line/tool.js +5 -1
  351. package/dist/measurement/definition.d.ts.map +1 -1
  352. package/dist/measurement/definition.js +2 -1
  353. package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
  354. package/dist/pipe-fitting/move-tool.js +8 -2
  355. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  356. package/dist/pipe-segment/move-tool.js +8 -2
  357. package/dist/pipe-segment/tool.d.ts.map +1 -1
  358. package/dist/pipe-segment/tool.js +14 -3
  359. package/dist/pipe-trap/tool.d.ts.map +1 -1
  360. package/dist/pipe-trap/tool.js +7 -8
  361. package/dist/procedural-item/animation.d.ts +8 -0
  362. package/dist/procedural-item/animation.d.ts.map +1 -0
  363. package/dist/procedural-item/animation.js +116 -0
  364. package/dist/procedural-item/definition.d.ts.map +1 -1
  365. package/dist/procedural-item/definition.js +77 -8
  366. package/dist/procedural-item/geometry.d.ts +5 -1
  367. package/dist/procedural-item/geometry.d.ts.map +1 -1
  368. package/dist/procedural-item/geometry.js +239 -15
  369. package/dist/procedural-item/renderer.d.ts.map +1 -1
  370. package/dist/procedural-item/renderer.js +272 -23
  371. package/dist/ridge-vent/definition.d.ts.map +1 -1
  372. package/dist/ridge-vent/definition.js +1 -0
  373. package/dist/ridge-vent/panel.d.ts.map +1 -1
  374. package/dist/ridge-vent/panel.js +5 -23
  375. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  376. package/dist/ridge-vent/renderer.js +9 -8
  377. package/dist/roof/definition.d.ts.map +1 -1
  378. package/dist/roof/definition.js +8 -2
  379. package/dist/roof/floorplan.d.ts +8 -0
  380. package/dist/roof/floorplan.d.ts.map +1 -1
  381. package/dist/roof/floorplan.js +194 -18
  382. package/dist/roof/panel-model.d.ts +4 -0
  383. package/dist/roof/panel-model.d.ts.map +1 -0
  384. package/dist/roof/panel-model.js +155 -0
  385. package/dist/roof/panel.d.ts.map +1 -1
  386. package/dist/roof/panel.js +5 -13
  387. package/dist/roof/parametrics.d.ts.map +1 -1
  388. package/dist/roof/parametrics.js +16 -1
  389. package/dist/roof/renderer.d.ts.map +1 -1
  390. package/dist/roof/renderer.js +5 -2
  391. package/dist/roof-segment/definition.d.ts.map +1 -1
  392. package/dist/roof-segment/definition.js +1 -0
  393. package/dist/roof-segment/panel.d.ts.map +1 -1
  394. package/dist/roof-segment/panel.js +5 -24
  395. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  396. package/dist/roof-segment/parametrics.js +176 -1
  397. package/dist/roof-segment/renderer.d.ts.map +1 -1
  398. package/dist/roof-segment/renderer.js +17 -8
  399. package/dist/scan/definition.d.ts.map +1 -1
  400. package/dist/scan/definition.js +1 -0
  401. package/dist/separator/definition.d.ts +3 -0
  402. package/dist/separator/definition.d.ts.map +1 -0
  403. package/dist/separator/definition.js +39 -0
  404. package/dist/separator/renderer.d.ts +5 -0
  405. package/dist/separator/renderer.d.ts.map +1 -0
  406. package/dist/separator/renderer.js +36 -0
  407. package/dist/shared/commit-opening-move.d.ts +4 -0
  408. package/dist/shared/commit-opening-move.d.ts.map +1 -0
  409. package/dist/shared/commit-opening-move.js +9 -0
  410. package/dist/shared/curtain-opening-limits.d.ts +14 -0
  411. package/dist/shared/curtain-opening-limits.d.ts.map +1 -0
  412. package/dist/shared/curtain-opening-limits.js +53 -0
  413. package/dist/shared/draft-axis-guides.d.ts +0 -6
  414. package/dist/shared/draft-axis-guides.d.ts.map +1 -1
  415. package/dist/shared/draft-axis-guides.js +1 -8
  416. package/dist/shared/duct-body-paint.d.ts +0 -4
  417. package/dist/shared/duct-body-paint.d.ts.map +1 -1
  418. package/dist/shared/duct-body-paint.js +1 -5
  419. package/dist/shared/hosted-resize.d.ts +12 -0
  420. package/dist/shared/hosted-resize.d.ts.map +1 -0
  421. package/dist/shared/hosted-resize.js +166 -0
  422. package/dist/shared/item-interaction-actions.d.ts +6 -0
  423. package/dist/shared/item-interaction-actions.d.ts.map +1 -0
  424. package/dist/shared/item-interaction-actions.js +27 -0
  425. package/dist/shared/item-interactions.d.ts +9 -0
  426. package/dist/shared/item-interactions.d.ts.map +1 -0
  427. package/dist/shared/item-interactions.js +74 -0
  428. package/dist/shared/item-light-placement.d.ts +2 -0
  429. package/dist/shared/item-light-placement.d.ts.map +1 -0
  430. package/dist/shared/item-light-placement.js +3 -0
  431. package/dist/shared/move-roof-tool.js +2 -1
  432. package/dist/shared/node-batch/batchable.d.ts +12 -0
  433. package/dist/shared/node-batch/batchable.d.ts.map +1 -0
  434. package/dist/shared/node-batch/batchable.js +41 -0
  435. package/dist/shared/node-batch/candidates.d.ts +7 -5
  436. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  437. package/dist/shared/node-batch/candidates.js +43 -59
  438. package/dist/shared/node-batch/release.d.ts +8 -0
  439. package/dist/shared/node-batch/release.d.ts.map +1 -0
  440. package/dist/shared/node-batch/release.js +16 -0
  441. package/dist/shared/node-batch/system.d.ts.map +1 -1
  442. package/dist/shared/node-batch/system.js +17 -12
  443. package/dist/shared/node-batch/types.d.ts +4 -1
  444. package/dist/shared/node-batch/types.d.ts.map +1 -1
  445. package/dist/shared/opening-documentation.d.ts +13 -1
  446. package/dist/shared/opening-documentation.d.ts.map +1 -1
  447. package/dist/shared/opening-documentation.js +245 -59
  448. package/dist/shared/opening-grid-follow.d.ts +8 -0
  449. package/dist/shared/opening-grid-follow.d.ts.map +1 -0
  450. package/dist/shared/opening-grid-follow.js +12 -0
  451. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  452. package/dist/shared/opening-guides-runtime.js +17 -14
  453. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  454. package/dist/shared/opening-placement-dimensions.js +3 -3
  455. package/dist/shared/opening-plane-offset.d.ts +23 -0
  456. package/dist/shared/opening-plane-offset.d.ts.map +1 -0
  457. package/dist/shared/opening-plane-offset.js +24 -0
  458. package/dist/shared/opening-property-preview-host.d.ts +3 -0
  459. package/dist/shared/opening-property-preview-host.d.ts.map +1 -0
  460. package/dist/shared/opening-property-preview-host.js +21 -0
  461. package/dist/shared/opening-property-preview.d.ts +19 -0
  462. package/dist/shared/opening-property-preview.d.ts.map +1 -0
  463. package/dist/shared/opening-property-preview.js +99 -0
  464. package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
  465. package/dist/shared/polygon-centroid-move.js +4 -1
  466. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  467. package/dist/shared/polygon-vertex-affordance.js +19 -15
  468. package/dist/shared/resting-surface-plan.d.ts +2 -1
  469. package/dist/shared/resting-surface-plan.d.ts.map +1 -1
  470. package/dist/shared/resting-surface-plan.js +29 -4
  471. package/dist/shared/run-hangers.d.ts.map +1 -1
  472. package/dist/shared/run-hangers.js +5 -4
  473. package/dist/shared/scripted-opening-handles.d.ts +18 -0
  474. package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
  475. package/dist/shared/scripted-opening-handles.js +53 -0
  476. package/dist/shared/scripted-opening.d.ts +25 -0
  477. package/dist/shared/scripted-opening.d.ts.map +1 -0
  478. package/dist/shared/scripted-opening.js +72 -0
  479. package/dist/shared/slot-paint.d.ts +14 -2
  480. package/dist/shared/slot-paint.d.ts.map +1 -1
  481. package/dist/shared/slot-paint.js +29 -29
  482. package/dist/shared/surface-counterparts.d.ts +12 -0
  483. package/dist/shared/surface-counterparts.d.ts.map +1 -0
  484. package/dist/shared/surface-counterparts.js +27 -0
  485. package/dist/shared/surface-paint.d.ts.map +1 -1
  486. package/dist/shared/surface-paint.js +2 -5
  487. package/dist/shared/swap-preview-material.d.ts +11 -0
  488. package/dist/shared/swap-preview-material.d.ts.map +1 -0
  489. package/dist/shared/swap-preview-material.js +16 -0
  490. package/dist/shared/system-checks.d.ts.map +1 -1
  491. package/dist/shared/system-checks.js +5 -3
  492. package/dist/shared/wall-attach-target.d.ts +4 -10
  493. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  494. package/dist/shared/wall-attach-target.js +6 -63
  495. package/dist/shared/wall-event-from-grid.d.ts +5 -0
  496. package/dist/shared/wall-event-from-grid.d.ts.map +1 -0
  497. package/dist/shared/wall-event-from-grid.js +36 -0
  498. package/dist/shared/wall-opening-ceiling.d.ts +5 -15
  499. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
  500. package/dist/shared/wall-opening-ceiling.js +10 -18
  501. package/dist/shelf/definition.d.ts.map +1 -1
  502. package/dist/shelf/definition.js +4 -2
  503. package/dist/shelf/floorplan.d.ts.map +1 -1
  504. package/dist/shelf/floorplan.js +9 -2
  505. package/dist/shelf/geometry.d.ts.map +1 -1
  506. package/dist/shelf/geometry.js +1 -2
  507. package/dist/shelf/paint.d.ts.map +1 -1
  508. package/dist/shelf/paint.js +4 -10
  509. package/dist/site/line-ribbon.d.ts +31 -0
  510. package/dist/site/line-ribbon.d.ts.map +1 -0
  511. package/dist/site/line-ribbon.js +117 -0
  512. package/dist/site/lot-mask.d.ts +18 -0
  513. package/dist/site/lot-mask.d.ts.map +1 -0
  514. package/dist/site/lot-mask.js +35 -0
  515. package/dist/site/panel.d.ts +10 -0
  516. package/dist/site/panel.d.ts.map +1 -0
  517. package/dist/site/panel.js +155 -0
  518. package/dist/site/parametrics.d.ts +7 -0
  519. package/dist/site/parametrics.d.ts.map +1 -1
  520. package/dist/site/parametrics.js +8 -0
  521. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  522. package/dist/site/recessed-slab-ground-holes.js +5 -2
  523. package/dist/site/renderer.d.ts.map +1 -1
  524. package/dist/site/renderer.js +158 -20
  525. package/dist/site/setbacks.d.ts +33 -0
  526. package/dist/site/setbacks.d.ts.map +1 -0
  527. package/dist/site/setbacks.js +204 -0
  528. package/dist/site/terrain-geometry.d.ts +28 -1
  529. package/dist/site/terrain-geometry.d.ts.map +1 -1
  530. package/dist/site/terrain-geometry.js +78 -4
  531. package/dist/site/terrain-holes.d.ts +15 -0
  532. package/dist/site/terrain-holes.d.ts.map +1 -0
  533. package/dist/site/terrain-holes.js +74 -0
  534. package/dist/site/terrain-mesh.d.ts +9 -2
  535. package/dist/site/terrain-mesh.d.ts.map +1 -1
  536. package/dist/site/terrain-mesh.js +36 -9
  537. package/dist/site/terrain-renderer.d.ts +9 -2
  538. package/dist/site/terrain-renderer.d.ts.map +1 -1
  539. package/dist/site/terrain-renderer.js +14 -4
  540. package/dist/skylight/definition.d.ts.map +1 -1
  541. package/dist/skylight/definition.js +1 -0
  542. package/dist/slab/boundary-editor.d.ts +1 -1
  543. package/dist/slab/boundary-editor.d.ts.map +1 -1
  544. package/dist/slab/boundary-editor.js +13 -13
  545. package/dist/slab/definition.d.ts.map +1 -1
  546. package/dist/slab/definition.js +23 -3
  547. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  548. package/dist/slab/dependency-tracker.js +67 -7
  549. package/dist/slab/elevation-limit.d.ts.map +1 -1
  550. package/dist/slab/elevation-limit.js +2 -2
  551. package/dist/slab/floorplan-affordances.d.ts +176 -4
  552. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  553. package/dist/slab/floorplan-affordances.js +0 -1
  554. package/dist/slab/floorplan-move.d.ts.map +1 -1
  555. package/dist/slab/floorplan-move.js +3 -4
  556. package/dist/slab/floorplan.d.ts +7 -0
  557. package/dist/slab/floorplan.d.ts.map +1 -1
  558. package/dist/slab/floorplan.js +22 -5
  559. package/dist/slab/geometry.d.ts.map +1 -1
  560. package/dist/slab/geometry.js +186 -76
  561. package/dist/slab/move-tool.js +7 -6
  562. package/dist/slab/paint.d.ts +18 -5
  563. package/dist/slab/paint.d.ts.map +1 -1
  564. package/dist/slab/paint.js +458 -9
  565. package/dist/slab/panel.d.ts.map +1 -1
  566. package/dist/slab/panel.js +28 -9
  567. package/dist/slab/placement-ownership.d.ts +2 -1
  568. package/dist/slab/placement-ownership.d.ts.map +1 -1
  569. package/dist/slab/placement-ownership.js +2 -2
  570. package/dist/slab/surface-split.d.ts +24 -0
  571. package/dist/slab/surface-split.d.ts.map +1 -0
  572. package/dist/slab/surface-split.js +389 -0
  573. package/dist/slab/tool.d.ts.map +1 -1
  574. package/dist/slab/tool.js +3 -3
  575. package/dist/solar-panel/definition.d.ts.map +1 -1
  576. package/dist/solar-panel/definition.js +1 -0
  577. package/dist/spawn/definition.d.ts.map +1 -1
  578. package/dist/spawn/definition.js +1 -0
  579. package/dist/stair/baluster-geometry.d.ts +21 -0
  580. package/dist/stair/baluster-geometry.d.ts.map +1 -0
  581. package/dist/stair/baluster-geometry.js +74 -0
  582. package/dist/stair/baluster-guard.d.ts +50 -0
  583. package/dist/stair/baluster-guard.d.ts.map +1 -0
  584. package/dist/stair/baluster-guard.js +71 -0
  585. package/dist/stair/boards-guard.d.ts +37 -0
  586. package/dist/stair/boards-guard.d.ts.map +1 -0
  587. package/dist/stair/boards-guard.js +61 -0
  588. package/dist/stair/cable-guard.d.ts +39 -0
  589. package/dist/stair/cable-guard.d.ts.map +1 -0
  590. package/dist/stair/cable-guard.js +105 -0
  591. package/dist/stair/construction-controls.d.ts +15 -0
  592. package/dist/stair/construction-controls.d.ts.map +1 -0
  593. package/dist/stair/construction-controls.js +29 -0
  594. package/dist/stair/continuous-railings.d.ts +10 -0
  595. package/dist/stair/continuous-railings.d.ts.map +1 -0
  596. package/dist/stair/continuous-railings.js +159 -0
  597. package/dist/stair/definition.d.ts.map +1 -1
  598. package/dist/stair/definition.js +18 -37
  599. package/dist/stair/documentation.d.ts +1 -1
  600. package/dist/stair/documentation.d.ts.map +1 -1
  601. package/dist/stair/documentation.js +10 -17
  602. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  603. package/dist/stair/floorplan-affordances.js +9 -25
  604. package/dist/stair/floorplan.d.ts +1 -23
  605. package/dist/stair/floorplan.d.ts.map +1 -1
  606. package/dist/stair/floorplan.js +102 -86
  607. package/dist/stair/glass-guard.d.ts +72 -0
  608. package/dist/stair/glass-guard.d.ts.map +1 -0
  609. package/dist/stair/glass-guard.js +167 -0
  610. package/dist/stair/guard-path.d.ts +119 -0
  611. package/dist/stair/guard-path.d.ts.map +1 -0
  612. package/dist/stair/guard-path.js +208 -0
  613. package/dist/stair/materials.d.ts +11 -0
  614. package/dist/stair/materials.d.ts.map +1 -0
  615. package/dist/stair/materials.js +51 -0
  616. package/dist/stair/metal-guard.d.ts +38 -0
  617. package/dist/stair/metal-guard.d.ts.map +1 -0
  618. package/dist/stair/metal-guard.js +79 -0
  619. package/dist/stair/paint.d.ts +32 -0
  620. package/dist/stair/paint.d.ts.map +1 -1
  621. package/dist/stair/paint.js +75 -36
  622. package/dist/stair/panel.d.ts.map +1 -1
  623. package/dist/stair/panel.js +154 -17
  624. package/dist/stair/parametrics.d.ts +1 -1
  625. package/dist/stair/parametrics.d.ts.map +1 -1
  626. package/dist/stair/parametrics.js +181 -1
  627. package/dist/stair/plan-entry.d.ts +31 -0
  628. package/dist/stair/plan-entry.d.ts.map +1 -0
  629. package/dist/stair/plan-entry.js +325 -0
  630. package/dist/stair/post-and-rail-guard.d.ts +31 -0
  631. package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
  632. package/dist/stair/post-and-rail-guard.js +63 -0
  633. package/dist/stair/railing-controls.d.ts +9 -0
  634. package/dist/stair/railing-controls.d.ts.map +1 -0
  635. package/dist/stair/railing-controls.js +49 -0
  636. package/dist/stair/renderer.d.ts.map +1 -1
  637. package/dist/stair/renderer.js +259 -259
  638. package/dist/stair/use-stair-render-data.d.ts +317 -0
  639. package/dist/stair/use-stair-render-data.d.ts.map +1 -0
  640. package/dist/stair/use-stair-render-data.js +73 -0
  641. package/dist/stair-segment/definition.d.ts.map +1 -1
  642. package/dist/stair-segment/definition.js +52 -10
  643. package/dist/stair-segment/panel.d.ts.map +1 -1
  644. package/dist/stair-segment/panel.js +36 -42
  645. package/dist/stair-segment/parametrics.d.ts +1 -1
  646. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  647. package/dist/stair-segment/parametrics.js +94 -1
  648. package/dist/stair-segment/renderer.d.ts.map +1 -1
  649. package/dist/stair-segment/renderer.js +16 -28
  650. package/dist/turbine-vent/definition.d.ts.map +1 -1
  651. package/dist/turbine-vent/definition.js +3 -5
  652. package/dist/turbine-vent/paint.d.ts.map +1 -1
  653. package/dist/turbine-vent/paint.js +2 -5
  654. package/dist/turbine-vent/panel.d.ts.map +1 -1
  655. package/dist/turbine-vent/panel.js +5 -23
  656. package/dist/unit/unit-panel.d.ts.map +1 -1
  657. package/dist/unit/unit-panel.js +6 -1
  658. package/dist/wall/actions.d.ts +3 -0
  659. package/dist/wall/actions.d.ts.map +1 -0
  660. package/dist/wall/actions.js +61 -0
  661. package/dist/wall/construction-dimensions.js +8 -5
  662. package/dist/wall/contextual-dimensions.js +4 -4
  663. package/dist/wall/curtain-opening-frame.d.ts +14 -0
  664. package/dist/wall/curtain-opening-frame.d.ts.map +1 -0
  665. package/dist/wall/curtain-opening-frame.js +111 -0
  666. package/dist/wall/curtain-panel-highlight.d.ts +3 -0
  667. package/dist/wall/curtain-panel-highlight.d.ts.map +1 -0
  668. package/dist/wall/curtain-panel-highlight.js +113 -0
  669. package/dist/wall/curtain-wall-adapter.d.ts +3 -0
  670. package/dist/wall/curtain-wall-adapter.d.ts.map +1 -0
  671. package/dist/wall/curtain-wall-adapter.js +55 -0
  672. package/dist/wall/curtain-wall-floorplan.d.ts +3 -0
  673. package/dist/wall/curtain-wall-floorplan.d.ts.map +1 -0
  674. package/dist/wall/curtain-wall-floorplan.js +91 -0
  675. package/dist/wall/curtain-wall-geometry.d.ts +4 -0
  676. package/dist/wall/curtain-wall-geometry.d.ts.map +1 -0
  677. package/dist/wall/curtain-wall-geometry.js +226 -0
  678. package/dist/wall/curtain-wall-layout.d.ts +16 -0
  679. package/dist/wall/curtain-wall-layout.d.ts.map +1 -0
  680. package/dist/wall/curtain-wall-layout.js +176 -0
  681. package/dist/wall/curtain-wall-materials.d.ts +5 -0
  682. package/dist/wall/curtain-wall-materials.d.ts.map +1 -0
  683. package/dist/wall/curtain-wall-materials.js +55 -0
  684. package/dist/wall/curtain-wall-panel.d.ts +14 -0
  685. package/dist/wall/curtain-wall-panel.d.ts.map +1 -0
  686. package/dist/wall/curtain-wall-panel.js +167 -0
  687. package/dist/wall/curtain-wall-piece-geometry.d.ts +5 -0
  688. package/dist/wall/curtain-wall-piece-geometry.d.ts.map +1 -0
  689. package/dist/wall/curtain-wall-piece-geometry.js +220 -0
  690. package/dist/wall/curtain-wall-shadow.d.ts +4 -0
  691. package/dist/wall/curtain-wall-shadow.d.ts.map +1 -0
  692. package/dist/wall/curtain-wall-shadow.js +15 -0
  693. package/dist/wall/curve-tool.d.ts.map +1 -1
  694. package/dist/wall/curve-tool.js +4 -0
  695. package/dist/wall/definition.d.ts +0 -15
  696. package/dist/wall/definition.d.ts.map +1 -1
  697. package/dist/wall/definition.js +92 -7
  698. package/dist/wall/floorplan-move.d.ts +1 -1
  699. package/dist/wall/floorplan-move.d.ts.map +1 -1
  700. package/dist/wall/floorplan-move.js +20 -83
  701. package/dist/wall/floorplan-tool.d.ts +4 -0
  702. package/dist/wall/floorplan-tool.d.ts.map +1 -0
  703. package/dist/wall/floorplan-tool.js +106 -0
  704. package/dist/wall/floorplan.d.ts +3 -1
  705. package/dist/wall/floorplan.d.ts.map +1 -1
  706. package/dist/wall/floorplan.js +189 -22
  707. package/dist/wall/length-patch.d.ts +3 -0
  708. package/dist/wall/length-patch.d.ts.map +1 -0
  709. package/dist/wall/length-patch.js +14 -0
  710. package/dist/wall/measurement.d.ts.map +1 -1
  711. package/dist/wall/measurement.js +5 -5
  712. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  713. package/dist/wall/move-endpoint-tool.js +20 -7
  714. package/dist/wall/move-shared.d.ts.map +1 -1
  715. package/dist/wall/move-shared.js +11 -7
  716. package/dist/wall/move-tool.d.ts.map +1 -1
  717. package/dist/wall/move-tool.js +140 -148
  718. package/dist/wall/paint.d.ts +26 -15
  719. package/dist/wall/paint.d.ts.map +1 -1
  720. package/dist/wall/paint.js +339 -115
  721. package/dist/wall/panel-model.d.ts +22 -0
  722. package/dist/wall/panel-model.d.ts.map +1 -0
  723. package/dist/wall/panel-model.js +175 -0
  724. package/dist/wall/panel.d.ts.map +1 -1
  725. package/dist/wall/panel.js +233 -61
  726. package/dist/wall/parametrics.d.ts.map +1 -1
  727. package/dist/wall/parametrics.js +3 -0
  728. package/dist/wall/property-preview.d.ts +7 -0
  729. package/dist/wall/property-preview.d.ts.map +1 -0
  730. package/dist/wall/property-preview.js +31 -0
  731. package/dist/wall/rectangle-command.d.ts +248 -0
  732. package/dist/wall/rectangle-command.d.ts.map +1 -0
  733. package/dist/wall/rectangle-command.js +22 -0
  734. package/dist/wall/rectangle-tool.d.ts +2 -0
  735. package/dist/wall/rectangle-tool.d.ts.map +1 -0
  736. package/dist/wall/rectangle-tool.js +165 -0
  737. package/dist/wall/renderer.d.ts.map +1 -1
  738. package/dist/wall/renderer.js +9 -4
  739. package/dist/wall/split-floorplan-layer.d.ts +4 -0
  740. package/dist/wall/split-floorplan-layer.d.ts.map +1 -0
  741. package/dist/wall/split-floorplan-layer.js +71 -0
  742. package/dist/wall/split-pointer.d.ts +3 -0
  743. package/dist/wall/split-pointer.d.ts.map +1 -0
  744. package/dist/wall/split-pointer.js +95 -0
  745. package/dist/wall/split-preview.d.ts +55 -0
  746. package/dist/wall/split-preview.d.ts.map +1 -0
  747. package/dist/wall/split-preview.js +106 -0
  748. package/dist/wall/split-session.d.ts +16 -0
  749. package/dist/wall/split-session.d.ts.map +1 -0
  750. package/dist/wall/split-session.js +144 -0
  751. package/dist/wall/split-store.d.ts +16 -0
  752. package/dist/wall/split-store.d.ts.map +1 -0
  753. package/dist/wall/split-store.js +6 -0
  754. package/dist/wall/split-tool.d.ts +10 -0
  755. package/dist/wall/split-tool.d.ts.map +1 -0
  756. package/dist/wall/split-tool.js +95 -0
  757. package/dist/wall/system.d.ts.map +1 -1
  758. package/dist/wall/system.js +39 -5
  759. package/dist/wall/tool.d.ts.map +1 -1
  760. package/dist/wall/tool.js +114 -50
  761. package/dist/wall/treatment-level-data.d.ts +3 -2
  762. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  763. package/dist/wall/treatment-level-data.js +17 -13
  764. package/dist/wall/treatments.d.ts +10 -10
  765. package/dist/wall/treatments.d.ts.map +1 -1
  766. package/dist/wall/treatments.js +67 -54
  767. package/dist/wall/wall-batch-system.d.ts +7 -0
  768. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  769. package/dist/wall/wall-batch-system.js +38 -3
  770. package/dist/wall/wall-batch.d.ts +6 -0
  771. package/dist/wall/wall-batch.d.ts.map +1 -1
  772. package/dist/wall/wall-batch.js +7 -1
  773. package/dist/window/definition.d.ts.map +1 -1
  774. package/dist/window/definition.js +60 -5
  775. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  776. package/dist/window/floorplan-affordances.js +8 -10
  777. package/dist/window/floorplan-move.d.ts.map +1 -1
  778. package/dist/window/floorplan-move.js +3 -1
  779. package/dist/window/floorplan.d.ts.map +1 -1
  780. package/dist/window/floorplan.js +145 -60
  781. package/dist/window/mechanism.d.ts +4 -0
  782. package/dist/window/mechanism.d.ts.map +1 -0
  783. package/dist/window/mechanism.js +20 -0
  784. package/dist/window/move-tool.d.ts.map +1 -1
  785. package/dist/window/move-tool.js +83 -54
  786. package/dist/window/paint.d.ts.map +1 -1
  787. package/dist/window/paint.js +3 -0
  788. package/dist/window/panel.d.ts.map +1 -1
  789. package/dist/window/panel.js +50 -144
  790. package/dist/window/placement.d.ts +23 -0
  791. package/dist/window/placement.d.ts.map +1 -0
  792. package/dist/window/placement.js +66 -0
  793. package/dist/window/preview.d.ts.map +1 -1
  794. package/dist/window/preview.js +2 -0
  795. package/dist/window/renderer.d.ts.map +1 -1
  796. package/dist/window/renderer.js +3 -2
  797. package/dist/window/tool.d.ts.map +1 -1
  798. package/dist/window/tool.js +130 -26
  799. package/dist/window/window-math.d.ts +6 -14
  800. package/dist/window/window-math.d.ts.map +1 -1
  801. package/dist/window/window-math.js +13 -22
  802. package/dist/zone/contextual-dimensions.d.ts.map +1 -1
  803. package/dist/zone/contextual-dimensions.js +6 -28
  804. package/dist/zone/definition.d.ts.map +1 -1
  805. package/dist/zone/definition.js +4 -3
  806. package/dist/zone/floorplan-affordances.d.ts +200 -0
  807. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  808. package/dist/zone/floorplan.d.ts +1 -1
  809. package/dist/zone/floorplan.d.ts.map +1 -1
  810. package/dist/zone/floorplan.js +93 -53
  811. package/dist/zone/quantities-panel.d.ts.map +1 -1
  812. package/dist/zone/quantities-panel.js +6 -33
  813. package/dist/zone/quick-measurement.d.ts +2 -2
  814. package/dist/zone/quick-measurement.d.ts.map +1 -1
  815. package/dist/zone/quick-measurement.js +6 -5
  816. package/dist/zone/renderer.d.ts +1 -1
  817. package/dist/zone/renderer.d.ts.map +1 -1
  818. package/dist/zone/renderer.js +58 -146
  819. package/dist/zone/room-clear-dimensions.js +3 -3
  820. package/dist/zone/room-documentation.d.ts.map +1 -1
  821. package/dist/zone/room-documentation.js +2 -6
  822. package/package.json +12 -12
  823. package/dist/block/slots.d.ts +0 -4
  824. package/dist/block/slots.d.ts.map +0 -1
  825. package/dist/block/slots.js +0 -17
  826. package/dist/cabinet/slots.d.ts +0 -4
  827. package/dist/cabinet/slots.d.ts.map +0 -1
  828. package/dist/cabinet/slots.js +0 -24
  829. package/dist/ceiling/slots.d.ts +0 -6
  830. package/dist/ceiling/slots.d.ts.map +0 -1
  831. package/dist/ceiling/slots.js +0 -7
  832. package/dist/column/slots.d.ts +0 -9
  833. package/dist/column/slots.d.ts.map +0 -1
  834. package/dist/column/slots.js +0 -19
  835. package/dist/door/slots.d.ts +0 -9
  836. package/dist/door/slots.d.ts.map +0 -1
  837. package/dist/door/slots.js +0 -20
  838. package/dist/elevator/slots.d.ts +0 -8
  839. package/dist/elevator/slots.d.ts.map +0 -1
  840. package/dist/elevator/slots.js +0 -17
  841. package/dist/fence/slots.d.ts +0 -10
  842. package/dist/fence/slots.d.ts.map +0 -1
  843. package/dist/fence/slots.js +0 -23
  844. package/dist/lean-to-extension/slots.d.ts +0 -5
  845. package/dist/lean-to-extension/slots.d.ts.map +0 -1
  846. package/dist/lean-to-extension/slots.js +0 -15
  847. package/dist/shared/opening-documentation-fields.d.ts +0 -16
  848. package/dist/shared/opening-documentation-fields.d.ts.map +0 -1
  849. package/dist/shared/opening-documentation-fields.js +0 -54
  850. package/dist/shelf/slots.d.ts +0 -9
  851. package/dist/shelf/slots.d.ts.map +0 -1
  852. package/dist/shelf/slots.js +0 -30
  853. package/dist/slab/slots.d.ts +0 -10
  854. package/dist/slab/slots.d.ts.map +0 -1
  855. package/dist/slab/slots.js +0 -20
  856. package/dist/stair/floor-stack.d.ts +0 -10
  857. package/dist/stair/floor-stack.d.ts.map +0 -1
  858. package/dist/stair/floor-stack.js +0 -115
  859. package/dist/stair/slots.d.ts +0 -7
  860. package/dist/stair/slots.d.ts.map +0 -1
  861. package/dist/stair/slots.js +0 -13
  862. package/dist/wall/slots.d.ts +0 -10
  863. package/dist/wall/slots.d.ts.map +0 -1
  864. package/dist/wall/slots.js +0 -84
  865. package/dist/window/slots.d.ts +0 -5
  866. package/dist/window/slots.d.ts.map +0 -1
  867. package/dist/window/slots.js +0 -11
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { RidgeVentNode as RidgeVentSchema, useScene, } from '@pascal-app/core';
4
- import { ActionButton, ActionGroup, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
3
+ import { useScene } from '@pascal-app/core';
4
+ import { ActionButton, ActionGroup, duplicateNodeAndPickUp, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Copy, Move, Trash2 } from 'lucide-react';
7
7
  import { useCallback } from 'react';
@@ -42,27 +42,9 @@ export default function RidgeVentPanel() {
42
42
  setSelection({ selectedIds: [] });
43
43
  }, [node, setMovingNode, setSelection]);
44
44
  const handleDuplicate = useCallback(() => {
45
- if (!node)
46
- return;
47
- triggerSFX('sfx:item-pick');
48
- const parentId = node.roofSegmentId;
49
- if (!parentId)
50
- return;
51
- const state = useScene.getState();
52
- const meta = typeof node.metadata === 'object' && node.metadata !== null
53
- ? node.metadata
54
- : {};
55
- const cloneInput = {
56
- ...node,
57
- id: undefined,
58
- metadata: { ...meta, isNew: true },
59
- };
60
- const cloned = RidgeVentSchema.parse(cloneInput);
61
- state.createNode(cloned, parentId);
62
- state.dirtyNodes.add(parentId);
63
- setMovingNode(cloned);
64
- setSelection({ selectedIds: [] });
65
- }, [node, setMovingNode, setSelection]);
45
+ if (node)
46
+ duplicateNodeAndPickUp(node);
47
+ }, [node]);
66
48
  const handleDelete = useCallback(() => {
67
49
  if (!(selectedId && node))
68
50
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ridge-vent/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,aAAa,EAMnB,MAAM,kBAAkB,CAAA;AAuDzB;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,iBAAiB,GAAI,qBAAqB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,uCAiMtE,CAAA;AAED,eAAe,iBAAiB,CAAA"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ridge-vent/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAKL,KAAK,aAAa,EAMnB,MAAM,kBAAkB,CAAA;AAuDzB;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,iBAAiB,GAAI,qBAAqB;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,uCA4MtE,CAAA;AAED,eAAe,iBAAiB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx } from "react/jsx-runtime";
3
3
  import { getEffectiveRoofSurfaceMaterial, getEffectiveSegmentSurfaceMaterial, normalizeRoofSegmentTrim, useLiveNodeOverrides, useRegistry, useScene, } from '@pascal-app/core';
4
- import { createMaterial, createMaterialFromPresetRef, createSurfaceRoleMaterial, getRoofMaterialArray, useNodeEvents, useViewer, } from '@pascal-app/viewer';
4
+ import { createMaterial, createSurfaceRoleMaterial, getRoofMaterialArray, resolveMaterialRef, useNodeEvents, useViewer, } from '@pascal-app/viewer';
5
5
  import { useEffect, useMemo, useRef } from 'react';
6
6
  import * as THREE from 'three';
7
7
  import { RIDGE_LIFT, resolveRidgeSnap } from '../shared/ridge-snap';
@@ -96,6 +96,7 @@ const RidgeVentRenderer = ({ node: storeNode }) => {
96
96
  const parentRoof = useScene((state) => segmentStore?.parentId
97
97
  ? state.nodes[segmentStore.parentId]
98
98
  : undefined);
99
+ const sceneMaterials = useScene((state) => state.materials);
99
100
  const segmentGeometryKey = ridgeVentSegmentGeometryKey(segment);
100
101
  const rotationY = node.rotation ?? 0;
101
102
  const snap = useMemo(() => segment && Math.abs(rotationY) < 1e-5
@@ -131,16 +132,14 @@ const RidgeVentRenderer = ({ node: storeNode }) => {
131
132
  const createDefaultTopMaterial = () => {
132
133
  const parentSpec = parentRoof ? getEffectiveRoofSurfaceMaterial(parentRoof, 'top') : undefined;
133
134
  const spec = segment ? getEffectiveSegmentSurfaceMaterial(segment, 'top', parentSpec) : null;
134
- if (typeof spec?.materialPreset === 'string') {
135
- const resolved = createMaterialFromPresetRef(spec.materialPreset, shading);
136
- if (resolved)
137
- return resolved;
138
- }
135
+ const resolved = resolveMaterialRef(spec?.materialPreset, sceneMaterials, shading);
136
+ if (resolved)
137
+ return resolved;
139
138
  if (spec?.material !== undefined) {
140
139
  return createMaterial(spec.material, shading);
141
140
  }
142
141
  const roofMaterials = parentRoof
143
- ? getRoofMaterialArray(parentRoof, shading, textures, colorPreset, sceneTheme)
142
+ ? getRoofMaterialArray(parentRoof, shading, textures, colorPreset, sceneTheme, null, sceneMaterials)
144
143
  : null;
145
144
  return (roofMaterials?.[3] ??
146
145
  createSurfaceRoleMaterial('roof', colorPreset, THREE.FrontSide, sceneTheme));
@@ -149,7 +148,8 @@ const RidgeVentRenderer = ({ node: storeNode }) => {
149
148
  return createMaterial(node.material, shading);
150
149
  }
151
150
  if (node.materialPreset) {
152
- return createMaterialFromPresetRef(node.materialPreset, shading) ?? createDefaultTopMaterial();
151
+ return (resolveMaterialRef(node.materialPreset, sceneMaterials, shading) ??
152
+ createDefaultTopMaterial());
153
153
  }
154
154
  return createDefaultTopMaterial();
155
155
  }, [
@@ -161,6 +161,7 @@ const RidgeVentRenderer = ({ node: storeNode }) => {
161
161
  node.materialPreset,
162
162
  segment,
163
163
  parentRoof,
164
+ sceneMaterials,
164
165
  ]);
165
166
  // Map vent-local geometry into the host segment's local frame (where the trim
166
167
  // cut prisms live). Recompose the same pose the inner mesh group is mounted
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/roof/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAKpB,MAAM,kBAAkB,CAAA;AASzB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAsFnC;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CAgK1D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/roof/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAKpB,MAAM,kBAAkB,CAAA;AAczB,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAsFnC;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,OAAO,QAAQ,CAqK1D,CAAA"}
@@ -1,6 +1,7 @@
1
1
  import { RoofNode as RoofNodeSchema, } from '@pascal-app/core';
2
- import { DRAFTING_SURFACE_EXTENSION_KEY } from '@pascal-app/editor';
2
+ import { DRAFTING_SURFACE_EXTENSION_KEY, PANEL_MODEL_EXTENSION, } from '@pascal-app/editor';
3
3
  import { buildRoofFloorplan } from './floorplan';
4
+ import { roofPanelModel } from './panel-model';
4
5
  import { roofParametrics } from './parametrics';
5
6
  import useRoofFootprintSource from './roof-footprint-source';
6
7
  import useRoofPlacementMode, { conicalRoofToolHintVisibility, standardRoofToolHintVisibility, } from './roof-placement-mode';
@@ -85,11 +86,12 @@ export const roofDefinition = {
85
86
  // Drafted as a 2-corner footprint (axis-aligned bbox), not a directional
86
87
  // edge → no angle-lock mode (grid / lines / off only).
87
88
  snapDraftDirectional: false,
88
- schemaVersion: 3,
89
+ schemaVersion: 4,
89
90
  schema: RoofNode,
90
91
  category: 'structure',
91
92
  surfaceRole: 'roof',
92
93
  extensions: {
94
+ [PANEL_MODEL_EXTENSION]: roofPanelModel,
93
95
  [DRAFTING_SURFACE_EXTENSION_KEY]: {
94
96
  kind: 'roof',
95
97
  },
@@ -103,6 +105,9 @@ export const roofDefinition = {
103
105
  selectable: { hitVolume: 'bbox' },
104
106
  duplicable: true,
105
107
  deletable: true,
108
+ // F2 layers stack inward from the covering-top plane along the facet
109
+ // normal; the body is their sum and the roof stores no thickness.
110
+ assembly: { reference: 'covering', measure: 'normal', body: () => null },
106
111
  // Contribute a plan AABB to the alignment-guide candidate pool so a roof
107
112
  // (and any moving sibling) snaps against the roof's outer silhouette.
108
113
  // Roof has no centred-box footprint — it's the union of its
@@ -219,6 +224,7 @@ export const roofDefinition = {
219
224
  parametrics: roofParametrics,
220
225
  handles: resolveRoofHandles,
221
226
  floorplan: buildRoofFloorplan,
227
+ rendersChildren: false,
222
228
  renderer: {
223
229
  kind: 'parametric',
224
230
  module: () => import('./renderer'),
@@ -1,4 +1,12 @@
1
1
  import { type FloorplanGeometry, type GeometryContext, type RoofNode } from '@pascal-app/core';
2
+ /**
3
+ * `roof-segment.pitch` is stored in DEGREES; a roof plan is annotated as the
4
+ * rise over a 12 run. 30.256° → tan 0.5833 × 12 → 7.00 → '7:12'. Rounded to
5
+ * the nearest half, so a modelled pitch a hair off a standard slope still
6
+ * reads as the slope the framer will cut. Returns '' for a flat roof, which
7
+ * has no slope to annotate.
8
+ */
9
+ export declare function roofPitchLabel(pitchDeg: number): string;
2
10
  /**
3
11
  * Roof-level floor-plan builder. Draws the whole merged-roof plan: the
4
12
  * unioned silhouette and every segment's ridge/hip/break linework. The
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/roof/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EACpB,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AAuIzB;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAwHjG"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/roof/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAEpB,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AA0BzB;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMvD;AA2LD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,eAAe,GAAG,iBAAiB,GAAG,IAAI,CAsMjG"}
@@ -1,5 +1,66 @@
1
- import { roofPlanOverlapEntryOwns, subtractPolygonsFromPolygon, unionPolygons, } from '@pascal-app/core';
1
+ import { getRoofSegmentVisibleTopBounds, roofPlanOverlapEntryOwns, subtractPolygonsFromPolygon, unionPolygons, } from '@pascal-app/core';
2
+ import { floorplanGeometryMetadata, readFloorplanContext } from '@pascal-app/editor';
2
3
  import { getConicalRoofPlanFootprint, getRoofSegmentPlanLinework } from '../roof-segment/floorplan';
4
+ /**
5
+ * `roof-segment.pitch` is stored in DEGREES; a roof plan is annotated as the
6
+ * rise over a 12 run. 30.256° → tan 0.5833 × 12 → 7.00 → '7:12'. Rounded to
7
+ * the nearest half, so a modelled pitch a hair off a standard slope still
8
+ * reads as the slope the framer will cut. Returns '' for a flat roof, which
9
+ * has no slope to annotate.
10
+ */
11
+ export function roofPitchLabel(pitchDeg) {
12
+ if (!Number.isFinite(pitchDeg) || pitchDeg <= 0)
13
+ return '';
14
+ const rise = Math.tan((pitchDeg * Math.PI) / 180) * 12;
15
+ if (!Number.isFinite(rise) || rise <= 0)
16
+ return '';
17
+ const rounded = Math.round(rise * 2) / 2;
18
+ return `${Number.isInteger(rounded) ? rounded : rounded.toFixed(1)}:12`;
19
+ }
20
+ /**
21
+ * One down-slope arrow per roof PLANE, in segment-local coordinates
22
+ * (lx = width axis, lz = depth axis) — the same local space
23
+ * `getRoofSegmentPlanLinework` returns ridges and hips in:
24
+ *
25
+ * gable / gambrel two planes falling away from the centre ridge (±lz)
26
+ * shed one plane, high eave at −lz falling to +lz
27
+ * hip / mansard / four planes, one off each eave
28
+ * dutch
29
+ * flat none
30
+ *
31
+ * Arrows run from just off the ridge to just short of the eave so the head
32
+ * lands inside the roof outline rather than on it.
33
+ */
34
+ function slopeArrows(node) {
35
+ const hw = Math.max(node.width, 0.01) / 2;
36
+ const hd = Math.max(node.depth, 0.01) / 2;
37
+ const along = (run) => ({ near: run * 0.14, far: run * 0.86 });
38
+ switch (node.roofType) {
39
+ case 'flat':
40
+ return [];
41
+ case 'shed':
42
+ // Unchanged from the linework builder: the 3D shed falls −lz → +lz.
43
+ return [{ tail: [0, -hd * 0.55], head: [0, hd * 0.55] }];
44
+ case 'gable':
45
+ case 'gambrel': {
46
+ const z = along(hd);
47
+ return [
48
+ { tail: [-hw * 0.35, z.near], head: [-hw * 0.35, z.far] },
49
+ { tail: [hw * 0.35, -z.near], head: [hw * 0.35, -z.far] },
50
+ ];
51
+ }
52
+ default: {
53
+ const z = along(hd);
54
+ const x = along(hw);
55
+ return [
56
+ { tail: [0, z.near], head: [0, z.far] },
57
+ { tail: [0, -z.near], head: [0, -z.far] },
58
+ { tail: [x.near, 0], head: [x.far, 0] },
59
+ { tail: [-x.near, 0], head: [-x.far, 0] },
60
+ ];
61
+ }
62
+ }
63
+ }
3
64
  function overlapEntry(entry, ctx) {
4
65
  const supportSegment = entry.roof.support?.kind === 'roof'
5
66
  ? ctx.resolve(entry.roof.support.roofSegmentId)
@@ -17,7 +78,7 @@ function overlapEntry(entry, ctx) {
17
78
  };
18
79
  }
19
80
  /** A segment's footprint + ridge/hip/break/slope linework, in world plan coords. */
20
- function buildSegPlan(roof, seg) {
81
+ function buildSegPlan(roof, seg, drafting) {
21
82
  const cosRoof = Math.cos(-roof.rotation);
22
83
  const sinRoof = Math.sin(-roof.rotation);
23
84
  const segCx = roof.position[0] + seg.position[0] * cosRoof - seg.position[2] * sinRoof;
@@ -39,17 +100,42 @@ function buildSegPlan(roof, seg) {
39
100
  const footprint = seg.roofType === 'conical'
40
101
  ? getConicalRoofPlanFootprint(seg).map(([x, z]) => tp(x, z))
41
102
  : [tp(-hw, -hd), tp(hw, -hd), tp(hw, hd), tp(-hw, hd)];
103
+ const ridges = lw.ridges.map(mapSeg);
104
+ const hips = lw.hips.map(mapSeg);
105
+ const breaks = lw.breaks.map(mapSeg);
106
+ if (!drafting) {
107
+ const slopes = lw.slope
108
+ ? [
109
+ {
110
+ tail: tp(lw.slope.tail[0], lw.slope.tail[1]),
111
+ head: tp(lw.slope.head[0], lw.slope.head[1]),
112
+ pitch: '',
113
+ },
114
+ ]
115
+ : [];
116
+ return { footprint, eave: footprint, ridges, hips, breaks, slopes };
117
+ }
118
+ // The drip edge: core's own visible-top bounds, which add the horizontal
119
+ // component of `overhang` (plus half the wall thickness and, on the sloped
120
+ // faces, the shingle projection) to the footprint on each side.
121
+ const edge = getRoofSegmentVisibleTopBounds(seg);
122
+ const pitch = roofPitchLabel(seg.pitch);
42
123
  return {
43
124
  footprint,
44
- ridges: lw.ridges.map(mapSeg),
45
- hips: lw.hips.map(mapSeg),
46
- breaks: lw.breaks.map(mapSeg),
47
- slope: lw.slope
48
- ? {
49
- tail: tp(lw.slope.tail[0], lw.slope.tail[1]),
50
- head: tp(lw.slope.head[0], lw.slope.head[1]),
51
- }
52
- : null,
125
+ eave: [
126
+ tp(edge.minX, edge.minZ),
127
+ tp(edge.maxX, edge.minZ),
128
+ tp(edge.maxX, edge.maxZ),
129
+ tp(edge.minX, edge.maxZ),
130
+ ],
131
+ ridges,
132
+ hips,
133
+ breaks,
134
+ slopes: slopeArrows(seg).map((arrow) => ({
135
+ tail: tp(arrow.tail[0], arrow.tail[1]),
136
+ head: tp(arrow.head[0], arrow.head[1]),
137
+ pitch,
138
+ })),
53
139
  };
54
140
  }
55
141
  function pointInPolygon(point, polygon) {
@@ -126,10 +212,13 @@ export function buildRoofFloorplan(node, ctx) {
126
212
  const segments = ctx.children.filter((c) => c.type === 'roof-segment');
127
213
  if (segments.length === 0)
128
214
  return null;
215
+ // Eave outlines, an arrow per plane, pitch tags and the 'roof-plan' role are
216
+ // sheet drafting; the editor plan keeps its outline, linework and one arrow.
217
+ const drafting = readFloorplanContext(ctx).drafting;
129
218
  const entries = segments.map((segment) => ({
130
219
  roof: node,
131
220
  segment,
132
- plan: buildSegPlan(node, segment),
221
+ plan: buildSegPlan(node, segment, drafting),
133
222
  }));
134
223
  for (const sibling of ctx.siblings) {
135
224
  if (sibling.type !== 'roof')
@@ -138,7 +227,7 @@ export function buildRoofFloorplan(node, ctx) {
138
227
  const segment = ctx.resolve(childId);
139
228
  if (segment?.type !== 'roof-segment')
140
229
  continue;
141
- entries.push({ roof: sibling, segment, plan: buildSegPlan(sibling, segment) });
230
+ entries.push({ roof: sibling, segment, plan: buildSegPlan(sibling, segment, drafting) });
142
231
  }
143
232
  }
144
233
  const currentEntries = entries.filter((entry) => entry.roof.id === node.id);
@@ -156,11 +245,15 @@ export function buildRoofFloorplan(node, ctx) {
156
245
  plan: entry.plan,
157
246
  cutters,
158
247
  footprints: subtractPolygonsFromPolygon(entry.plan.footprint, cutters),
248
+ eaves: subtractPolygonsFromPolygon(entry.plan.eave, cutters),
249
+ /** True when the drip edge is far enough outside the wall line to draw. */
250
+ hasOverhang: drafting && polygonSpread(entry.plan.eave) - polygonSpread(entry.plan.footprint) > 0.04,
159
251
  };
160
252
  });
161
253
  const rings = unionPolygons(visiblePlans.flatMap(({ footprints }) => footprints));
162
254
  if (rings.length === 0)
163
255
  return null;
256
+ const eaveRings = unionPolygons(visiblePlans.flatMap(({ eaves, hasOverhang }) => (hasOverhang ? eaves : [])));
164
257
  const view = ctx.viewState;
165
258
  const palette = view?.palette;
166
259
  const showSelectedChrome = (view?.selected ?? false) || (view?.highlighted ?? false);
@@ -168,6 +261,13 @@ export function buildRoofFloorplan(node, ctx) {
168
261
  const eaveWidth = showSelectedChrome ? 0.04 : 0.03;
169
262
  const ridgeWidth = showSelectedChrome ? 0.05 : 0.038;
170
263
  const hipWidth = showSelectedChrome ? 0.04 : 0.026;
264
+ const overhangWidth = showSelectedChrome ? 0.03 : 0.022;
265
+ // Drafted, two strata: the REFERENCE a floor plan always carries (the dashed
266
+ // overhang line — the roof flying past the walls) and the ROOF PLAN
267
+ // proper (outline, ridges, hips, arrows, pitches), which is the
268
+ // 'roof-plan' annotation — off over a floor plan until the Roof plan
269
+ // layer is on, the roof is selected, or the sheet IS the roof plan.
270
+ const reference = [];
171
271
  const children = [];
172
272
  const pushLine = (a, b, width) => {
173
273
  children.push({
@@ -182,7 +282,25 @@ export function buildRoofFloorplan(node, ctx) {
182
282
  pointerEvents: 'none',
183
283
  });
184
284
  };
185
- // Merged outline (eaves).
285
+ // The drip edge — the roof's actual outer boundary, overhang included —
286
+ // drawn DASHED under the wall line so the two never read as one edge. This
287
+ // is the convention every roof plan uses: solid where the roof meets the
288
+ // structure, dashed where it flies past it.
289
+ for (const ring of eaveRings) {
290
+ if (ring.length < 3)
291
+ continue;
292
+ reference.push({
293
+ kind: 'polygon',
294
+ points: ring.map(([x, z]) => [x, z]),
295
+ fill: 'none',
296
+ stroke: ink,
297
+ strokeWidth: overhangWidth,
298
+ strokeDasharray: '0.28 0.16',
299
+ strokeLinejoin: 'miter',
300
+ pointerEvents: 'none',
301
+ });
302
+ }
303
+ // Merged outline (wall line under the roof).
186
304
  for (const ring of rings) {
187
305
  if (ring.length < 3)
188
306
  continue;
@@ -212,9 +330,11 @@ export function buildRoofFloorplan(node, ctx) {
212
330
  pushLine(visible[0], visible[1], ridgeWidth);
213
331
  }
214
332
  }
215
- if (plan.slope) {
216
- const { tail, head } = plan.slope;
217
- const visibleSlope = clipLineByCutters([tail, head], cutters).at(-1);
333
+ // One down-slope arrow per roof plane, each tagged with the pitch in
334
+ // 12ths — the annotation a roof plan is read for. The arrow points the
335
+ // way water runs; the tag is the number the framer cuts to.
336
+ for (const slope of plan.slopes) {
337
+ const visibleSlope = clipLineByCutters([slope.tail, slope.head], cutters).at(-1);
218
338
  if (!visibleSlope)
219
339
  continue;
220
340
  const [visibleTail, visibleHead] = visibleSlope;
@@ -239,7 +359,63 @@ export function buildRoofFloorplan(node, ctx) {
239
359
  strokeLinejoin: 'round',
240
360
  pointerEvents: 'none',
241
361
  });
362
+ if (!slope.pitch || len < PITCH_LABEL_MIN_RUN)
363
+ continue;
364
+ // Set beside the shaft, clear of it, at the arrow's midpoint. The
365
+ // perpendicular is chosen so the tag always sits ABOVE its arrow (and
366
+ // to its right where the arrow runs vertically), so opposing slopes of
367
+ // the same roof do not put their tags on opposite sides.
368
+ let px = uz;
369
+ let pz = -ux;
370
+ if (pz > 1e-6 || (Math.abs(pz) <= 1e-6 && px < 0)) {
371
+ px = -px;
372
+ pz = -pz;
373
+ }
374
+ const mx = (visibleTail[0] + visibleHead[0]) / 2 + px * PITCH_LABEL_OFFSET;
375
+ const mz = (visibleTail[1] + visibleHead[1]) / 2 + pz * PITCH_LABEL_OFFSET;
376
+ children.push({
377
+ kind: 'text',
378
+ x: mx,
379
+ y: mz,
380
+ text: slope.pitch,
381
+ fontSize: PITCH_LABEL_FONT_SIZE,
382
+ fill: ink,
383
+ stroke: '#ffffff',
384
+ strokeWidth: PITCH_LABEL_FONT_SIZE * 0.3,
385
+ paintOrder: 'stroke',
386
+ fontFamily: 'system-ui, -apple-system, sans-serif',
387
+ fontWeight: 600,
388
+ textAnchor: 'middle',
389
+ dominantBaseline: 'central',
390
+ upright: true,
391
+ metadata: floorplanGeometryMetadata({ annotationRole: 'roof-pitch' }),
392
+ });
242
393
  }
243
394
  }
244
- return children.length > 0 ? { kind: 'group', children } : null;
395
+ if (!drafting)
396
+ return children.length > 0 ? { kind: 'group', children } : null;
397
+ if (reference.length === 0 && children.length === 0)
398
+ return null;
399
+ // A selected / highlighted roof shows its plan whatever the layer says —
400
+ // the user is looking at the roof.
401
+ const plan = showSelectedChrome
402
+ ? { kind: 'group', children }
403
+ : {
404
+ kind: 'group',
405
+ children,
406
+ metadata: floorplanGeometryMetadata({ annotationRole: 'roof-plan' }),
407
+ };
408
+ return { kind: 'group', children: children.length > 0 ? [...reference, plan] : reference };
409
+ }
410
+ /** Longest edge of a polygon's bounding box — how the overhang test compares. */
411
+ function polygonSpread(polygon) {
412
+ if (polygon.length === 0)
413
+ return 0;
414
+ const xs = polygon.map(([x]) => x);
415
+ const zs = polygon.map(([, z]) => z);
416
+ return Math.max(...xs) - Math.min(...xs) + (Math.max(...zs) - Math.min(...zs));
245
417
  }
418
+ const PITCH_LABEL_FONT_SIZE = 0.22;
419
+ const PITCH_LABEL_OFFSET = 0.24;
420
+ /** Below this arrow length the tag would sit on top of its own arrowhead. */
421
+ const PITCH_LABEL_MIN_RUN = 0.6;
@@ -0,0 +1,4 @@
1
+ import { type RoofNode } from '@pascal-app/core';
2
+ import { type NodePanelModel } from '@pascal-app/editor';
3
+ export declare const roofPanelModel: NodePanelModel<RoofNode>;
4
+ //# sourceMappingURL=panel-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-model.d.ts","sourceRoot":"","sources":["../../src/roof/panel-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EAEd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAEL,KAAK,cAAc,EAIpB,MAAM,oBAAoB,CAAA;AAG3B,eAAO,MAAM,cAAc,EAAE,cAAc,CAAC,QAAQ,CAyJnD,CAAA"}
@@ -0,0 +1,155 @@
1
+ import { nodeRegistry, useScene, } from '@pascal-app/core';
2
+ import { duplicateNodeAndPickUp, triggerSFX, useEditor, } from '@pascal-app/editor';
3
+ import { useViewer } from '@pascal-app/viewer';
4
+ export const roofPanelModel = {
5
+ rows({ node, nodes, update }) {
6
+ const select = (id) => useViewer.getState().setSelection({ selectedIds: [id] });
7
+ const activate = (kind) => {
8
+ triggerSFX('sfx:item-pick');
9
+ const editor = useEditor.getState();
10
+ editor.setTool(kind);
11
+ if (editor.mode !== 'build')
12
+ editor.setMode('build');
13
+ };
14
+ const segments = (node.children ?? [])
15
+ .map((id) => nodes[id])
16
+ .filter((child) => child?.type === 'roof-segment');
17
+ const segmentIds = new Set(segments.map((segment) => segment.id));
18
+ const rows = segments.map((segment, index) => ({
19
+ id: segment.id,
20
+ kind: 'choice',
21
+ section: 'Segments',
22
+ label: segment.name || `Segment ${index + 1}`,
23
+ value: segment.roofType,
24
+ onSelect: () => select(segment.id),
25
+ }));
26
+ rows.push({
27
+ id: 'add-segment',
28
+ kind: 'action',
29
+ section: 'Segments',
30
+ label: 'Draw Segment',
31
+ // Arming a tool ends the selection; the roof tool draws into the roof
32
+ // selected while it is armed, so hand it this one explicitly.
33
+ onSelect: () => {
34
+ activate('roof');
35
+ select(node.id);
36
+ },
37
+ });
38
+ for (const axis of [0, 1, 2])
39
+ rows.push({
40
+ id: `position-${axis}`,
41
+ kind: 'stepper',
42
+ section: 'Position',
43
+ label: 'XYZ'[axis],
44
+ value: node.position[axis],
45
+ unit: 'm',
46
+ step: 0.05,
47
+ min: -Infinity,
48
+ max: Infinity,
49
+ onChange: (value) => {
50
+ const live = useScene.getState().nodes[node.id];
51
+ const position = [...(live?.position ?? node.position)];
52
+ position[axis] = value;
53
+ update({ position });
54
+ },
55
+ });
56
+ rows.push({
57
+ id: 'rotation',
58
+ kind: 'stepper',
59
+ section: 'Position',
60
+ label: 'Rotation',
61
+ value: Math.round((node.rotation * 180) / Math.PI),
62
+ unit: '°',
63
+ step: 1,
64
+ min: -180,
65
+ max: 180,
66
+ onChange: (degrees) => update({ rotation: (degrees * Math.PI) / 180 }),
67
+ }, {
68
+ id: 'rotate',
69
+ kind: 'actions',
70
+ section: 'Position',
71
+ actions: [-1, 1].map((direction) => ({
72
+ id: `rotate-${direction}`,
73
+ label: direction < 0 ? '-45°' : '+45°',
74
+ onSelect: () => {
75
+ triggerSFX('sfx:item-rotate');
76
+ const live = useScene.getState().nodes[node.id];
77
+ update({ rotation: (live?.rotation ?? node.rotation) + (direction * Math.PI) / 4 });
78
+ },
79
+ })),
80
+ });
81
+ for (const child of Object.values(nodes)) {
82
+ if (!child ||
83
+ !('roofSegmentId' in child) ||
84
+ !child.roofSegmentId ||
85
+ !segmentIds.has(child.roofSegmentId))
86
+ continue;
87
+ rows.push({
88
+ id: child.id,
89
+ kind: 'action',
90
+ section: 'Elements',
91
+ label: child.name || nodeRegistry.get(child.type)?.presentation?.label || child.type,
92
+ onSelect: () => select(child.id),
93
+ });
94
+ }
95
+ for (const [kind, definition] of nodeRegistry.entries()) {
96
+ if (definition.presentation?.hidden ||
97
+ definition.capabilities.wallOpeningPlacement ||
98
+ (definition.capabilities.roofAccessory === undefined &&
99
+ definition.presentation?.paletteGroup !== 'roof-features'))
100
+ continue;
101
+ const icon = definition.presentation?.icon;
102
+ rows.push({
103
+ id: `add-${kind}`,
104
+ kind: 'action',
105
+ section: 'Features & extensions',
106
+ label: `Add ${definition.presentation?.label ?? kind}`,
107
+ icon: icon?.kind === 'url' ? { src: icon.src } : undefined,
108
+ onSelect: () => activate(kind),
109
+ });
110
+ }
111
+ rows.push({
112
+ id: 'roof-actions',
113
+ kind: 'actions',
114
+ section: 'Actions',
115
+ actions: [
116
+ {
117
+ id: 'move',
118
+ label: 'Move',
119
+ onSelect: () => {
120
+ const live = useScene.getState().nodes[node.id];
121
+ if (!live)
122
+ return;
123
+ triggerSFX('sfx:item-pick');
124
+ useEditor.getState().setMovingNode(live);
125
+ useViewer.getState().setSelection({ selectedIds: [] });
126
+ },
127
+ },
128
+ {
129
+ id: 'duplicate',
130
+ label: 'Duplicate',
131
+ onSelect: () => {
132
+ const live = useScene.getState().nodes[node.id];
133
+ if (live)
134
+ duplicateNodeAndPickUp(live);
135
+ },
136
+ },
137
+ {
138
+ id: 'delete',
139
+ label: 'Delete',
140
+ onSelect: () => {
141
+ const live = useScene.getState().nodes[node.id];
142
+ if (!live)
143
+ return;
144
+ triggerSFX('sfx:item-delete');
145
+ useScene.getState().deleteNode(node.id);
146
+ if (live.parentId)
147
+ useScene.getState().markDirty(live.parentId);
148
+ useViewer.getState().setSelection({ selectedIds: [] });
149
+ },
150
+ },
151
+ ],
152
+ });
153
+ return rows;
154
+ },
155
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/roof/panel.tsx"],"names":[],"mappings":"AAkCA,MAAM,CAAC,OAAO,UAAU,SAAS,uCA4gBhC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/roof/panel.tsx"],"names":[],"mappings":"AAmCA,MAAM,CAAC,OAAO,UAAU,SAAS,uCAogBhC"}