@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,10 +1,8 @@
1
- import { resolveStairTotalRise, StairNode as StairNodeSchema, stairFootprintAABB, useScene, } from '@pascal-app/core';
2
- const MIN_CURVED_RISE = 0.3;
3
- const MIN_CURVED_WIDTH = 0.4;
4
- const MIN_CURVED_INNER_RADIUS_SPIRAL = 0.05;
5
- const MIN_CURVED_INNER_RADIUS_CURVED = 0.2;
6
- const MIN_CURVED_SWEEP = Math.PI / 12;
7
- const MAX_CURVED_SWEEP = Math.PI * 2 - 0.05;
1
+ import { planStairSweepEdit, resolveStairTotalRise, resolveStairWinder, StairNode as StairNodeSchema, stairFootprintAABB, stairSlots, useScene, } from '@pascal-app/core';
2
+ const MIN_CURVED_RISE = 0.001;
3
+ const MIN_CURVED_WIDTH = 0.001;
4
+ const MIN_CURVED_INNER_RADIUS_SPIRAL = 0.001;
5
+ const MIN_CURVED_INNER_RADIUS_CURVED = 0.001;
8
6
  const CURVED_RISE_OFFSET = 0.35;
9
7
  const CURVED_WIDTH_HANDLE_OFFSET = 0.5;
10
8
  const CURVED_RADIAL_OFFSET = 0.16;
@@ -22,7 +20,7 @@ const STAIR_ROTATE_CORNER_OFFSET = 0.4;
22
20
  const STAIR_ROTATE_RING_OFFSET = 0.08;
23
21
  const STAIR_MOVE_FRONT_OFFSET = 0.35;
24
22
  function readTotalRise(node) {
25
- return Math.max(resolveStairTotalRise(node, useScene.getState().nodes), 0.1);
23
+ return Math.max(resolveStairTotalRise(node, useScene.getState().nodes), 0.001);
26
24
  }
