@pascal-app/nodes 1.0.5 → 1.0.7

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 (566) hide show
  1. package/README.md +1 -0
  2. package/dist/beam/actions/move-endpoint.d.ts +24 -0
  3. package/dist/beam/actions/move-endpoint.d.ts.map +1 -0
  4. package/dist/beam/actions/move-endpoint.js +54 -0
  5. package/dist/beam/definition.d.ts +14 -0
  6. package/dist/beam/definition.d.ts.map +1 -0
  7. package/dist/beam/definition.js +173 -0
  8. package/dist/beam/draft-settings.d.ts +17 -0
  9. package/dist/beam/draft-settings.d.ts.map +1 -0
  10. package/dist/beam/draft-settings.js +81 -0
  11. package/dist/beam/drafting.d.ts +35 -0
  12. package/dist/beam/drafting.d.ts.map +1 -0
  13. package/dist/beam/drafting.js +103 -0
  14. package/dist/beam/floorplan-affordances.d.ts +8 -0
  15. package/dist/beam/floorplan-affordances.d.ts.map +1 -0
  16. package/dist/beam/floorplan-affordances.js +40 -0
  17. package/dist/beam/floorplan-move.d.ts +11 -0
  18. package/dist/beam/floorplan-move.d.ts.map +1 -0
  19. package/dist/beam/floorplan-move.js +54 -0
  20. package/dist/beam/floorplan.d.ts +11 -0
  21. package/dist/beam/floorplan.d.ts.map +1 -0
  22. package/dist/beam/floorplan.js +91 -0
  23. package/dist/beam/geometry.d.ts +19 -0
  24. package/dist/beam/geometry.d.ts.map +1 -0
  25. package/dist/beam/geometry.js +63 -0
  26. package/dist/beam/index.d.ts +3 -0
  27. package/dist/beam/index.d.ts.map +1 -0
  28. package/dist/beam/index.js +2 -0
  29. package/dist/beam/move-endpoint-tool.d.ts +21 -0
  30. package/dist/beam/move-endpoint-tool.d.ts.map +1 -0
  31. package/dist/beam/move-endpoint-tool.js +49 -0
  32. package/dist/beam/move-tool.d.ts +12 -0
  33. package/dist/beam/move-tool.d.ts.map +1 -0
  34. package/dist/beam/move-tool.js +114 -0
  35. package/dist/beam/panel-model.d.ts +28 -0
  36. package/dist/beam/panel-model.d.ts.map +1 -0
  37. package/dist/beam/panel-model.js +123 -0
  38. package/dist/beam/panel.d.ts +13 -0
  39. package/dist/beam/panel.d.ts.map +1 -0
  40. package/dist/beam/panel.js +107 -0
  41. package/dist/beam/parametrics.d.ts +3 -0
  42. package/dist/beam/parametrics.d.ts.map +1 -0
  43. package/dist/beam/parametrics.js +4 -0
  44. package/dist/beam/renderer.d.ts +13 -0
  45. package/dist/beam/renderer.d.ts.map +1 -0
  46. package/dist/beam/renderer.js +36 -0
  47. package/dist/beam/schema.d.ts +2 -0
  48. package/dist/beam/schema.d.ts.map +1 -0
  49. package/dist/beam/schema.js +1 -0
  50. package/dist/beam/tool.d.ts +13 -0
  51. package/dist/beam/tool.d.ts.map +1 -0
  52. package/dist/beam/tool.js +152 -0
  53. package/dist/box-vent/panel.d.ts.map +1 -1
  54. package/dist/box-vent/panel.js +8 -7
  55. package/dist/cabinet/batchable.d.ts +10 -0
  56. package/dist/cabinet/batchable.d.ts.map +1 -0
  57. package/dist/cabinet/batchable.js +12 -0
  58. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  59. package/dist/cabinet/compartment-card.js +142 -46
  60. package/dist/cabinet/countertop-layout.d.ts +5 -0
  61. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  62. package/dist/cabinet/definition.d.ts.map +1 -1
  63. package/dist/cabinet/definition.js +3 -0
  64. package/dist/cabinet/dimension-input.d.ts +6 -0
  65. package/dist/cabinet/dimension-input.d.ts.map +1 -0
  66. package/dist/cabinet/dimension-input.js +8 -0
  67. package/dist/cabinet/essential-controls.d.ts.map +1 -1
  68. package/dist/cabinet/essential-controls.js +82 -17
  69. package/dist/cabinet/index.d.ts +1 -1
  70. package/dist/cabinet/index.d.ts.map +1 -1
  71. package/dist/cabinet/index.js +1 -1
  72. package/dist/cabinet/kitchen-catalog.d.ts +17 -4
  73. package/dist/cabinet/kitchen-catalog.d.ts.map +1 -1
  74. package/dist/cabinet/kitchen-catalog.js +45 -7
  75. package/dist/cabinet/kitchen-collection.d.ts.map +1 -1
  76. package/dist/cabinet/kitchen-collection.js +21 -5
  77. package/dist/cabinet/kitchen-module-actions.d.ts.map +1 -1
  78. package/dist/cabinet/kitchen-module-actions.js +107 -14
  79. package/dist/cabinet/neighbor-placement.d.ts +10 -0
  80. package/dist/cabinet/neighbor-placement.d.ts.map +1 -1
  81. package/dist/cabinet/panel.d.ts.map +1 -1
  82. package/dist/cabinet/panel.js +127 -50
  83. package/dist/cabinet/run-finishing.d.ts +5 -0
  84. package/dist/cabinet/run-finishing.d.ts.map +1 -1
  85. package/dist/cabinet/run-ops.d.ts +5 -0
  86. package/dist/cabinet/run-ops.d.ts.map +1 -1
  87. package/dist/cabinet/run-panel.d.ts.map +1 -1
  88. package/dist/cabinet/run-panel.js +203 -52
  89. package/dist/cabinet/tool.d.ts.map +1 -1
  90. package/dist/cabinet/tool.js +8 -5
  91. package/dist/ceiling/build-up-section.d.ts +7 -0
  92. package/dist/ceiling/build-up-section.d.ts.map +1 -0
  93. package/dist/ceiling/build-up-section.js +57 -0
  94. package/dist/ceiling/definition.d.ts.map +1 -1
  95. package/dist/ceiling/definition.js +3 -1
  96. package/dist/ceiling/floorplan-affordances.d.ts +112 -0
  97. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  98. package/dist/ceiling/materials.d.ts +5 -0
  99. package/dist/ceiling/materials.d.ts.map +1 -1
  100. package/dist/ceiling/materials.js +17 -0
  101. package/dist/ceiling/panel-model.d.ts +13 -0
  102. package/dist/ceiling/panel-model.d.ts.map +1 -0
  103. package/dist/ceiling/panel-model.js +49 -0
  104. package/dist/ceiling/panel.d.ts.map +1 -1
  105. package/dist/ceiling/panel.js +82 -18
  106. package/dist/ceiling/renderer.d.ts.map +1 -1
  107. package/dist/ceiling/renderer.js +10 -4
  108. package/dist/ceiling/tool.d.ts.map +1 -1
  109. package/dist/ceiling/tool.js +24 -4
  110. package/dist/chimney/panel.d.ts.map +1 -1
  111. package/dist/chimney/panel.js +113 -41
  112. package/dist/column/definition.d.ts.map +1 -1
  113. package/dist/column/definition.js +3 -0
  114. package/dist/column/floorplan.d.ts.map +1 -1
  115. package/dist/column/floorplan.js +17 -0
  116. package/dist/column/hosted-resize.d.ts +28 -1
  117. package/dist/column/hosted-resize.d.ts.map +1 -1
  118. package/dist/column/panel.d.ts.map +1 -1
  119. package/dist/column/panel.js +125 -37
  120. package/dist/column/post-options.d.ts +10 -0
  121. package/dist/column/post-options.d.ts.map +1 -0
  122. package/dist/column/post-options.js +71 -0
  123. package/dist/column/post-placement.d.ts +78 -0
  124. package/dist/column/post-placement.d.ts.map +1 -0
  125. package/dist/column/post-placement.js +157 -0
  126. package/dist/column/post-section.d.ts +17 -0
  127. package/dist/column/post-section.d.ts.map +1 -0
  128. package/dist/column/post-section.js +95 -0
  129. package/dist/column/post-tool.d.ts +11 -0
  130. package/dist/column/post-tool.d.ts.map +1 -0
  131. package/dist/column/post-tool.js +94 -0
  132. package/dist/column/tool.d.ts +3 -10
  133. package/dist/column/tool.d.ts.map +1 -1
  134. package/dist/column/tool.js +13 -1
  135. package/dist/cupola/panel.d.ts.map +1 -1
  136. package/dist/cupola/panel.js +14 -7
  137. package/dist/door/actions.d.ts +7 -0
  138. package/dist/door/actions.d.ts.map +1 -0
  139. package/dist/door/actions.js +32 -0
  140. package/dist/door/contextual-dimensions.d.ts.map +1 -1
  141. package/dist/door/contextual-dimensions.js +11 -1
  142. package/dist/door/definition.d.ts.map +1 -1
  143. package/dist/door/definition.js +34 -7
  144. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  145. package/dist/door/floorplan-affordances.js +5 -2
  146. package/dist/door/floorplan-move.d.ts.map +1 -1
  147. package/dist/door/floorplan-move.js +28 -6
  148. package/dist/door/floorplan.d.ts +2 -0
  149. package/dist/door/floorplan.d.ts.map +1 -1
  150. package/dist/door/floorplan.js +89 -16
  151. package/dist/door/move-tool.d.ts.map +1 -1
  152. package/dist/door/move-tool.js +60 -16
  153. package/dist/door/paint.d.ts +2 -7
  154. package/dist/door/paint.d.ts.map +1 -1
  155. package/dist/door/paint.js +26 -2
  156. package/dist/door/panel.d.ts.map +1 -1
  157. package/dist/door/panel.js +242 -90
  158. package/dist/door/parametrics.js +1 -1
  159. package/dist/door/placement.d.ts.map +1 -1
  160. package/dist/door/placement.js +9 -2
  161. package/dist/door/swing.d.ts +22 -0
  162. package/dist/door/swing.d.ts.map +1 -0
  163. package/dist/door/swing.js +36 -0
  164. package/dist/door/tool.d.ts.map +1 -1
  165. package/dist/door/tool.js +76 -29
  166. package/dist/dormer/panel-actions-section.d.ts.map +1 -1
  167. package/dist/dormer/panel-actions-section.js +3 -1
  168. package/dist/dormer/panel-position-section.d.ts.map +1 -1
  169. package/dist/dormer/panel-position-section.js +4 -3
  170. package/dist/dormer/panel-windows-section.d.ts.map +1 -1
  171. package/dist/dormer/panel-windows-section.js +38 -1
  172. package/dist/dormer/panel.d.ts.map +1 -1
  173. package/dist/dormer/panel.js +24 -18
  174. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  175. package/dist/downspout/inspector-editors.js +3 -2
  176. package/dist/duct-fitting/inspector-editors.d.ts.map +1 -1
  177. package/dist/duct-fitting/inspector-editors.js +6 -1
  178. package/dist/duct-fitting/tool.d.ts.map +1 -1
  179. package/dist/duct-fitting/tool.js +11 -2
  180. package/dist/duct-terminal/tool.d.ts.map +1 -1
  181. package/dist/duct-terminal/tool.js +11 -2
  182. package/dist/elevator/panel.d.ts.map +1 -1
  183. package/dist/elevator/panel.js +41 -18
  184. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  185. package/dist/eyebrow-vent/panel.js +16 -6
  186. package/dist/fence/drafting.d.ts +2 -3
  187. package/dist/fence/drafting.d.ts.map +1 -1
  188. package/dist/fence/drafting.js +2 -3
  189. package/dist/fence/inspector-editors.d.ts.map +1 -1
  190. package/dist/fence/inspector-editors.js +64 -21
  191. package/dist/fence/move-endpoint-tool.d.ts.map +1 -1
  192. package/dist/fence/move-endpoint-tool.js +11 -2
  193. package/dist/fence/system.d.ts.map +1 -1
  194. package/dist/fence/system.js +13 -0
  195. package/dist/fence-feature/actions.d.ts.map +1 -1
  196. package/dist/fence-feature/actions.js +5 -2
  197. package/dist/fence-feature/inspector.d.ts.map +1 -1
  198. package/dist/fence-feature/inspector.js +150 -34
  199. package/dist/fence-feature/move-session.d.ts +1 -1
  200. package/dist/floor-opening/floorplan.d.ts +29 -6
  201. package/dist/floor-opening/floorplan.d.ts.map +1 -1
  202. package/dist/floor-opening/floorplan.js +172 -14
  203. package/dist/gutter/downspouts-panel.d.ts.map +1 -1
  204. package/dist/gutter/downspouts-panel.js +14 -2
  205. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  206. package/dist/hvac-equipment/tool.js +3 -2
  207. package/dist/i18n/definition-messages.d.ts +5 -0
  208. package/dist/i18n/definition-messages.d.ts.map +1 -0
  209. package/dist/i18n/definition-messages.js +771 -0
  210. package/dist/index.d.ts +4 -1
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +6 -1
  213. package/dist/item/authored-params.d.ts.map +1 -1
  214. package/dist/item/authored-params.js +19 -4
  215. package/dist/item/floorplan.d.ts +1 -1
  216. package/dist/item/floorplan.d.ts.map +1 -1
  217. package/dist/item/panel.d.ts.map +1 -1
  218. package/dist/item/panel.js +9 -7
  219. package/dist/liquid-line/tool.d.ts.map +1 -1
  220. package/dist/liquid-line/tool.js +10 -3
  221. package/dist/measurement/tool.d.ts +1 -1
  222. package/dist/measurement/tool.d.ts.map +1 -1
  223. package/dist/measurement/tool.js +8 -8
  224. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  225. package/dist/pipe-fitting/tool.js +3 -2
  226. package/dist/pipe-trap/tool.d.ts.map +1 -1
  227. package/dist/pipe-trap/tool.js +7 -2
  228. package/dist/procedural-item/renderer.d.ts.map +1 -1
  229. package/dist/procedural-item/renderer.js +8 -1
  230. package/dist/ridge-vent/panel.d.ts.map +1 -1
  231. package/dist/ridge-vent/panel.js +22 -9
  232. package/dist/roof/barrel-panel.d.ts.map +1 -1
  233. package/dist/roof/barrel-panel.js +7 -3
  234. package/dist/roof/definition.d.ts.map +1 -1
  235. package/dist/roof/definition.js +33 -3
  236. package/dist/roof/floorplan-overrides.d.ts +22 -0
  237. package/dist/roof/floorplan-overrides.d.ts.map +1 -0
  238. package/dist/roof/floorplan-overrides.js +46 -0
  239. package/dist/roof/floorplan-tool.d.ts +9 -0
  240. package/dist/roof/floorplan-tool.d.ts.map +1 -0
  241. package/dist/roof/floorplan-tool.js +168 -0
  242. package/dist/roof/floorplan.d.ts.map +1 -1
  243. package/dist/roof/floorplan.js +131 -41
  244. package/dist/roof/glazing-controls.d.ts +2 -1
  245. package/dist/roof/glazing-controls.d.ts.map +1 -1
  246. package/dist/roof/glazing-controls.js +51 -13
  247. package/dist/roof/glazing-panel-editor.d.ts.map +1 -1
  248. package/dist/roof/glazing-panel-editor.js +40 -13
  249. package/dist/roof/glazing-panel.d.ts.map +1 -1
  250. package/dist/roof/glazing-panel.js +73 -9
  251. package/dist/roof/paint.d.ts +19 -0
  252. package/dist/roof/paint.d.ts.map +1 -0
  253. package/dist/roof/paint.js +158 -0
  254. package/dist/roof/panel.d.ts.map +1 -1
  255. package/dist/roof/panel.js +90 -22
  256. package/dist/roof/renderer.d.ts.map +1 -1
  257. package/dist/roof/renderer.js +13 -2
  258. package/dist/roof/roof-footprint-source.d.ts +17 -0
  259. package/dist/roof/roof-footprint-source.d.ts.map +1 -1
  260. package/dist/roof/roof-footprint-source.js +14 -0
  261. package/dist/roof/roof-footprint.d.ts +36 -2
  262. package/dist/roof/roof-footprint.d.ts.map +1 -1
  263. package/dist/roof/roof-footprint.js +124 -2
  264. package/dist/roof/roof-materials.d.ts.map +1 -1
  265. package/dist/roof/roof-materials.js +10 -1
  266. package/dist/roof/roof-placement-mode.d.ts +0 -2
  267. package/dist/roof/roof-placement-mode.d.ts.map +1 -1
  268. package/dist/roof/roof-placement-mode.js +8 -6
  269. package/dist/roof/roof-plan-creases.d.ts +50 -0
  270. package/dist/roof/roof-plan-creases.d.ts.map +1 -0
  271. package/dist/roof/roof-plan-creases.js +194 -0
  272. package/dist/roof/roof-ridge-mode.d.ts +20 -0
  273. package/dist/roof/roof-ridge-mode.d.ts.map +1 -0
  274. package/dist/roof/roof-ridge-mode.js +16 -0
  275. package/dist/roof/tool.d.ts +17 -4
  276. package/dist/roof/tool.d.ts.map +1 -1
  277. package/dist/roof/tool.js +211 -113
  278. package/dist/roof/wall-catch.d.ts +106 -0
  279. package/dist/roof/wall-catch.d.ts.map +1 -0
  280. package/dist/roof/wall-catch.js +267 -0
  281. package/dist/roof-segment/build-up-section.d.ts +9 -0
  282. package/dist/roof-segment/build-up-section.d.ts.map +1 -0
  283. package/dist/roof-segment/build-up-section.js +191 -0
  284. package/dist/roof-segment/definition.d.ts.map +1 -1
  285. package/dist/roof-segment/definition.js +50 -5
  286. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  287. package/dist/roof-segment/floorplan-affordances.js +68 -19
  288. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  289. package/dist/roof-segment/floorplan.js +16 -12
  290. package/dist/roof-segment/paint.d.ts +3 -1
  291. package/dist/roof-segment/paint.d.ts.map +1 -1
  292. package/dist/roof-segment/paint.js +43 -2
  293. package/dist/roof-segment/panel-model.d.ts +23 -0
  294. package/dist/roof-segment/panel-model.d.ts.map +1 -0
  295. package/dist/roof-segment/panel-model.js +64 -0
  296. package/dist/roof-segment/panel.d.ts.map +1 -1
  297. package/dist/roof-segment/panel.js +96 -14
  298. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  299. package/dist/roof-segment/parametrics.js +4 -0
  300. package/dist/roof-segment/renderer.d.ts.map +1 -1
  301. package/dist/roof-segment/renderer.js +26 -5
  302. package/dist/separator/definition.d.ts.map +1 -1
  303. package/dist/separator/definition.js +10 -12
  304. package/dist/separator/floorplan-affordances.d.ts +9 -0
  305. package/dist/separator/floorplan-affordances.d.ts.map +1 -0
  306. package/dist/separator/floorplan-affordances.js +23 -0
  307. package/dist/separator/floorplan.d.ts +9 -0
  308. package/dist/separator/floorplan.d.ts.map +1 -0
  309. package/dist/separator/floorplan.js +54 -0
  310. package/dist/separator/renderer.d.ts +4 -0
  311. package/dist/separator/renderer.d.ts.map +1 -1
  312. package/dist/separator/renderer.js +21 -6
  313. package/dist/separator/selection.d.ts +10 -0
  314. package/dist/separator/selection.d.ts.map +1 -0
  315. package/dist/separator/selection.js +35 -0
  316. package/dist/shared/build-up-controls.d.ts +88 -0
  317. package/dist/shared/build-up-controls.d.ts.map +1 -0
  318. package/dist/shared/build-up-controls.js +139 -0
  319. package/dist/shared/curtain-opening-limits.d.ts.map +1 -1
  320. package/dist/shared/curtain-opening-limits.js +44 -14
  321. package/dist/shared/item-interaction-actions.d.ts.map +1 -1
  322. package/dist/shared/item-interaction-actions.js +11 -2
  323. package/dist/shared/layer-thickness.d.ts +2 -0
  324. package/dist/shared/layer-thickness.d.ts.map +1 -0
  325. package/dist/shared/layer-thickness.js +3 -0
  326. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  327. package/dist/shared/move-roof-tool.js +100 -5
  328. package/dist/shared/node-batch/batchable.d.ts +2 -0
  329. package/dist/shared/node-batch/batchable.d.ts.map +1 -1
  330. package/dist/shared/node-batch/batchable.js +4 -0
  331. package/dist/shared/node-batch/candidates.d.ts +21 -5
  332. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  333. package/dist/shared/node-batch/candidates.js +85 -50
  334. package/dist/shared/node-batch/system.d.ts.map +1 -1
  335. package/dist/shared/node-batch/system.js +24 -15
  336. package/dist/shared/opening-casing-move.d.ts +16 -0
  337. package/dist/shared/opening-casing-move.d.ts.map +1 -0
  338. package/dist/shared/opening-casing-move.js +33 -0
  339. package/dist/shared/opening-casing-section.d.ts +15 -0
  340. package/dist/shared/opening-casing-section.d.ts.map +1 -0
  341. package/dist/shared/opening-casing-section.js +38 -0
  342. package/dist/shared/opening-casing.d.ts +26 -0
  343. package/dist/shared/opening-casing.d.ts.map +1 -0
  344. package/dist/shared/opening-casing.js +80 -0
  345. package/dist/shared/opening-depth-position.d.ts +13 -0
  346. package/dist/shared/opening-depth-position.d.ts.map +1 -0
  347. package/dist/shared/opening-depth-position.js +34 -0
  348. package/dist/shared/opening-documentation.d.ts.map +1 -1
  349. package/dist/shared/opening-documentation.js +17 -8
  350. package/dist/shared/opening-guides-runtime.d.ts +2 -1
  351. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  352. package/dist/shared/opening-guides-runtime.js +11 -7
  353. package/dist/shared/opening-labels.d.ts +11 -0
  354. package/dist/shared/opening-labels.d.ts.map +1 -0
  355. package/dist/shared/opening-labels.js +46 -0
  356. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  357. package/dist/shared/opening-placement-dimensions.js +11 -9
  358. package/dist/shared/opening-plane-offset.d.ts +4 -3
  359. package/dist/shared/opening-plane-offset.d.ts.map +1 -1
  360. package/dist/shared/opening-plane-offset.js +7 -4
  361. package/dist/shared/opening-swap.d.ts +8 -0
  362. package/dist/shared/opening-swap.d.ts.map +1 -0
  363. package/dist/shared/opening-swap.js +18 -0
  364. package/dist/shared/polygon-vertex-affordance.d.ts +19 -0
  365. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  366. package/dist/shared/polygon-vertex-affordance.js +65 -6
  367. package/dist/shared/roof-opening-host.d.ts +2 -1
  368. package/dist/shared/roof-opening-host.d.ts.map +1 -1
  369. package/dist/shared/roof-opening-host.js +14 -5
  370. package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -1
  371. package/dist/shared/roof-wall-opening-cut.js +14 -6
  372. package/dist/shared/roof-wall-opening-placement.d.ts +2 -1
  373. package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -1
  374. package/dist/shared/roof-wall-opening-placement.js +6 -4
  375. package/dist/shared/run-hanger-inspector.d.ts.map +1 -1
  376. package/dist/shared/run-hanger-inspector.js +39 -5
  377. package/dist/shared/system-check-panel.d.ts.map +1 -1
  378. package/dist/shared/system-check-panel.js +94 -15
  379. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  380. package/dist/shared/wall-attach-target.js +6 -3
  381. package/dist/shelf/definition.d.ts.map +1 -1
  382. package/dist/shelf/definition.js +2 -0
  383. package/dist/site/ground-hole.d.ts +3 -3
  384. package/dist/site/ground-hole.js +3 -3
  385. package/dist/site/ground-veil.d.ts +5 -12
  386. package/dist/site/ground-veil.d.ts.map +1 -1
  387. package/dist/site/ground-veil.js +9 -33
  388. package/dist/site/panel.d.ts.map +1 -1
  389. package/dist/site/panel.js +52 -12
  390. package/dist/site/renderer.d.ts.map +1 -1
  391. package/dist/site/renderer.js +52 -23
  392. package/dist/skylight/panel.d.ts.map +1 -1
  393. package/dist/skylight/panel.js +49 -19
  394. package/dist/slab/deck-geometry.d.ts +28 -0
  395. package/dist/slab/deck-geometry.d.ts.map +1 -0
  396. package/dist/slab/deck-geometry.js +320 -0
  397. package/dist/slab/definition.d.ts +2 -1
  398. package/dist/slab/definition.d.ts.map +1 -1
  399. package/dist/slab/definition.js +6 -1
  400. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  401. package/dist/slab/dependency-tracker.js +3 -0
  402. package/dist/slab/floorplan-affordances.d.ts +500 -0
  403. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  404. package/dist/slab/geometry.d.ts.map +1 -1
  405. package/dist/slab/geometry.js +46 -9
  406. package/dist/slab/panel.d.ts.map +1 -1
  407. package/dist/slab/panel.js +97 -21
  408. package/dist/slab/renderer.d.ts +11 -0
  409. package/dist/slab/renderer.d.ts.map +1 -0
  410. package/dist/slab/renderer.js +19 -0
  411. package/dist/slab/system.d.ts.map +1 -1
  412. package/dist/slab/system.js +12 -1
  413. package/dist/solar-panel/panel.d.ts.map +1 -1
  414. package/dist/solar-panel/panel.js +49 -14
  415. package/dist/stair/construction-controls.d.ts +3 -1
  416. package/dist/stair/construction-controls.d.ts.map +1 -1
  417. package/dist/stair/construction-controls.js +75 -12
  418. package/dist/stair/paint.d.ts +6 -0
  419. package/dist/stair/paint.d.ts.map +1 -1
  420. package/dist/stair/panel.d.ts.map +1 -1
  421. package/dist/stair/panel.js +243 -51
  422. package/dist/stair/parametrics.d.ts.map +1 -1
  423. package/dist/stair/parametrics.js +7 -0
  424. package/dist/stair/placement-defaults.d.ts +18 -0
  425. package/dist/stair/placement-defaults.d.ts.map +1 -0
  426. package/dist/stair/placement-defaults.js +27 -0
  427. package/dist/stair/railing-controls.d.ts.map +1 -1
  428. package/dist/stair/railing-controls.js +78 -18
  429. package/dist/stair/renderer.d.ts.map +1 -1
  430. package/dist/stair/renderer.js +16 -10
  431. package/dist/stair/structure-controls.d.ts +18 -0
  432. package/dist/stair/structure-controls.d.ts.map +1 -0
  433. package/dist/stair/structure-controls.js +275 -0
  434. package/dist/stair/tool.d.ts.map +1 -1
  435. package/dist/stair/tool.js +13 -9
  436. package/dist/stair/use-stair-render-data.d.ts +41 -0
  437. package/dist/stair/use-stair-render-data.d.ts.map +1 -1
  438. package/dist/stair-segment/panel.d.ts.map +1 -1
  439. package/dist/stair-segment/panel.js +65 -18
  440. package/dist/turbine-vent/panel.d.ts.map +1 -1
  441. package/dist/turbine-vent/panel.js +14 -5
  442. package/dist/unit/unit-panel.d.ts.map +1 -1
  443. package/dist/unit/unit-panel.js +28 -12
  444. package/dist/wall/actions.d.ts +1 -1
  445. package/dist/wall/actions.d.ts.map +1 -1
  446. package/dist/wall/actions.js +17 -13
  447. package/dist/wall/construction-dimensions.d.ts +6 -0
  448. package/dist/wall/construction-dimensions.d.ts.map +1 -1
  449. package/dist/wall/construction-dimensions.js +8 -0
  450. package/dist/wall/contextual-dimensions.d.ts +6 -0
  451. package/dist/wall/contextual-dimensions.d.ts.map +1 -1
  452. package/dist/wall/contextual-dimensions.js +104 -17
  453. package/dist/wall/curtain-opening-frame.d.ts.map +1 -1
  454. package/dist/wall/curtain-opening-frame.js +6 -4
  455. package/dist/wall/curtain-wall-layout.d.ts +1 -1
  456. package/dist/wall/curtain-wall-layout.d.ts.map +1 -1
  457. package/dist/wall/curtain-wall-layout.js +6 -4
  458. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  459. package/dist/wall/curtain-wall-materials.js +8 -3
  460. package/dist/wall/curtain-wall-panel.d.ts.map +1 -1
  461. package/dist/wall/curtain-wall-panel.js +241 -37
  462. package/dist/wall/curve-tool.d.ts.map +1 -1
  463. package/dist/wall/curve-tool.js +2 -3
  464. package/dist/wall/definition.d.ts.map +1 -1
  465. package/dist/wall/definition.js +20 -5
  466. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  467. package/dist/wall/floorplan-affordances.js +9 -6
  468. package/dist/wall/floorplan-move.d.ts.map +1 -1
  469. package/dist/wall/floorplan-move.js +66 -16
  470. package/dist/wall/floorplan.d.ts +4 -5
  471. package/dist/wall/floorplan.d.ts.map +1 -1
  472. package/dist/wall/floorplan.js +62 -46
  473. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  474. package/dist/wall/move-endpoint-tool.js +1 -0
  475. package/dist/wall/move-tool.d.ts.map +1 -1
  476. package/dist/wall/move-tool.js +77 -12
  477. package/dist/wall/paint.d.ts +2 -2
  478. package/dist/wall/paint.d.ts.map +1 -1
  479. package/dist/wall/paint.js +11 -4
  480. package/dist/wall/panel-model.d.ts +17 -2
  481. package/dist/wall/panel-model.d.ts.map +1 -1
  482. package/dist/wall/panel-model.js +158 -18
  483. package/dist/wall/panel.d.ts +8 -0
  484. package/dist/wall/panel.d.ts.map +1 -1
  485. package/dist/wall/panel.js +228 -156
  486. package/dist/wall/parametrics.d.ts +1 -1
  487. package/dist/wall/parametrics.d.ts.map +1 -1
  488. package/dist/wall/parametrics.js +14 -1
  489. package/dist/wall/railing-wall-adapter.d.ts +7 -0
  490. package/dist/wall/railing-wall-adapter.d.ts.map +1 -0
  491. package/dist/wall/railing-wall-adapter.js +38 -0
  492. package/dist/wall/railing-wall-floorplan.d.ts +8 -0
  493. package/dist/wall/railing-wall-floorplan.d.ts.map +1 -0
  494. package/dist/wall/railing-wall-floorplan.js +27 -0
  495. package/dist/wall/railing-wall-geometry.d.ts +12 -0
  496. package/dist/wall/railing-wall-geometry.d.ts.map +1 -0
  497. package/dist/wall/railing-wall-geometry.js +51 -0
  498. package/dist/wall/railing-wall-guard.d.ts +81 -0
  499. package/dist/wall/railing-wall-guard.d.ts.map +1 -0
  500. package/dist/wall/railing-wall-guard.js +435 -0
  501. package/dist/wall/railing-wall-materials.d.ts +11 -0
  502. package/dist/wall/railing-wall-materials.d.ts.map +1 -0
  503. package/dist/wall/railing-wall-materials.js +31 -0
  504. package/dist/wall/railing-wall-panel-model.d.ts +30 -0
  505. package/dist/wall/railing-wall-panel-model.d.ts.map +1 -0
  506. package/dist/wall/railing-wall-panel-model.js +117 -0
  507. package/dist/wall/railing-wall-panel.d.ts +17 -0
  508. package/dist/wall/railing-wall-panel.d.ts.map +1 -0
  509. package/dist/wall/railing-wall-panel.js +42 -0
  510. package/dist/wall/rectangle-command.d.ts +79 -1
  511. package/dist/wall/rectangle-command.d.ts.map +1 -1
  512. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  513. package/dist/wall/rectangle-tool.js +2 -0
  514. package/dist/wall/renderer.d.ts.map +1 -1
  515. package/dist/wall/renderer.js +3 -1
  516. package/dist/wall/skirting-floor-gaps.d.ts +8 -0
  517. package/dist/wall/skirting-floor-gaps.d.ts.map +1 -0
  518. package/dist/wall/skirting-floor-gaps.js +36 -0
  519. package/dist/wall/system.d.ts +0 -14
  520. package/dist/wall/system.d.ts.map +1 -1
  521. package/dist/wall/system.js +6 -1
  522. package/dist/wall/tool.d.ts +16 -0
  523. package/dist/wall/tool.d.ts.map +1 -1
  524. package/dist/wall/tool.js +160 -47
  525. package/dist/wall/treatments.d.ts +3 -0
  526. package/dist/wall/treatments.d.ts.map +1 -1
  527. package/dist/wall/treatments.js +30 -7
  528. package/dist/window/actions.d.ts +7 -0
  529. package/dist/window/actions.d.ts.map +1 -0
  530. package/dist/window/actions.js +29 -0
  531. package/dist/window/definition.d.ts.map +1 -1
  532. package/dist/window/definition.js +11 -2
  533. package/dist/window/floorplan-move.d.ts.map +1 -1
  534. package/dist/window/floorplan-move.js +5 -0
  535. package/dist/window/floorplan.d.ts +2 -0
  536. package/dist/window/floorplan.d.ts.map +1 -1
  537. package/dist/window/floorplan.js +58 -1
  538. package/dist/window/mechanism.d.ts.map +1 -1
  539. package/dist/window/mechanism.js +21 -1
  540. package/dist/window/move-tool.d.ts.map +1 -1
  541. package/dist/window/move-tool.js +10 -3
  542. package/dist/window/paint.d.ts +2 -7
  543. package/dist/window/paint.d.ts.map +1 -1
  544. package/dist/window/paint.js +31 -3
  545. package/dist/window/panel.d.ts.map +1 -1
  546. package/dist/window/panel.js +311 -69
  547. package/dist/window/placement.d.ts.map +1 -1
  548. package/dist/window/placement.js +5 -1
  549. package/dist/window/swing.d.ts +13 -0
  550. package/dist/window/swing.d.ts.map +1 -0
  551. package/dist/window/swing.js +16 -0
  552. package/dist/window/tool.d.ts.map +1 -1
  553. package/dist/window/tool.js +19 -14
  554. package/dist/zone/floorplan-affordances.d.ts +136 -0
  555. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  556. package/dist/zone/quantities-panel.d.ts.map +1 -1
  557. package/dist/zone/quantities-panel.js +34 -9
  558. package/dist/zone/renderer.d.ts.map +1 -1
  559. package/dist/zone/renderer.js +9 -5
  560. package/package.json +14 -14
  561. package/dist/site/generic-foundation-geometry.d.ts +0 -16
  562. package/dist/site/generic-foundation-geometry.d.ts.map +0 -1
  563. package/dist/site/generic-foundation-geometry.js +0 -75
  564. package/dist/site/generic-foundation.d.ts +0 -4
  565. package/dist/site/generic-foundation.d.ts.map +0 -1
  566. package/dist/site/generic-foundation.js +0 -91