27
25
  function readCurvedStairGeometry(node) {
28
26
  const isSpiral = node.stairType === 'spiral';
@@ -84,12 +82,13 @@ function readStraightStairMoveBounds(node, sceneApi) {
84
82
  if (!transform)
85
83
  return;
86
84
  const halfWidth = segment.width / 2;
87
- const corners = [
88
- [-halfWidth, 0],
89
- [halfWidth, 0],
90
- [-halfWidth, segment.length],
91
- [halfWidth, segment.length],
92
- ];
85
+ const corners = resolveStairWinder(segment)?.footprint ??
86
+ [
87
+ [-halfWidth, 0],
88
+ [halfWidth, 0],
89
+ [-halfWidth, segment.length],
90
+ [halfWidth, segment.length],
91
+ ];
93
92
  for (const [x, z] of corners) {
94
93
  const [rx, rz] = rotateLocalXZ(x, z, transform.rotation);
95
94
  minX = Math.min(minX, transform.position[0] + rx);
@@ -204,26 +203,7 @@ function curvedSweepHandle(end) {
204
203
  kind: 'arc-resize',
205
204
  axis: 'angular',
206
205
  end,
207
- apply: (initial, delta) => {
208
- const initialSweep = initial.sweepAngle ?? Math.PI / 2;
209
- const initialRotation = initial.rotation ?? 0;
210
- const sweepSign = Math.sign(initialSweep) || 1;
211
- // END handle: cursor angle delta IS the sweep delta.
212
- // START handle: cursor angle delta is the negation of the sweep delta.
213
- const sweepDelta = end === 'end' ? delta : -delta;
214
- const targetSweep = initialSweep + sweepDelta;
215
- const clampedAbs = Math.min(MAX_CURVED_SWEEP, Math.max(MIN_CURVED_SWEEP, Math.abs(targetSweep)));
216
- const newSweep = sweepSign * clampedAbs;
217
- const appliedDelta = newSweep - initialSweep;
218
- // Re-orient the stair so the OPPOSITE edge stays world-fixed:
219
- // END fixed-start: ΔR = −ΔS / 2
220
- // START fixed-end : ΔR = +ΔS / 2
221
- const rotationShift = end === 'end' ? -appliedDelta / 2 : appliedDelta / 2;
222
- return {
223
- sweepAngle: newSweep,
224
- rotation: initialRotation + rotationShift,
225
- };
226
- },
206
+ apply: (initial, delta) => planStairSweepEdit(initial, delta, end),
227
207
  placement: {
228
208
  position: (n) => {
229
209
  const g = readCurvedStairGeometry(n);
@@ -331,14 +311,13 @@ function stairHandles(node) {
331
311
  handles.push(stairRotateHandle(), stairMoveHandle());
332
312
  return handles;
333
313
  }
334
- import { computeStairSegmentFloorStackTransforms, getStairFloorPlacedFootprints, } from './floor-stack';
314
+ import { computeStairSegmentFloorStackTransforms, getStairFloorPlacedFootprints, } from '@pascal-app/core';
335
315
  import { buildStairFloorplan } from './floorplan';
336
316
  import { curvedStairInnerRadiusAffordance, curvedStairSweepAffordance, curvedStairWidthAffordance, segmentLengthAffordance, segmentWidthAffordance, stairRotateAffordance, } from './floorplan-affordances';
337
317
  import { stairFloorplanMoveTarget } from './floorplan-move';
338
318
  import { stairPaint } from './paint';
339
319
  import { stairParametrics } from './parametrics';
340
320
  import { StairNode } from './schema';
341
- import { stairSlots } from './slots';
342
321
  /**
343
322
  * Stair — Stage A. Composite node like roof: owns overall framing,
344
323
  * `stair-segment` children own per-flight geometry. Wrap-exports the
@@ -346,7 +325,7 @@ import { stairSlots } from './slots';
346
325
  */
347
326
  export const stairDefinition = {
348
327
  kind: 'stair',
349
- schemaVersion: 1,
328
+ schemaVersion: 2,
350
329
  schema: StairNode,
351
330
  category: 'structure',
352
331
  extensions: {
@@ -375,6 +354,7 @@ export const stairDefinition = {
375
354
  return rest;
376
355
  },
377
356
  capabilities: {
357
+ surfacePlacement: 'floor-only',
378
358
  selectable: { hitVolume: 'bbox' },
379
359
  // A stair has no centred box footprint: straight = a cumulative
380
360
  // `stair-segment` chain, curved / spiral = an annular sector. Hand the
@@ -401,6 +381,7 @@ export const stairDefinition = {
401
381
  },
402
382
  parametrics: stairParametrics,
403
383
  handles: stairHandles,
384
+ rendersChildren: false,
404
385
  renderer: {
405
386
  kind: 'parametric',
406
387
  module: () => import('./renderer'),
@@ -1,5 +1,5 @@
1
1
  import { type FloorplanGeometry, type GeometryContext, type StairNode } from '@pascal-app/core';
2
- import type { FloorplanStairArrowEntry, FloorplanStairEntry } from '@pascal-app/editor';
2
+ import type { FloorplanStairArrowEntry, FloorplanStairEntry } from './plan-entry';
3
3
  export type StairPlanDirection = 'up' | 'down';
4
4
  export declare function resolveStairPlanDirection(stair: StairNode, activeLevelId: string | null | undefined): StairPlanDirection;
5
5
  export declare function resolveStraightStairDirectionArrow(entry: FloorplanStairEntry, direction: StairPlanDirection): FloorplanStairArrowEntry | null;
@@ -1 +1 @@
1
- {"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../../src/stair/documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAGpB,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EAEpB,MAAM,oBAAoB,CAAA;AAgB3B,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,MAAM,CAAA;AAE9C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,kBAAkB,CAUpB;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,kBAAkB,GAC5B,wBAAwB,GAAG,IAAI,CA0BjC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CAYrB"}
1
+ {"version":3,"file":"documentation.d.ts","sourceRoot":"","sources":["../../src/stair/documentation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAKpB,KAAK,SAAS,EAEf,MAAM,kBAAkB,CAAA;AAOzB,OAAO,KAAK,EACV,wBAAwB,EACxB,mBAAmB,EAEpB,MAAM,cAAc,CAAA;AAUrB,MAAM,MAAM,kBAAkB,GAAG,IAAI,GAAG,MAAM,CAAA;AAE9C,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,SAAS,EAChB,aAAa,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GACvC,kBAAkB,CAUpB;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,mBAAmB,EAC1B,SAAS,EAAE,kBAAkB,GAC5B,wBAAwB,GAAG,IAAI,CA0BjC;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,mBAAmB,EAC1B,GAAG,EAAE,eAAe,GACnB,iBAAiB,EAAE,CAYrB"}
@@ -1,4 +1,4 @@
1
- import { resolveStairTotalRise, useScene, } from '@pascal-app/core';
1
+ import { resolveStairArcDimensions, resolveStairTotalRise, resolveStairWinder, useScene, } from '@pascal-app/core';
2
2
  import { floorplanGeometryMetadata, readFloorplanContext } from '@pascal-app/editor';
3
3
  import { formatConstructionLength, } from '../shared/construction-length';
4
4
  const ANNOTATION_OFFSET = 0.28;
@@ -80,6 +80,12 @@ function buildStraightDocumentation(stair, entry, direction, unit, profile, metr
80
80
  for (const segmentEntry of entry.segments) {
81
81
  if (segmentEntry.segment.segmentType !== 'stair')
82
82
  continue;
83
+ if (segmentEntry.segment.winder) {
84
+ const segment = segmentEntry.segment, layout = resolveStairWinder(segment);
85
+ const anchor = segmentEntry.polygon[0];
86
+ geometries.push(annotationText({ x: anchor.x + 0.18, y: anchor.y + 0.18 }, `${segment.stepCount} R @ ${formatConstructionLength(segment.height / segment.stepCount, unit, profile, { metricNotation })} · WINDER T ${formatConstructionLength(layout.going, unit, profile, { metricNotation })} · CLR W ${formatConstructionLength(segment.width, unit, profile, { metricNotation })}`, ANNOTATION_FONT_SIZE, stroke));
87
+ continue;
88
+ }
83
89
  const frame = segmentFrame(segmentEntry);
84
90
  if (!frame)
85
91
  continue;
@@ -104,16 +110,10 @@ function buildStraightDocumentation(stair, entry, direction, unit, profile, metr
104
110
  return geometries;
105
111
  }
106
112
  function buildCurvedDocumentation(stair, direction, unit, profile, metricNotation, stroke) {
107
- const stairType = stair.stairType === 'spiral' ? 'spiral' : 'curved';
108
- const stepCount = Math.max(stairType === 'spiral' ? 6 : 4, Math.round(stair.stepCount));
109
- const sweep = normalizedSweep(stair);
113
+ const layout = resolveStairArcDimensions(stair, resolveStairTotalRise(stair, useScene.getState().nodes));
114
+ const { stepCount, sweepAngle: sweep, innerRadius, outerRadius, walkingRadius, riserHeight, going: treadDepth, } = layout;
110
115
  const startAngle = -stair.rotation - sweep / 2;
111
116
  const endAngle = startAngle + sweep;
112
- const innerRadius = Math.max(stairType === 'spiral' ? 0.05 : 0.2, stair.innerRadius);
113
- const outerRadius = innerRadius + stair.width;
114
- const walkingRadius = innerRadius + stair.width / 2;
115
- const riserHeight = resolveStairTotalRise(stair, useScene.getState().nodes) / stepCount;
116
- const treadDepth = (Math.abs(sweep) * walkingRadius) / stepCount;
117
117
  const center = { x: stair.position[0], y: stair.position[2] };
118
118
  const noteAngle = (startAngle + endAngle) / 2;
119
119
  const notePoint = arcPoint(center, outerRadius + ANNOTATION_OFFSET, noteAngle);
@@ -121,7 +121,7 @@ function buildCurvedDocumentation(stair, direction, unit, profile, metricNotatio
121
121
  const directionPoint = arcPoint(center, walkingRadius, directionAngle);
122
122
  const breakAngle = startAngle + sweep * BREAK_POSITION;
123
123
  const geometries = [
124
- annotationText(notePoint, `${stepCount} R @ ${formatConstructionLength(riserHeight, unit, profile, { metricNotation })} · T(CL) ${formatConstructionLength(treadDepth, unit, profile, { metricNotation })} · CLR W ${formatConstructionLength(stair.width, unit, profile, { metricNotation })}`, ANNOTATION_FONT_SIZE, stroke),
124
+ annotationText(notePoint, `${stepCount} R @ ${formatConstructionLength(riserHeight, unit, profile, { metricNotation })} · T(CL) ${formatConstructionLength(treadDepth, unit, profile, { metricNotation })} · CLR W ${formatConstructionLength(layout.width, unit, profile, { metricNotation })}`, ANNOTATION_FONT_SIZE, stroke),
125
125
  annotationText(directionPoint, direction === 'up' ? 'UP' : 'DN', DIRECTION_FONT_SIZE, stroke),
126
126
  buildCurvedBreakLine(center, innerRadius, outerRadius, breakAngle, stroke),
127
127
  ];
@@ -212,13 +212,6 @@ function segmentFrame(segmentEntry) {
212
212
  rightMid: interpolate(backRight, frontRight, 0.5),
213
213
  };
214
214
  }
215
- function normalizedSweep(stair) {
216
- const defaultSweep = stair.stairType === 'spiral' ? Math.PI * 2 : Math.PI / 2;
217
- const sweep = stair.sweepAngle ?? defaultSweep;
218
- if (Math.abs(sweep) < Math.PI * 2)
219
- return sweep;
220
- return Math.sign(sweep || 1) * (Math.PI * 2 - 0.001);
221
- }
222
215
  function arcPoint(center, radius, angle) {
223
216
  return { x: center.x + Math.cos(angle) * radius, y: center.y + Math.sin(angle) * radius };
224
217
  }
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/stair/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,mBAAmB,EAExB,KAAK,SAAS,EAIf,MAAM,kBAAkB,CAAA;AAwCzB;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,CAAC,SAAS,CAiCjE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,SAAS,CAgClE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,SAAS,CA+BrE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAAmB,CAAC,SAAS,CAiD3E,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAAmB,CAAC,SAAS,CAgChE,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,SAAS,CAkDrE,CAAA"}
1
+ {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/stair/floorplan-affordances.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,mBAAmB,EAGxB,KAAK,SAAS,EAIf,MAAM,kBAAkB,CAAA;AAmCzB;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,mBAAmB,CAAC,SAAS,CAiCjE,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAAmB,CAAC,SAAS,CAgClE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,SAAS,CA+BrE,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,gCAAgC,EAAE,mBAAmB,CAAC,SAAS,CAiD3E,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,qBAAqB,EAAE,mBAAmB,CAAC,SAAS,CAgChE,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,0BAA0B,EAAE,mBAAmB,CAAC,SAAS,CAyCrE,CAAA"}
@@ -1,16 +1,11 @@
1
- import { useLiveNodeOverrides, useScene, } from '@pascal-app/core';
1
+ import { createAngleAccumulator, planStairSweepEdit, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
2
2
  import { isAngleSnapActive } from '@pascal-app/editor';
3
3
  import { rotateAffordanceDelta } from '../shared/rotate-affordance';
4
- // Minimums + max sweep mirror the 3D handles in
5
- // `packages/editor/src/components/editor/stair-segment-handles.tsx` so a 2D
6
- // drag can't push a stair past what the 3D drag would allow.
7
- const MIN_SEGMENT_WIDTH = 0.4;
8
- const MIN_SEGMENT_LENGTH = 0.4;
9
- const MIN_CURVED_WIDTH = 0.4;
10
- const MIN_CURVED_INNER_RADIUS_SPIRAL = 0.05;
11
- const MIN_CURVED_INNER_RADIUS_CURVED = 0.2;
12
- const MIN_CURVED_SWEEP = Math.PI / 12;
13
- const MAX_CURVED_SWEEP = Math.PI * 2 - 0.05;
4
+ const MIN_SEGMENT_WIDTH = 0.001;
5
+ const MIN_SEGMENT_LENGTH = 0.001;
6
+ const MIN_CURVED_WIDTH = 0.001;
7
+ const MIN_CURVED_INNER_RADIUS_SPIRAL = 0.001;
8
+ const MIN_CURVED_INNER_RADIUS_CURVED = 0.001;
14
9
  function noopSession() {
15
10
  return {
16
11
  affectedIds: [],
@@ -241,30 +236,19 @@ export const curvedStairSweepAffordance = {
241
236
  const { end } = payload;
242
237
  const stairId = node.id;
243
238
  const initialSweep = node.sweepAngle ?? (node.stairType === 'spiral' ? Math.PI * 2 : Math.PI / 2);
244
- const sweepSign = Math.sign(initialSweep) || 1;
245
239
  const initialRotation = node.rotation;
246
240
  const cx = node.position[0];
247
241
  const cz = node.position[2];
248
242
  const initialAngle = Math.atan2(initialPlanPoint[1] - cz, initialPlanPoint[0] - cx);
243
+ const accumulateAngle = createAngleAccumulator(initialAngle);
249
244
  let lastSweep = initialSweep;
250
245
  let lastRotation = initialRotation;
251
246
  return {
252
247
  affectedIds: [stairId],
253
248
  apply({ planPoint }) {
254
249
  const currentAngle = Math.atan2(planPoint[1] - cz, planPoint[0] - cx);
255
- let delta = currentAngle - initialAngle;
256
- // Wrap to [-π, π] so a drag crossing ±π doesn't flip sign mid-gesture.
257
- while (delta > Math.PI)
258
- delta -= 2 * Math.PI;
259
- while (delta < -Math.PI)
260
- delta += 2 * Math.PI;
261
- const sweepDelta = end === 'end' ? delta : -delta;
262
- const targetSweep = initialSweep + sweepDelta;
263
- const clampedAbs = Math.min(MAX_CURVED_SWEEP, Math.max(MIN_CURVED_SWEEP, Math.abs(targetSweep)));
264
- const newSweep = sweepSign * clampedAbs;
265
- const appliedDelta = newSweep - initialSweep;
266
- const rotationShift = end === 'end' ? -appliedDelta / 2 : appliedDelta / 2;
267
- const newRotation = initialRotation + rotationShift;
250
+ const delta = accumulateAngle(currentAngle);
251
+ const { sweepAngle: newSweep, rotation: newRotation } = planStairSweepEdit({ sweepAngle: initialSweep, rotation: initialRotation }, delta, end);
268
252
  lastSweep = newSweep;
269
253
  lastRotation = newRotation;
270
254
  useLiveNodeOverrides.getState().set(stairId, {
@@ -1,26 +1,4 @@
1
1
  import type { FloorplanGeometry, GeometryContext, StairNode } from '@pascal-app/core';
2
- /**
3
- * Stage C floor-plan emitter for stair. The stair is the parent; its
4
- * children are the `stair-segment`s whose transforms are *cumulative*
5
- * (each flight attaches to the previous segment's end via
6
- * `computeFloorplanStairSegmentTransforms` — `attachmentSide` rotates
7
- * the chain ±π/2, segment length advances along the chain). Because no
8
- * individual segment can compute its polygon in isolation, the stair
9
- * emits the whole stack as one registry entry; `stair-segment` itself
10
- * has no `def.floorplan` (the registry layer renders the parent here
11
- * and skips children that don't ship a builder).
12
- *
13
- * The actual cumulative walk + segment / arrow / inner-band / tread-bar
14
- * geometry lives in `editor/src/lib/floorplan/stairs.ts` via
15
- * `buildFloorplanStairEntry`. We re-export that from `@pascal-app/editor`
16
- * and emit `FloorplanGeometry` primitives over its output — same shape
17
- * pattern the legacy `<FloorplanStairLayer>` consumed, minus the
18
- * per-pixel SVG drawing (the registry's `FloorplanGeometryRenderer`
19
- * handles that). Curved + spiral stairs fall back to a single curved
20
- * hit polygon (`buildFloorplanStairEntry` already returns it); the
21
- * arc-band rendering with steps along the sweep is not yet ported —
22
- * a follow-up will add either an `arc` primitive or expose the
23
- * segment-sampler helpers so we can emit a stitched polyline.
24
- */
2
+ /** The stair parent emits its complete cumulative segment chain. */
25
3
  export declare function buildStairFloorplan(stair: StairNode, ctx: GeometryContext): FloorplanGeometry | null;
26
4
  //# sourceMappingURL=floorplan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/stair/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EACf,SAAS,EAEV,MAAM,kBAAkB,CAAA;AAuBzB;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CAoc1B"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/stair/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EAEjB,eAAe,EACf,SAAS,EAEV,MAAM,kBAAkB,CAAA;AAiCzB,oEAAoE;AACpE,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,SAAS,EAChB,GAAG,EAAE,eAAe,GACnB,iBAAiB,GAAG,IAAI,CA8gB1B"}
@@ -1,38 +1,40 @@
1
+ import { computeSegmentTransforms, measureStairDetail, resolveStairArcDimensions, resolveStairHandrailPaths, resolveStairRailPaths, resolveStairWalkingPaths, rotateXZ, } from '@pascal-app/core';
1
2
  // Offset from the stair's footprint edge to the rotation chevron's
2
3
  // origin. Same magnitude as `STAIR_ROTATE_CORNER_OFFSET` in
3
4
  // `definition.ts` so the 2D handle visually lines up with where the 3D
4
5
  // curved-arrow gizmo would sit at the matching world point.
5
6
  const STAIR_ROTATE_PLAN_OFFSET = 0.4;
6
- import { buildFloorplanStairEntry, buildSvgAnnularSectorPath, buildSvgArcPath, buildSvgArrowHeadPoints, floorplanGeometryMetadata, getArcPlanPoint, } from '@pascal-app/editor';
7
+ import { buildSvgAnnularSectorPath, buildSvgArcPath, buildSvgArrowHeadPoints, floorplanGeometryMetadata, getArcPlanPoint, } from '@pascal-app/editor';
7
8
  import { buildStairDocumentation, resolveStairPlanDirection, resolveStraightStairDirectionArrow, stairPlanBreakStep, } from './documentation';
8
- /**
9
- * Stage C floor-plan emitter for stair. The stair is the parent; its
10
- * children are the `stair-segment`s whose transforms are *cumulative*
11
- * (each flight attaches to the previous segment's end via
12
- * `computeFloorplanStairSegmentTransforms` — `attachmentSide` rotates
13
- * the chain ±π/2, segment length advances along the chain). Because no
14
- * individual segment can compute its polygon in isolation, the stair
15
- * emits the whole stack as one registry entry; `stair-segment` itself
16
- * has no `def.floorplan` (the registry layer renders the parent here
17
- * and skips children that don't ship a builder).
18
- *
19
- * The actual cumulative walk + segment / arrow / inner-band / tread-bar
20
- * geometry lives in `editor/src/lib/floorplan/stairs.ts` via
21
- * `buildFloorplanStairEntry`. We re-export that from `@pascal-app/editor`
22
- * and emit `FloorplanGeometry` primitives over its output — same shape
23
- * pattern the legacy `<FloorplanStairLayer>` consumed, minus the
24
- * per-pixel SVG drawing (the registry's `FloorplanGeometryRenderer`
25
- * handles that). Curved + spiral stairs fall back to a single curved
26
- * hit polygon (`buildFloorplanStairEntry` already returns it); the
27
- * arc-band rendering with steps along the sweep is not yet ported —
28
- * a follow-up will add either an `arc` primitive or expose the
29
- * segment-sampler helpers so we can emit a stitched polyline.
30
- */
9
+ import { buildFloorplanStairEntry } from './plan-entry';
10
+ /** The stair parent emits its complete cumulative segment chain. */
31
11
  export function buildStairFloorplan(stair, ctx) {
32
- const segments = (ctx.children ?? []).filter((child) => child.type === 'stair-segment' && child.visible !== false);
33
- const entry = buildFloorplanStairEntry(stair, segments);
12
+ const segments = (ctx.children ?? []).filter((child) => child.type === 'stair-segment');
13
+ const detail = measureStairDetail(stair, (ctx.children ?? []).filter((child) => child.type === 'stair-segment'));
14
+ const entry = buildFloorplanStairEntry(stair, segments, !!detail.error);
34
15
  if (!entry)
35
16
  return null;
17
+ if (detail.error)
18
+ return {
19
+ kind: 'group',
20
+ children: [
21
+ ...entry.hitPolygons.map((polygon) => ({
22
+ kind: 'polygon',
23
+ points: toFloorplanPoints(polygon),
24
+ fill: 'none',
25
+ stroke: '#b45309',
26
+ strokeWidth: 0.025,
27
+ })),
28
+ {
29
+ kind: 'text',
30
+ x: stair.position[0],
31
+ y: stair.position[2],
32
+ text: 'Stair detail unavailable — inspect dimensions',
33
+ fontSize: 0.15,
34
+ fill: '#b45309',
35
+ },
36
+ ],
37
+ };
36
38
  const view = ctx.viewState;
37
39
  const palette = view?.palette;
38
40
  const isSelected = view?.selected ?? false;
@@ -98,7 +100,23 @@ export function buildStairFloorplan(stair, ctx) {
98
100
  // (~lines 235 / 375 of stair-segment-handles.tsx).
99
101
  // Skip when the stair is being placed — placement-mode arrows would
100
102
  // compete with the cursor follow.
101
- if (isSelected && !view?.moving) {
103
+ if (isSelected && !view?.moving && segmentEntry.segment.winder) {
104
+ const index = segments.findIndex((segment) => segment.id === segmentEntry.segment.id), transform = computeSegmentTransforms(segments)[index];
105
+ const angle = stair.rotation + transform.rotation;
106
+ const [ax, az] = rotateXZ(1, 0, angle);
107
+ for (const side of ['left', 'right']) {
108
+ const [sx, sz] = rotateXZ(((side === 'right' ? 1 : -1) * segmentEntry.segment.width) / 2, 0, transform.rotation);
109
+ const [wx, wz] = rotateXZ(transform.position[0] + sx, transform.position[2] + sz, stair.rotation);
110
+ children.push({
111
+ kind: 'move-arrow',
112
+ point: [stair.position[0] + wx, stair.position[2] + wz],
113
+ angle: Math.atan2(az, ax) + (side === 'left' ? Math.PI : 0),
114
+ affordance: 'segment-width',
115
+ payload: { segmentId: segmentEntry.segment.id, side, axisX: [ax, az] },
116
+ });
117
+ }
118
+ }
119
+ if (isSelected && !view?.moving && !segmentEntry.segment.winder) {
102
120
  const poly = segmentEntry.polygon;
103
121
  // Polygon corners (from `getFloorplanStairSegmentPolygon`):
104
122
  // 0 back-left 1 back-right
@@ -162,39 +180,25 @@ export function buildStairFloorplan(stair, ctx) {
162
180
  }
163
181
  }
164
182
  else {
165
- // Curved / spiral — full arc-band chrome. Mirrors the legacy
166
- // `<FloorplanStairLayer>` curved/spiral branches in
167
- // floorplan-panel.tsx (~line 285+).
168
- const normalizedSweepAngle = getNormalizedFloorplanStairSweepAngle(stair);
169
- const sectorStartAngle = -stair.rotation - normalizedSweepAngle / 2;
170
- const sectorEndAngle = sectorStartAngle + normalizedSweepAngle;
171
- const spiralLandingSweep = getFloorplanSpiralLandingSweep(stair, normalizedSweepAngle);
172
- // SVG `A` (arc) draws a single sub-360° segment. Once the base sweep
173
- // is near a full turn and we add up to 0.75π of integrated landing
174
- // on top, the total `visualSectorEnd - sectorStart` overflows 2π and
175
- // the path becomes malformed (the whole stair chrome breaks). Cap
176
- // the COMBINED visual sweep to just under a full revolution — past
177
- // that, the landing visually overlaps the start of the arc, which
178
- // is exactly the multi-turn "stack on top of each other" behaviour
179
- // we want for spirals with > 360° rotation.
180
- const rawVisualSweep = normalizedSweepAngle + spiralLandingSweep;
181
- const sweepCap = Math.PI * 2 - 0.001;
182
- const visualSweep = Math.sign(rawVisualSweep || 1) * Math.min(Math.abs(rawVisualSweep), sweepCap);
183
- const visualSectorEndAngle = sectorStartAngle + visualSweep;
183
+ const layout = resolveStairArcDimensions(stair, 0);
184
+ const normalizedSweepAngle = layout.sweepAngle;
185
+ const sectorStartAngle = -stair.rotation - layout.sweepAngle / 2;
186
+ const sectorEndAngle = sectorStartAngle + layout.sweepAngle;
187
+ const visualSweep = Math.sign(layout.sweepAngle || 1) *
188
+ Math.min(Math.abs(layout.sweepAngle + layout.landingSweep + layout.nosingSweep), Math.PI * 2);
189
+ const visualSectorStartAngle = sectorStartAngle - layout.nosingSweep;
190
+ const visualSectorEndAngle = visualSectorStartAngle + visualSweep;
184
191
  const stairCenter = { x: stair.position[0], y: stair.position[2] };
185
- const innerRadius = Math.max(stairType === 'spiral' ? 0.05 : 0.2, stair.innerRadius ?? (stairType === 'spiral' ? 0.2 : 0.9));
186
- const outerRadius = innerRadius + stair.width;
187
- const centerlineRadius = innerRadius + stair.width / 2;
192
+ const { innerRadius, outerRadius, walkingRadius: centerlineRadius } = layout;
188
193
  // Stroke widths are screen pixels (paired with `vectorEffect:
189
194
  // 'non-scaling-stroke'` below). World-metre values like 0.02 would
190
- // render as sub-pixel — invisible at every zoom. Matches the legacy
191
- // `<FloorplanStairLayer>` curved/spiral branches.
195
+ // render as sub-pixel — invisible at every zoom.
192
196
  const outerArcWidth = showSelectedChrome ? 2 : 1.4;
193
197
  const innerArcWidth = showSelectedChrome ? 1.7 : 1.2;
194
198
  // 1. Annular sector — the filled shaft footprint.
195
199
  children.push({
196
200
  kind: 'path',
197
- d: buildSvgAnnularSectorPath(stairCenter, innerRadius, outerRadius, sectorStartAngle, visualSectorEndAngle),
201
+ d: buildSvgAnnularSectorPath(stairCenter, innerRadius, outerRadius, visualSectorStartAngle, visualSectorEndAngle),
198
202
  fill,
199
203
  fillOpacity: 1,
200
204
  stroke: 'none',
@@ -203,7 +207,7 @@ export function buildStairFloorplan(stair, ctx) {
203
207
  // 2. Outer + inner arcs.
204
208
  children.push({
205
209
  kind: 'path',
206
- d: buildSvgArcPath(stairCenter, outerRadius, sectorStartAngle, visualSectorEndAngle),
210
+ d: buildSvgArcPath(stairCenter, outerRadius, visualSectorStartAngle, visualSectorEndAngle),
207
211
  fill: 'none',
208
212
  stroke: stairStroke,
209
213
  strokeWidth: outerArcWidth,
@@ -211,16 +215,14 @@ export function buildStairFloorplan(stair, ctx) {
211
215
  });
212
216
  children.push({
213
217
  kind: 'path',
214
- d: buildSvgArcPath(stairCenter, innerRadius, sectorStartAngle, visualSectorEndAngle),
218
+ d: buildSvgArcPath(stairCenter, innerRadius, visualSectorStartAngle, visualSectorEndAngle),
215
219
  fill: 'none',
216
220
  stroke: stairStroke,
217
221
  strokeWidth: innerArcWidth,
218
222
  vectorEffect: 'non-scaling-stroke',
219
223
  });
220
224
  // 3. Step lines (radial spokes).
221
- const stepBase = stairType === 'spiral' ? 6 : 4;
222
- const stepCount = Math.max(stepBase, Math.round(stair.stepCount ?? 10));
223
- const stepSweep = normalizedSweepAngle / stepCount;
225
+ const { stepCount, stepSweep } = layout;
224
226
  const breakStep = stairPlanBreakStep(stepCount);
225
227
  for (let index = 0; index <= stepCount; index += 1) {
226
228
  if (index >= breakStep && index !== stepCount)
@@ -230,9 +232,7 @@ export function buildStairFloorplan(stair, ctx) {
230
232
  const outer = getArcPlanPoint(stairCenter, outerRadius, angle);
231
233
  const isLast = index === stepCount;
232
234
  const isFirst = index === 0;
233
- // Curved: regular stroke everywhere, but both the starting and the
234
- // ending step lines are bolded (matches the legacy
235
- // `<FloorplanStairLayer>` curved branch).
235
+ // Curved stairs accent both ascent portals.
236
236
  // Spiral: only the last step is accented + bolded.
237
237
  const isEmphasised = stairType === 'spiral' ? isLast : isFirst || isLast;
238
238
  const stepWidth = stairType === 'spiral' ? (isEmphasised ? 1.8 : 1.15) : isEmphasised ? 1.5 : 1.1;
@@ -278,12 +278,12 @@ export function buildStairFloorplan(stair, ctx) {
278
278
  // 6. Direction arrow — head only, at the upper end of the sweep.
279
279
  const direction = resolveStairPlanDirection(stair, ctx.parent?.type === 'level' ? ctx.parent.id : stair.parentId);
280
280
  const arrowAngle = direction === 'up'
281
- ? visualSectorEndAngle - stepSweep * 0.8
281
+ ? sectorEndAngle + layout.landingSweep - stepSweep * 0.8
282
282
  : sectorStartAngle + stepSweep * 0.8;
283
283
  const arrowPoint = getArcPlanPoint(stairCenter, centerlineRadius, arrowAngle);
284
284
  const sweepDirection = normalizedSweepAngle >= 0 ? 1 : -1;
285
285
  const tangentAngle = arrowAngle + sweepDirection * (direction === 'up' ? Math.PI / 2 : -Math.PI / 2);
286
- const arrowSize = clamp(stair.width * (stairType === 'spiral' ? 0.18 : 0.16), 0.1, 0.18);
286
+ const arrowSize = clamp(layout.width * (stairType === 'spiral' ? 0.18 : 0.16), 0.1, 0.18);
287
287
  const headPts = buildSvgArrowHeadPoints(arrowPoint, tangentAngle, arrowSize);
288
288
  children.push({
289
289
  kind: 'polygon',
@@ -378,6 +378,44 @@ export function buildStairFloorplan(stair, ctx) {
378
378
  });
379
379
  }
380
380
  }
381
+ if (isSelected) {
382
+ const chain = (ctx.children ?? []).filter((child) => child.type === 'stair-segment');
383
+ for (const path of resolveStairWalkingPaths(stair, chain, 0)) {
384
+ children.push({
385
+ kind: 'polyline',
386
+ points: path.map(([x, , z]) => [
387
+ stair.position[0] + x * Math.cos(stair.rotation) + z * Math.sin(stair.rotation),
388
+ stair.position[2] - x * Math.sin(stair.rotation) + z * Math.cos(stair.rotation),
389
+ ]),
390
+ fill: 'none',
391
+ stroke: '#2563eb',
392
+ strokeWidth: 0.035,
393
+ strokeDasharray: '0.12 0.08',
394
+ metadata: floorplanGeometryMetadata({
395
+ annotationRole: 'stair-annotation',
396
+ renderPass: 'overlay',
397
+ }),
398
+ });
399
+ }
400
+ }
401
+ const railNodes = Object.fromEntries([stair, ...ctx.children].map((node) => [node.id, node]));
402
+ const guardPaths = stair.railingPath === 'continuous' ||
403
+ stair.railingStyle === 'glass' ||
404
+ stair.railingStyle === 'metal'
405
+ ? resolveStairRailPaths(stair, railNodes)
406
+ : [];
407
+ for (const path of [...guardPaths, ...resolveStairHandrailPaths(stair, railNodes)])
408
+ children.push({
409
+ kind: 'polyline',
410
+ points: path.points.map(([x, , z]) => [
411
+ stair.position[0] + x * Math.cos(stair.rotation) + z * Math.sin(stair.rotation),
412
+ stair.position[2] - x * Math.sin(stair.rotation) + z * Math.cos(stair.rotation),
413
+ ]),
414
+ fill: 'none',
415
+ stroke: stairStroke,
416
+ strokeWidth: 0.02,
417
+ metadata: floorplanGeometryMetadata({ annotationRole: 'stair-annotation' }),
418
+ });
381
419
  children.push(...buildStairDocumentation(stair, entry, ctx));
382
420
  // Whole-stair rotation handle — sister to the 3D `stairRotateHandle`
383
421
  // (arc-resize, curved-arrow). 2D doesn't have a dedicated curved-arrow
@@ -398,13 +436,13 @@ export function buildStairFloorplan(stair, ctx) {
398
436
  let localX;
399
437
  let localZ;
400
438
  if (stairType === 'straight') {
401
- const stairWidth = Math.max(stair.width ?? 1, 0.4);
439
+ const stairWidth = Math.max(stair.width ?? 1, 0.001);
402
440
  localX = stairWidth / 2 + STAIR_ROTATE_PLAN_OFFSET;
403
441
  localZ = -STAIR_ROTATE_PLAN_OFFSET;
404
442
  }
405
443
  else {
406
444
  const isSpiral = stairType === 'spiral';
407
- const innerR = Math.max(isSpiral ? 0.05 : 0.2, stair.innerRadius ?? (isSpiral ? 0.2 : 0.9));
445
+ const innerR = Math.max(0.001, stair.innerRadius ?? (isSpiral ? 0.2 : 0.9));
408
446
  const outerR = innerR + (stair.width ?? 1);
409
447
  const sweep = stair.sweepAngle ?? (isSpiral ? Math.PI * 2 : Math.PI / 2);
410
448
  const radius = outerR + STAIR_ROTATE_PLAN_OFFSET;
@@ -444,25 +482,3 @@ function toFloorplanPoints(points) {
444
482
  function clamp(value, min, max) {
445
483
  return Math.min(max, Math.max(min, value));
446
484
  }
447
- // Inlined from `editor/lib/floorplan/stairs.ts` — those are private
448
- // helpers in the legacy file. Both are pure derivations from the stair
449
- // node, so they live with the registry-driven emitter.
450
- function getNormalizedFloorplanStairSweepAngle(stair) {
451
- const stairType = stair.stairType ?? 'straight';
452
- const baseSweepAngle = stair.sweepAngle ?? (stairType === 'spiral' ? Math.PI * 2 : Math.PI / 2);
453
- if (Math.abs(baseSweepAngle) >= Math.PI * 2) {
454
- return Math.sign(baseSweepAngle || 1) * (Math.PI * 2 - 0.001);
455
- }
456
- return baseSweepAngle;
457
- }
458
- function getFloorplanSpiralLandingSweep(stair, sweepAngle) {
459
- if ((stair.stairType ?? 'straight') !== 'spiral' ||
460
- (stair.topLandingMode ?? 'none') !== 'integrated') {
461
- return 0;
462
- }
463
- const innerRadius = Math.max(0.05, stair.innerRadius ?? 0.9);
464
- const width = Math.max(stair.width ?? 1, 0.4);
465
- const landingDepth = Math.max(0.3, stair.topLandingDepth ?? Math.max(width * 0.9, 0.8));
466
- return (Math.min(Math.PI * 0.75, landingDepth / Math.max(innerRadius + width / 2, 0.1)) *
467
- Math.sign(sweepAngle || 1));
468
- }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * One coherent glass-panel guard laid out along a rail path — a modern framed
3
+ * glass balustrade in metres: a slim square post at each end (and every bay
4
+ * ≤ 4 ft between), a flat cap over them, and one flat tempered-glass panel per
5
+ * bay, point-fixed to its flanking posts by small edge clamps. It shares the
6
+ * path sampling, corner finding and post stations in `guard-path.ts` with the
7
+ * baluster, cable and deck guards, so a straight flight, a chained L/U landing
8
+ * turn, a winder, a curved or spiral sweep and an integrated top landing all
9
+ * read as the same glass rail; only the sections and the glass infill differ.
10
+ *
11
+ * The panels are the physical intent of a glass rail, not a fiction: a tempered
12
+ * pane is rigid and flat, so on a curved or spiral sweep it cannot follow the
13
+ * arc. Each panel is therefore a flat parallelogram spanning the straight chord
14
+ * between two consecutive posts, with plumb vertical edges inset from each post
15
+ * by a reveal gap and a top/bottom clearance to the cap and the nosing line.
16
+ * Adjacent panels meet at a post with twice the reveal between them, never
17
+ * sharing or crossing a vertex. On a straight flight the collinear posts make
18
+ * those chords read as one plane.
19
+ *
20
+ * A flat chord between two posts on a curve lies inside the rail curve by its
21
+ * sagitta — on the outer rail that is up to tens of centimetres toward the
22
+ * treads, so a chord laid on the posts would push the pane well past the guard
23
+ * line into the walking volume. When the caller supplies `insideWalk` (which
24
+ * side of a point is the walkable surface), each bay measures how far its flat
25
+ * chord sags toward that surface and shifts the whole pane — and its clamps —
26
+ * radially outward by that sag plus the pane's half-thickness, so the pane's
27
+ * walking-facing face sits at or outside the rail line across the entire bay.
28
+ * The inner rail's chord sags into the void, away from the walkable surface, so
29
+ * it is left on the line; a straight run has no sag; neither is shifted. The
30
+ * frame is pure `GuardBox` data; the panels are the corner parametrics the
31
+ * renderer extrudes with metre UVs. No Three.js.
32
+ *
33
+ * `reach` runs the cap that far past the top vertex along the final slope to die
34
+ * into a post standing there; `topPost: false` then omits the top post.
35
+ * `postThrough` runs the posts past the cap with a small cap of their own.
36
+ */
37
+ import { type GuardBox, type GuardRail, type Vec3 } from './guard-path';
38
+ export type GlassGuardOptions = {
39
+ railHeight: number;
40
+ /** Metres between posts along the run; omit (or Infinity) for ends only. */
41
+ postSpacing?: number;
42
+ topPost?: boolean;
43
+ postThrough?: boolean;
44
+ /** Metres the cap runs past the top vertex, along the final slope. */
45
+ reach?: number;
46
+ /** Whether a horizontal point (in the path's frame) is on the walkable
47
+ * surface. When given, a bay whose flat chord sags toward that surface shifts
48
+ * its pane radially outward to keep the pane's face off the walking volume. */
49
+ insideWalk?: (x: number, z: number) => boolean;
50
+ };
51
+ /** A flat glass panel spanning one bay, as the parallelogram the renderer
52
+ * extrudes: `start` is its inset bottom corner on the nosing line, `yaw` the
53
+ * plan heading of its chord, and the panel rises `rise` over `run` horizontally
54
+ * with its lower and upper edges `bottom` and `top` above the nosing line. */
55
+ export type GlassPanel = {
56
+ start: Vec3;
57
+ yaw: number;
58
+ run: number;
59
+ rise: number;
60
+ bottom: number;
61
+ top: number;
62
+ thickness: number;
63
+ };
64
+ export type GlassGuard = {
65
+ frame: GuardBox[];
66
+ panels: GlassPanel[];
67
+ };
68
+ /** The glass guard's single flat cap rail. Shared with the flight connector so a
69
+ * bridge between flights carries the same cap as the guards it joins. */
70
+ export declare function glassGuardRails(railHeight: number): GuardRail[];
71
+ export declare function buildGlassGuard(points: Vec3[], options: GlassGuardOptions): GlassGuard;
72
+ //# sourceMappingURL=glass-guard.d.ts.map