@@ -0,0 +1,435 @@
1
+ /**
2
+ * A railing wall's guard (`wallType: 'railing'`) as pure data: where it runs, where its posts
3
+ * stand, and its members as oriented boxes. It is laid out on the stair guards' chassis
4
+ * (`stair/guard-path.ts`): the same path sampling, equally spaced posts and rail joinery, with the
5
+ * stair styles' members (`stair/*-guard.ts`) stood on a level floor and sized by the railing's
6
+ * config. The 3D builder (`railing-wall-geometry.ts`) turns the boxes into the wall's mesh and the
7
+ * plan (`railing-wall-floorplan.ts`) draws the posts, so both show the same guard.
8
+ *
9
+ * The guard runs along the wall's body centreline from the floor up to the wall's height. A door
10
+ * on the railing is a gap in it: the guard stops either side with a post whose face is on the
11
+ * gap's edge, so the gap is the door's width clear. An end that dies into a solid wall has no post:
12
+ * the rails run on into the wall. Every other end, and every
13
+ * corner where two railings meet, has its post centred on the wall's end. Between the ends the
14
+ * posts are equally spaced at most `postSpacing` apart, and the balusters of each bay equally
15
+ * spaced at most `infillGap` clear.
16
+ */
17
+ import { getRailingWallConfig, getRailingWallHeight, getWallBodyCenterOffset, getWallBodyLine, getWallCurveFrameAt, getWallCurveLength, getWallThickness, isCurvedWall, isRailingWall, sampleWallCenterline, } from '@pascal-app/core';
18
+ import { add, barBox, postBox, railBars, resolveGuardPath, scale, sub, UP, } from '../stair/guard-path.js';
19
+ const IN = 0.0254;
20
+ // The stair guards' members (`stair/*-guard.ts`), metres.
21
+ const DECK_CAP_W = 5.5 * IN; // a 2x6 cap laid flat
22
+ const DECK_CAP_T = 1.5 * IN;
23
+ const DECK_RAIL_T = 1.5 * IN; // a 2x4 rail on edge: thin across the run…
24
+ const DECK_RAIL_D = 3.5 * IN; // …and deep
25
+ const BOARD_T = 0.75 * IN; // a 1x6 board on the flat
26
+ const HANDRAIL_W = 0.062; // the baluster style's graspable top rail…
27
+ const HANDRAIL_T = 0.05;
28
+ const SHOE_RAIL = 0.045; // …and its shoe rail
29
+ const NEWEL_ABOVE = 0.04; // a newel stands this far over the handrail…
30
+ const NEWEL_CAP_T = 0.028; // …under a cap of its own
31
+ const NEWEL_CAP_OVERHANG = 0.03;
32
+ const SLIM_CAP_W = 0.0635; // a cable or glass guard's flat cap rail
33
+ const SLIM_CAP_T = 0.0381;
34
+ const CABLE_CLEAR = 0.025; // the top cable stays this far under the cap
35
+ const SLEEVE_D = 0.019; // a swage sleeve where a cable dies into its terminal post
36
+ const SLEEVE_LEN = 0.05;
37
+ const PANE_REVEAL = 0.015; // a glass pane stands this far off each post…
38
+ const PANE_HEAD = 0.01; // …and this far under the cap
39
+ const CLAMP_W = 0.05; // a point clamp holding a pane edge to its post
40
+ const CLAMP_T = 0.03;
41
+ const CLAMP_LEN = 0.05;
42
+ const CLAMP_LEVELS = [0.22, 0.78];
43
+ const METAL_TOP_W = 0.05; // a fabricated guard's flat top rail…
44
+ const METAL_TOP_T = 0.03;
45
+ const METAL_BOTTOM_W = 0.038; // …and its bottom rail
46
+ const METAL_BOTTOM_T = 0.025;
47
+ const BASEPLATE_W = 0.1; // the plate a steel post is welded to, on the floor
48
+ const BASEPLATE_T = 0.008;
49
+ /** Ends this close to a solid wall's body (beyond its half thickness) die into it, metres. */
50
+ const WALL_END_TOLERANCE = 0.02;
51
+ /** Infill closer than this on centre would merge into a solid sheet. */
52
+ const MIN_INFILL = 0.005;
53
+ /**
54
+ * The doors (and any window) a railing hosts as gaps along it, `[from, to]` metres from its
55
+ * start, clipped to the wall, merged where they touch, in order.
56
+ */
57
+ export function railingWallGaps(wall, children) {
58
+ const length = getWallCurveLength(wall);
59
+ const spans = children
60
+ .flatMap((child) => {
61
+ if (child.type !== 'door' && child.type !== 'window')
62
+ return [];
63
+ const center = child.position?.[0];
64
+ if (typeof center !== 'number' || !(child.width > 0))
65
+ return [];
66
+ const from = Math.max(0, center - child.width / 2);
67
+ const to = Math.min(length, center + child.width / 2);
68
+ return to > from ? [[from, to]] : [];
69
+ })
70
+ .sort((a, b) => a[0] - b[0]);
71
+ const merged = [];
72
+ for (const span of spans) {
73
+ const last = merged.at(-1);
74
+ if (last && span[0] <= last[1])
75
+ last[1] = Math.max(last[1], span[1]);
76
+ else
77
+ merged.push([...span]);
78
+ }
79
+ return merged;
80
+ }
81
+ /** Distance from `point` to the segment `a`–`b`, in plan. */
82
+ function distanceToSegment(point, a, b) {
83
+ const dx = b.x - a.x;
84
+ const dy = b.y - a.y;
85
+ const lengthSq = dx * dx + dy * dy;
86
+ const t = lengthSq < 1e-12
87
+ ? 0
88
+ : Math.max(0, Math.min(1, ((point[0] - a.x) * dx + (point[1] - a.y) * dy) / lengthSq));
89
+ return Math.hypot(point[0] - (a.x + dx * t), point[1] - (a.y + dy * t));
90
+ }
91
+ /** Whether `point` lies in a wall's body (a straight wall's exactly, a curved one's near enough). */
92
+ function inWallBody(point, wall) {
93
+ const half = getWallThickness(wall) / 2 + WALL_END_TOLERANCE;
94
+ if (!isCurvedWall(wall)) {
95
+ const line = getWallBodyLine(wall);
96
+ return distanceToSegment(point, line.start, line.end) <= half;
97
+ }
98
+ const reach = half + Math.abs(getWallBodyCenterOffset(wall));
99
+ const points = sampleWallCenterline(wall);
100
+ return points
101
+ .slice(1)
102
+ .some((end, index) => distanceToSegment(point, points[index], end) <= reach);
103
+ }
104
+ /**
105
+ * Which ends of a railing die into a solid wall among `walls` (its level's): a railing run up to
106
+ * the house stops in its wall with no post, its rails carried into it.
107
+ */
108
+ export function railingWallEndsAtWalls(wall, walls) {
109
+ const solid = walls.filter((other) => other.id !== wall.id && other.visible !== false && !isRailingWall(other));
110
+ return {
111
+ start: solid.some((other) => inWallBody(wall.start, other)),
112
+ end: solid.some((other) => inWallBody(wall.end, other)),
113
+ };
114
+ }
115
+ /**
116
+ * The runs of a railing's guard over its `length`: the wall less its `gaps`, a post either side
117
+ * of each gap with its face on the gap's edge, and none at an end that dies into a wall
118
+ * (`atWall`). A stretch shorter than a post holds no guard.
119
+ */
120
+ export function railingWallRuns(length, gaps, postSize, atWall) {
121
+ const runs = [];
122
+ let from = 0;
123
+ const push = (to) => {
124
+ const startGap = from > 0;
125
+ const endGap = to < length;
126
+ const a = from + (startGap ? postSize / 2 : 0);
127
+ const b = to - (endGap ? postSize / 2 : 0);
128
+ if (b - a >= postSize - 1e-9)
129
+ runs.push({
130
+ from: a,
131
+ to: b,
132
+ startPost: startGap || !atWall.start,
133
+ endPost: endGap || !atWall.end,
134
+ startGap,
135
+ endGap,
136
+ });
137
+ };
138
+ for (const [gapFrom, gapTo] of gaps) {
139
+ if (gapFrom > from)
140
+ push(gapFrom);
141
+ from = gapTo;
142
+ }
143
+ if (from < length)
144
+ push(length);
145
+ return runs;
146
+ }
147
+ /**
148
+ * Points along a railing's body centreline from `from` to `to` metres along it, on its floor: in
149
+ * the wall's mesh frame (x along its chord from its start, z toward face `a`) or in plan (level x
150
+ * and z). A curve is sampled finely enough for its rails to read as one.
151
+ */
152
+ export function railingRunPoints(wall, from, to, frame) {
153
+ const length = getWallCurveLength(wall);
154
+ if (length < 1e-9)
155
+ return [];
156
+ const offset = getWallBodyCenterOffset(wall);
157
+ const [sx, sz] = wall.start;
158
+ const angle = Math.atan2(wall.end[1] - sz, wall.end[0] - sx);
159
+ const cos = Math.cos(angle);
160
+ const sin = Math.sin(angle);
161
+ const segments = isCurvedWall(wall) ? Math.max(2, Math.min(64, Math.ceil((to - from) / 0.2))) : 1;
162
+ const points = [];
163
+ for (let i = 0; i <= segments; i++) {
164
+ const along = from + ((to - from) * i) / segments;
165
+ const { point, normal } = getWallCurveFrameAt(wall, along / length);
166
+ const x = point.x + normal.x * offset;
167
+ const z = point.y + normal.y * offset;
168
+ if (frame === 'plan')
169
+ points.push([x, 0, z]);
170
+ else {
171
+ const dx = x - sx;
172
+ const dz = z - sz;
173
+ points.push([dx * cos + dz * sin, 0, -dx * sin + dz * cos]);
174
+ }
175
+ }
176
+ return points;
177
+ }
178
+ function railingMembers(config, height) {
179
+ const clear = config.bottomClearance;
180
+ const none = {
181
+ boards: [],
182
+ pickets: null,
183
+ cables: null,
184
+ glass: null,
185
+ endCap: null,
186
+ newelCap: false,
187
+ baseplate: false,
188
+ };
189
+ const flatCap = (width, thickness) => ({
190
+ rail: { y: height - thickness / 2, across: width, vertical: thickness },
191
+ endCap: { width, thickness, y: height - thickness / 2 },
192
+ });
193
+ switch (config.style) {
194
+ case 'balusters':
195
+ return {
196
+ ...none,
197
+ rails: [
198
+ { y: clear + SHOE_RAIL / 2, across: SHOE_RAIL, vertical: SHOE_RAIL },
199
+ { y: height - HANDRAIL_T / 2, across: HANDRAIL_W, vertical: HANDRAIL_T },
200
+ ],
201
+ postTop: height + NEWEL_ABOVE,
202
+ pickets: [clear + SHOE_RAIL, height - HANDRAIL_T],
203
+ newelCap: true,
204
+ };
205
+ case 'cable': {
206
+ const cap = flatCap(SLIM_CAP_W, SLIM_CAP_T);
207
+ return {
208
+ ...none,
209
+ rails: [cap.rail],
210
+ postTop: height - SLIM_CAP_T,
211
+ cables: [clear, height - SLIM_CAP_T - CABLE_CLEAR],
212
+ endCap: cap.endCap,
213
+ };
214
+ }
215
+ case 'boards': {
216
+ const cap = config.cap ? flatCap(DECK_CAP_W, DECK_CAP_T) : null;
217
+ const top = cap ? height - DECK_CAP_T : height;
218
+ const size = Math.max(config.infillSize, MIN_INFILL);
219
+ const boards = [];
220
+ for (let bottom = clear; bottom + size <= top + 1e-6; bottom += size + config.infillGap)
221
+ boards.push({ y: bottom + size / 2, across: BOARD_T, vertical: size });
222
+ return {
223
+ ...none,
224
+ rails: cap ? [cap.rail] : [],
225
+ boards,
226
+ postTop: top,
227
+ endCap: cap?.endCap ?? null,
228
+ };
229
+ }
230
+ case 'glass': {
231
+ const cap = flatCap(SLIM_CAP_W, SLIM_CAP_T);
232
+ return {
233
+ ...none,
234
+ rails: [cap.rail],
235
+ postTop: height - SLIM_CAP_T,
236
+ glass: [clear, height - SLIM_CAP_T - PANE_HEAD],
237
+ endCap: cap.endCap,
238
+ };
239
+ }
240
+ case 'metal': {
241
+ const top = flatCap(METAL_TOP_W, METAL_TOP_T);
242
+ return {
243
+ ...none,
244
+ rails: [
245
+ { y: clear + METAL_BOTTOM_T / 2, across: METAL_BOTTOM_W, vertical: METAL_BOTTOM_T },
246
+ top.rail,
247
+ ],
248
+ postTop: height - METAL_TOP_T,
249
+ pickets: [clear + METAL_BOTTOM_T, height - METAL_TOP_T],
250
+ endCap: top.endCap,
251
+ baseplate: true,
252
+ };
253
+ }
254
+ default: {
255
+ // The DCA 6 deck guard: a 2x4 bottom rail, a 2x4 top rail on edge under a 2x6 cap.
256
+ const cap = config.cap ? flatCap(DECK_CAP_W, DECK_CAP_T) : null;
257
+ const top = cap ? height - DECK_CAP_T : height;
258
+ return {
259
+ ...none,
260
+ rails: [
261
+ { y: clear + DECK_RAIL_D / 2, across: DECK_RAIL_T, vertical: DECK_RAIL_D },
262
+ { y: top - DECK_RAIL_D / 2, across: DECK_RAIL_T, vertical: DECK_RAIL_D },
263
+ ...(cap ? [cap.rail] : []),
264
+ ],
265
+ postTop: top,
266
+ pickets: [clear + DECK_RAIL_D, top - DECK_RAIL_D],
267
+ endCap: cap?.endCap ?? null,
268
+ };
269
+ }
270
+ }
271
+ }
272
+ /** A box standing square on the floor's plane, `size` wide and `thickness` tall, centred at `y`. */
273
+ function flatBox(at, size, thickness, y) {
274
+ return { center: [at[0], at[1] + y, at[2]], size: [size, size, thickness], direction: UP };
275
+ }
276
+ const FREE_ENDS = {
277
+ startPost: true,
278
+ endPost: true,
279
+ startGap: false,
280
+ endGap: false,
281
+ };
282
+ /**
283
+ * One run of a railing's guard along `points` (on the floor, bottom first), `height` tall, built
284
+ * as `config` says, with or without a post at either end (`ends`).
285
+ */
286
+ export function buildRailingRunGuard(points, config, height, ends = FREE_ENDS) {
287
+ const guard = { frame: [], infill: [], posts: [] };
288
+ const postSize = Math.max(config.postSize, MIN_INFILL);
289
+ const path = resolveGuardPath(points, {
290
+ postSpacing: Math.max(config.postSpacing, postSize * 2),
291
+ });
292
+ if (path?.kind !== 'path' || height <= 0)
293
+ return guard;
294
+ const members = railingMembers(config, height);
295
+ const { postStations, postPositions, pointAt } = path;
296
+ const last = postStations.length - 1;
297
+ const hasPost = (index) => (index > 0 || ends.startPost) && (index < last || ends.endPost) && index >= 0 && index <= last;
298
+ guard.frame.push(...railBars(path.railPoints, path.isCorner, members.rails));
299
+ guard.infill.push(...railBars(path.railPoints, path.isCorner, members.boards));
300
+ postPositions.forEach((at, index) => {
301
+ if (!hasPost(index))
302
+ return;
303
+ guard.posts.push(at);
304
+ guard.frame.push(postBox(at, members.postTop, postSize));
305
+ if (members.baseplate)
306
+ guard.frame.push(flatBox(at, BASEPLATE_W, BASEPLATE_T, BASEPLATE_T / 2));
307
+ if (members.newelCap)
308
+ guard.frame.push(flatBox(at, postSize + NEWEL_CAP_OVERHANG, NEWEL_CAP_T, members.postTop + NEWEL_CAP_T / 2));
309
+ const cap = members.endCap;
310
+ if (!cap || (index !== 0 && index !== last))
311
+ return;
312
+ // Beside a gap the cap stops flush with the post, keeping the gap clear its full height…
313
+ const gap = index === 0 ? ends.startGap : ends.endGap;
314
+ if (gap) {
315
+ const rail = path.railPoints;
316
+ const away = index === 0 ? sub(rail[0], rail[1]) : sub(rail.at(-1), rail.at(-2));
317
+ const reach = Math.hypot(away[0], away[2]);
318
+ const face = add(at, scale(away, reach > 1e-9 ? postSize / 2 / reach : 0));
319
+ const flush = barBox(add(face, [0, cap.y, 0]), add(at, [0, cap.y, 0]), cap.width, cap.thickness);
320
+ if (flush)
321
+ guard.frame.push(flush);
322
+ return;
323
+ }
324
+ // …anywhere else it runs on over the end post, closing a corner where two railings meet.
325
+ guard.frame.push(flatBox(at, cap.width, cap.thickness, cap.y));
326
+ });
327
+ // Each bay between two posts, its clear stretch past the posts standing in it.
328
+ const bays = postStations.slice(1).map((to, i) => {
329
+ const from = postStations[i];
330
+ return {
331
+ from: from + (hasPost(i) ? postSize / 2 : 0),
332
+ to: to - (hasPost(i + 1) ? postSize / 2 : 0),
333
+ };
334
+ });
335
+ if (members.pickets && members.pickets[1] - members.pickets[0] > 1e-3) {
336
+ const [bottom, top] = members.pickets;
337
+ const size = Math.max(config.infillSize, MIN_INFILL);
338
+ const gap = Math.max(config.infillGap, 0);
339
+ for (const bay of bays) {
340
+ const clear = bay.to - bay.from;
341
+ // As few balusters as keep every gap within `gap`, equally spaced.
342
+ const count = Math.max(0, Math.ceil((clear - gap) / (size + gap) - 1e-9));
343
+ if (count === 0)
344
+ continue;
345
+ const spacing = (clear - count * size) / (count + 1);
346
+ for (let k = 0; k < count; k++) {
347
+ const foot = pointAt(bay.from + spacing + size / 2 + k * (size + spacing));
348
+ const baluster = barBox(add(foot, [0, bottom, 0]), add(foot, [0, top, 0]), size, size);
349
+ if (baluster)
350
+ guard.infill.push(baluster);
351
+ }
352
+ }
353
+ }
354
+ if (members.cables) {
355
+ const [bottom, top] = members.cables;
356
+ const size = Math.max(config.infillSize, MIN_INFILL);
357
+ const pitch = size + Math.max(config.infillGap, 0);
358
+ for (let y = bottom + size / 2; y + size / 2 <= top + 1e-9; y += pitch) {
359
+ for (let i = 1; i <= last; i++) {
360
+ const cable = barBox(add(postPositions[i - 1], [0, y, 0]), add(postPositions[i], [0, y, 0]), size, size);
361
+ if (cable)
362
+ guard.infill.push({ ...cable, round: true });
363
+ }
364
+ if (last < 1)
365
+ continue;
366
+ if (hasPost(0))
367
+ guard.frame.push(sleeve(postPositions[0], postPositions[1], y));
368
+ if (hasPost(last))
369
+ guard.frame.push(sleeve(postPositions[last], postPositions[last - 1], y));
370
+ }
371
+ }
372
+ if (members.glass && members.glass[1] - members.glass[0] > 1e-3) {
373
+ const [bottom, top] = members.glass;
374
+ const middle = (bottom + top) / 2;
375
+ bays.forEach((bay, i) => {
376
+ const from = bay.from + PANE_REVEAL;
377
+ const to = bay.to - PANE_REVEAL;
378
+ if (to - from < 0.05)
379
+ return;
380
+ const a = add(pointAt(from), [0, middle, 0]);
381
+ const b = add(pointAt(to), [0, middle, 0]);
382
+ const pane = barBox(a, b, Math.max(config.infillSize, MIN_INFILL), top - bottom);
383
+ if (pane)
384
+ guard.infill.push(pane);
385
+ // Point clamps tie each pane edge to the post beside it.
386
+ for (const [edge, post] of [
387
+ [pointAt(from), i],
388
+ [pointAt(to), i + 1],
389
+ ]) {
390
+ if (!hasPost(post))
391
+ continue;
392
+ for (const level of CLAMP_LEVELS) {
393
+ const y = bottom + level * (top - bottom);
394
+ const bridge = barBox(add(postPositions[post], [0, y, 0]), add(edge, [0, y, 0]), CLAMP_W, CLAMP_T);
395
+ if (bridge)
396
+ guard.frame.push({ ...bridge, size: [CLAMP_W, CLAMP_T, bridge.size[2] + CLAMP_LEN] });
397
+ }
398
+ }
399
+ });
400
+ }
401
+ return guard;
402
+ }
403
+ /** A short round sleeve at `post`, height `y`, pointing along the cable toward `toward`. */
404
+ function sleeve(post, toward, y) {
405
+ const along = sub(toward, post);
406
+ const length = Math.hypot(along[0], along[1], along[2]);
407
+ const unit = length > 1e-6 ? scale(along, 1 / length) : [1, 0, 0];
408
+ return {
409
+ center: add(add(post, [0, y, 0]), scale(unit, SLEEVE_LEN / 2)),
410
+ size: [SLEEVE_D, SLEEVE_D, SLEEVE_LEN],
411
+ direction: unit,
412
+ round: true,
413
+ };
414
+ }
415
+ /**
416
+ * A railing wall's runs: its length less the doors it hosts, with no post at an end that dies
417
+ * into one of `walls` (its level's).
418
+ */
419
+ export function railingWallLayout(wall, children, walls) {
420
+ const config = getRailingWallConfig(wall);
421
+ return railingWallRuns(getWallCurveLength(wall), railingWallGaps(wall, children), Math.max(config.postSize, MIN_INFILL), railingWallEndsAtWalls(wall, walls));
422
+ }
423
+ /** A railing wall's whole guard, in its mesh frame or in plan (`railingWallLayout`). */
424
+ export function buildRailingWallGuard(wall, children, walls, frame = 'local') {
425
+ const config = getRailingWallConfig(wall);
426
+ const height = getRailingWallHeight(wall);
427
+ const guard = { frame: [], infill: [], posts: [] };
428
+ for (const run of railingWallLayout(wall, children, walls)) {
429
+ const part = buildRailingRunGuard(railingRunPoints(wall, run.from, run.to, frame), config, height, run);
430
+ guard.frame.push(...part.frame);
431
+ guard.infill.push(...part.infill);
432
+ guard.posts.push(...part.posts);
433
+ }
434
+ return guard;
435
+ }
@@ -0,0 +1,11 @@
1
+ import { type RailingWallSlotId, type SceneMaterial, type SceneMaterialId, type WallNode } from '@pascal-app/core';
2
+ import { type RenderShading, type WallMaterialOverride } from '@pascal-app/viewer';
3
+ /** A railing's slots in its mesh's palette order (`railing-wall-geometry.ts`). */
4
+ export declare const RAILING_WALL_SLOTS: readonly RailingWallSlotId[];
5
+ /**
6
+ * A railing wall's palette: its frame and its infill, each its painted finish or its style's
7
+ * default (`railingWallSlotDefault`), then the frame again where a wall's face b would be. The
8
+ * materials are the shared library ones, so the railing owns none.
9
+ */
10
+ export declare function createRailingWallMaterials(wall: WallNode, shading: RenderShading, materials?: Record<SceneMaterialId, SceneMaterial>): WallMaterialOverride;
11
+ //# sourceMappingURL=railing-wall-materials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"railing-wall-materials.d.ts","sourceRoot":"","sources":["../../src/wall/railing-wall-materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EAEtB,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,aAAa,EAGlB,KAAK,oBAAoB,EAC1B,MAAM,oBAAoB,CAAA;AAE3B,kFAAkF;AAClF,eAAO,MAAM,kBAAkB,EAAE,SAAS,iBAAiB,EAAwC,CAAA;AAEnG;;;;GAIG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,QAAQ,EACd,OAAO,EAAE,aAAa,EACtB,SAAS,CAAC,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GACjD,oBAAoB,CAwBtB"}
@@ -0,0 +1,31 @@
1
+ import { getMaterialPresetByRef, getRailingWallConfig, railingWallSlotDefault, } from '@pascal-app/core';
2
+ import { resolveMaterialRef, resolveSlotDefaultMaterial, } from '@pascal-app/viewer';
3
+ /** A railing's slots in its mesh's palette order (`railing-wall-geometry.ts`). */
4
+ export const RAILING_WALL_SLOTS = ['railing-frame', 'railing-infill'];
5
+ /**
6
+ * A railing wall's palette: its frame and its infill, each its painted finish or its style's
7
+ * default (`railingWallSlotDefault`), then the frame again where a wall's face b would be. The
8
+ * materials are the shared library ones, so the railing owns none.
9
+ */
10
+ export function createRailingWallMaterials(wall, shading, materials) {
11
+ const { style } = getRailingWallConfig(wall);
12
+ const slots = RAILING_WALL_SLOTS.map((slot) => ({
13
+ painted: wall.slots?.[slot],
14
+ fallback: railingWallSlotDefault(style, slot),
15
+ }));
16
+ return {
17
+ hash: JSON.stringify({
18
+ railing: slots.map(({ painted, fallback }) => [
19
+ painted,
20
+ painted?.startsWith('scene:') ? materials?.[painted.slice(6)] : null,
21
+ painted ? getMaterialPresetByRef(painted) : null,
22
+ fallback,
23
+ ]),
24
+ }),
25
+ create: () => {
26
+ const [frame, infill] = slots.map(({ painted, fallback }) => (painted ? resolveMaterialRef(painted, materials, shading) : null) ??
27
+ resolveSlotDefaultMaterial(fallback, shading));
28
+ return { visible: [frame, infill, frame] };
29
+ },
30
+ };
31
+ }
@@ -0,0 +1,30 @@
1
+ import { type RailingWallConfig, type RailingWallStyle, type WallNode } from '@pascal-app/core';
2
+ import type { PanelRow } from '@pascal-app/editor';
3
+ export declare const RAILING_STYLE_OPTIONS: {
4
+ label: string;
5
+ value: RailingWallStyle;
6
+ }[];
7
+ /** What a style's infill is called, and its gap where it has one. */
8
+ export declare const RAILING_INFILL_LABELS: Record<RailingWallStyle, {
9
+ size: string;
10
+ gap: string | null;
11
+ }>;
12
+ /** The styles a 2x6 cap is laid over. */
13
+ export declare const RAILING_CAPPED_STYLES: ReadonlySet<RailingWallStyle>;
14
+ /** The guard heights offered at a click: 36 in (IRC R312.1.2) and 42 in (IBC 1015.3). */
15
+ export declare function railingHeightPreset(height: number): '36' | '42' | null;
16
+ /**
17
+ * A wall turned into a railing: the railing it had, else the default one, as thick as its posts
18
+ * and 36 in tall unless it already stands no taller than a 42 in guard, with no assembly.
19
+ */
20
+ export declare function railingWallTypePatch(wall: WallNode): Partial<WallNode>;
21
+ /** A railing edit: its config with `patch` over it, and its thickness its posts'. */
22
+ export declare function getRailingWallUpdate(node: WallNode, patch: Partial<RailingWallConfig>): Pick<WallNode, 'railing' | 'thickness'>;
23
+ /** A style's members, picked with it (`RAILING_STYLE_DEFAULTS`). */
24
+ export declare function railingStylePatch(style: RailingWallStyle): Partial<RailingWallConfig>;
25
+ /**
26
+ * A railing's rows in the compact wall panel (`wallSettings`), the Railing section's controls:
27
+ * style, guard height, cap, posts and infill. Lengths in metres.
28
+ */
29
+ export declare function railingWallRows(node: WallNode, update: (patch: Partial<WallNode>) => void): PanelRow[];
30
+ //# sourceMappingURL=railing-wall-panel-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"railing-wall-panel-model.d.ts","sourceRoot":"","sources":["../../src/wall/railing-wall-panel-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EAErB,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAA;AAIlD,eAAO,MAAM,qBAAqB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,gBAAgB,CAAA;CAAE,EAO7E,CAAA;AAED,qEAAqE;AACrE,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,gBAAgB,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAQ9F,CAAA;AAEH,yCAAyC;AACzC,eAAO,MAAM,qBAAqB,EAAE,WAAW,CAAC,gBAAgB,CAG9D,CAAA;AAEF,yFAAyF;AACzF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAItE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAYtE;AAED,qFAAqF;AACrF,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAChC,IAAI,CAAC,QAAQ,EAAE,SAAS,GAAG,WAAW,CAAC,CAGzC;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAErF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,GACzC,QAAQ,EAAE,CA4FZ"}
@@ -0,0 +1,117 @@
1
+ import { getEffectiveNode, getRailingWallConfig, getRailingWallHeight, RAILING_GUARD_HEIGHT, RAILING_GUARD_HEIGHT_TALL, RAILING_STYLE_DEFAULTS, railingWallDefaults, } from '@pascal-app/core';
2
+ const INCH = 0.0254;
3
+ export const RAILING_STYLE_OPTIONS = [
4
+ { label: 'Post & rail', value: 'post-and-rail' },
5
+ { label: 'Balusters', value: 'balusters' },
6
+ { label: 'Cable', value: 'cable' },
7
+ { label: 'Boards', value: 'boards' },
8
+ { label: 'Glass', value: 'glass' },
9
+ { label: 'Metal', value: 'metal' },
10
+ ];
11
+ /** What a style's infill is called, and its gap where it has one. */
12
+ export const RAILING_INFILL_LABELS = {
13
+ 'post-and-rail': { size: 'Baluster size', gap: 'Baluster gap' },
14
+ balusters: { size: 'Baluster size', gap: 'Baluster gap' },
15
+ metal: { size: 'Bar size', gap: 'Bar gap' },
16
+ cable: { size: 'Cable size', gap: 'Cable gap' },
17
+ boards: { size: 'Board width', gap: 'Board gap' },
18
+ glass: { size: 'Glass thickness', gap: null },
19
+ };
20
+ /** The styles a 2x6 cap is laid over. */
21
+ export const RAILING_CAPPED_STYLES = new Set([
22
+ 'post-and-rail',
23
+ 'boards',
24
+ ]);
25
+ /** The guard heights offered at a click: 36 in (IRC R312.1.2) and 42 in (IBC 1015.3). */
26
+ export function railingHeightPreset(height) {
27
+ if (Math.abs(height - RAILING_GUARD_HEIGHT) < 1e-4)
28
+ return '36';
29
+ if (Math.abs(height - RAILING_GUARD_HEIGHT_TALL) < 1e-4)
30
+ return '42';
31
+ return null;
32
+ }
33
+ /**
34
+ * A wall turned into a railing: the railing it had, else the default one, as thick as its posts
35
+ * and 36 in tall unless it already stands no taller than a 42 in guard, with no assembly.
36
+ */
37
+ export function railingWallTypePatch(wall) {
38
+ const defaults = railingWallDefaults();
39
+ const railing = wall.railing ? getRailingWallConfig(wall) : defaults.railing;
40
+ return {
41
+ ...defaults,
42
+ railing,
43
+ thickness: railing.postSize,
44
+ height: wall.height !== undefined && wall.height <= RAILING_GUARD_HEIGHT_TALL + 1e-6
45
+ ? wall.height
46
+ : RAILING_GUARD_HEIGHT,
47
+ };
48
+ }
49
+ /** A railing edit: its config with `patch` over it, and its thickness its posts'. */
50
+ export function getRailingWallUpdate(node, patch) {
51
+ const railing = { ...getRailingWallConfig(getEffectiveNode(node)), ...patch };
52
+ return { railing, thickness: railing.postSize };
53
+ }
54
+ /** A style's members, picked with it (`RAILING_STYLE_DEFAULTS`). */
55
+ export function railingStylePatch(style) {
56
+ return { ...RAILING_STYLE_DEFAULTS[style], style };
57
+ }
58
+ /**
59
+ * A railing's rows in the compact wall panel (`wallSettings`), the Railing section's controls:
60
+ * style, guard height, cap, posts and infill. Lengths in metres.
61
+ */
62
+ export function railingWallRows(node, update) {
63
+ const config = getRailingWallConfig(node);
64
+ const height = getRailingWallHeight(node);
65
+ const set = (patch) => update(getRailingWallUpdate(node, patch));
66
+ const styles = RAILING_STYLE_OPTIONS;
67
+ const at = Math.max(0, styles.findIndex((option) => option.value === config.style));
68
+ const cycleStyle = (by) => set(railingStylePatch(styles[(at + by + styles.length) % styles.length].value));
69
+ const stepper = (section, id, label, value, min, step, onChange) => ({
70
+ section,
71
+ id,
72
+ kind: 'stepper',
73
+ label,
74
+ value,
75
+ min,
76
+ max: 1000,
77
+ step,
78
+ unit: 'm',
79
+ onChange: (next) => onChange(Math.min(Math.max(next, min), 1000)),
80
+ });
81
+ const preset = railingHeightPreset(height);
82
+ const infill = RAILING_INFILL_LABELS[config.style];
83
+ const rows = [
84
+ {
85
+ section: 'Railing',
86
+ id: 'railing-style',
87
+ kind: 'cycle',
88
+ label: 'Style',
89
+ value: styles[at].label,
90
+ next: () => cycleStyle(1),
91
+ previous: () => cycleStyle(-1),
92
+ },
93
+ {
94
+ section: 'Railing',
95
+ id: 'railing-guard',
96
+ kind: 'choice',
97
+ label: 'Guard',
98
+ value: preset === '42' ? '42 in' : preset === '36' ? '36 in' : 'Custom',
99
+ onSelect: () => update({ height: preset === '36' ? RAILING_GUARD_HEIGHT_TALL : RAILING_GUARD_HEIGHT }),
100
+ },
101
+ stepper('Railing', 'height', 'Height', height, 0.1, INCH, (next) => update({ height: next })),
102
+ ];
103
+ if (RAILING_CAPPED_STYLES.has(config.style))
104
+ rows.push({
105
+ section: 'Railing',
106
+ id: 'railing-cap',
107
+ kind: 'choice',
108
+ label: '2x6 cap',
109
+ value: config.cap ? 'On' : 'Off',
110
+ onSelect: () => set({ cap: !config.cap }),
111
+ });
112
+ rows.push(stepper('Posts', 'railing-post-spacing', 'Max spacing', config.postSpacing, 0.1, INCH, (v) => set({ postSpacing: v })), stepper('Posts', 'railing-post-size', 'Post size', config.postSize, 0.01, INCH / 2, (v) => set({ postSize: v })), stepper('Infill', 'railing-infill-size', infill.size, config.infillSize, 0.003, INCH / 8, (v) => set({ infillSize: v })));
113
+ if (infill.gap)
114
+ rows.push(stepper('Infill', 'railing-infill-gap', infill.gap, config.infillGap, 0, INCH / 8, (v) => set({ infillGap: v })));
115
+ rows.push(stepper('Infill', 'railing-clearance', 'Floor clearance', config.bottomClearance, 0, INCH / 8, (v) => set({ bottomClearance: v })));
116
+ return rows;
117
+ }
@@ -0,0 +1,17 @@
1
+ import { type WallNode } from '@pascal-app/core';
2
+ type Props = {
3
+ node: WallNode;
4
+ unit: 'metric' | 'imperial';
5
+ onUpdate: (patch: Partial<WallNode>) => void;
6
+ onPreview: (patch: Partial<WallNode>) => void;
7
+ onCommit: () => void;
8
+ onCancel: () => void;
9
+ };
10
+ /**
11
+ * The wall panel's railing controls: the style, the guard's height
12
+ * (36 in, 42 in or its own), the posts' spacing and size, and the infill. Lengths read in inches
13
+ * on an imperial plan, where feet would show a 1½ in baluster as 0.13.
14
+ */
15
+ export declare function RailingWallPanel({ node, unit, onUpdate, onPreview, onCommit, onCancel }: Props): import("react").JSX.Element;
16
+ export {};
17
+ //# sourceMappingURL=railing-wall-panel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"railing-wall-panel.d.ts","sourceRoot":"","sources":["../../src/wall/railing-wall-panel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AAqBzB,KAAK,KAAK,GAAG;IACX,IAAI,EAAE,QAAQ,CAAA;IACd,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAA;IAC3B,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IAC5C,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;IAC7C,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,QAAQ,EAAE,MAAM,IAAI,CAAA;CACrB,CAAA;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE,KAAK,+BAuG9F"}