@pascal-app/nodes 1.0.6 → 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,107 @@
1
+ 'use client';
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { beamCeilingPlane, beamPlan, beamSizeLabel, beamSizePresetPatch, beamTopElevation, beamTopReferencePatch, DEFAULT_FRAMING_POST_SIZE, usePascalI18n, useScene, } from '@pascal-app/core';
4
+ import { ActionButton, ActionGroup, formatLinearMeasurement, MetricControl, PanelSection, PanelWrapper, SegmentedControl, SelectControl, triggerSFX, useEditor, } from '@pascal-app/editor';
5
+ import { useViewer } from '@pascal-app/viewer';
6
+ import { Columns2, Move, Trash2 } from 'lucide-react';
7
+ import { useState } from 'react';
8
+ import { electedPostFoot, framingPostsUnderBeam } from '../column/post-placement.js';
9
+ import { BEAM_MATERIAL_OPTIONS, beamSizeOptions, beamSizeValue, beamTopOptions, beamTopValue, } from './panel-model.js';
10
+ const IN = 0.0254;
11
+ const CUSTOM = 'custom';
12
+ /** A section size in metres, shown in inches on an imperial plan (feet would show 7-1/2 in as 0.63). */
13
+ function InchField({ label, value, onCommit, }) {
14
+ const [draft, setDraft] = useState(null);
15
+ const imperial = useViewer((state) => state.unit) === 'imperial';
16
+ const toShown = (meters) => (imperial ? meters / IN : meters);
17
+ return (_jsx(MetricControl, { className: "h-9 text-xs", label: label, min: toShown(0.01), onChange: (next) => setDraft(next), onCommit: (next) => {
18
+ setDraft(null);
19
+ onCommit(imperial ? next * IN : next);
20
+ }, precision: imperial ? 3 : 4, restoreOnCommit: false, step: imperial ? 0.25 : 0.005, unit: imperial ? 'in' : 'm', value: draft ?? toShown(value) }));
21
+ }
22
+ /** The fields a ply count writes: as many plies of the same board, the width growing with them. */
23
+ export function beamPliesPatch(beam, plies) {
24
+ return { plies, width: (beam.width / beam.plies) * plies };
25
+ }
26
+ /**
27
+ * A beam's panel: its size (a stock size, or a width, depth and plies of its own), what it is made
28
+ * of, how the joists meet it and where its top is, with its length and underside; Move, Delete,
29
+ * and posts under it at each end and every 8 ft.
30
+ */
31
+ export default function BeamPanel() {
32
+ const i18n = usePascalI18n();
33
+ const selectedId = useViewer((state) => state.selection.selectedIds[0]);
34
+ const setSelection = useViewer((state) => state.setSelection);
35
+ const unit = useViewer((state) => state.unit);
36
+ const metricNotation = useViewer((state) => state.metricNotation);
37
+ const nodes = useScene((state) => state.nodes);
38
+ const beam = selectedId ? nodes[selectedId] : undefined;
39
+ if (beam?.type !== 'beam')
40
+ return null;
41
+ const update = (patch) => useScene.getState().updateNode(beam.id, patch);
42
+ const length = (meters) => formatLinearMeasurement(meters, unit, metricNotation);
43
+ const size = beamSizeValue(beam);
44
+ const top = beamTopValue(nodes, beam);
45
+ const topY = beamTopElevation(nodes, beam);
46
+ const plane = beamCeilingPlane(nodes, beam);
47
+ return (_jsxs(PanelWrapper, { icon: "/icons/beam.svg", onClose: () => setSelection({ selectedIds: [] }), title: beam.name ?? i18n._({ id: 'node.beam.panel.beam', message: 'Beam' }), width: 300, children: [_jsxs(PanelSection, { title: i18n._({
48
+ id: 'node.beam.panel.beamSize',
49
+ message: 'Beam {size}',
50
+ values: { size: beamSizeLabel(beam) },
51
+ }), children: [_jsx(SelectControl, { label: i18n._({ id: 'node.beam.panel.size', message: 'Size' }), onChange: (id) => {
52
+ if (id !== CUSTOM)
53
+ update(beamSizePresetPatch(beam, id));
54
+ }, options: beamSizeOptions(size), value: size }), _jsx(SelectControl, { label: i18n._({ id: 'node.beam.panel.material', message: 'Material' }), onChange: (material) => update({ material: material }), options: BEAM_MATERIAL_OPTIONS, value: beam.material }), _jsx(InchField, { label: i18n._({ id: 'node.beam.panel.width', message: 'Width' }), onCommit: (width) => update({ width, size: undefined }), value: beam.width }), _jsx(InchField, { label: i18n._({ id: 'node.beam.panel.depth', message: 'Depth' }), onCommit: (depth) => update({ depth, size: undefined }), value: beam.depth }), _jsx(SegmentedControl, { onChange: (plies) => update(beamPliesPatch(beam, Number(plies))), options: ['1', '2', '3', '4'].map((plies) => ({
55
+ label: plies === '1'
56
+ ? i18n._({ id: 'node.beam.panel.n1Ply', message: '1 ply' })
57
+ : i18n._({
58
+ id: 'node.beam.panel.pliesPlies',
59
+ message: '{plies} plies',
60
+ values: { plies },
61
+ }),
62
+ value: plies,
63
+ })), value: String(beam.plies) })] }), _jsxs(PanelSection, { title: i18n._({ id: 'node.beam.panel.placement', message: 'Placement' }), children: [_jsx(SegmentedControl, { onChange: (placement) => update({ placement }), options: [
64
+ {
65
+ label: i18n._({ id: 'node.beam.panel.dropped', message: 'Dropped' }),
66
+ value: 'dropped',
67
+ },
68
+ { label: i18n._({ id: 'node.beam.panel.flush', message: 'Flush' }), value: 'flush' },
69
+ ], value: beam.placement }), _jsx(SelectControl, { label: i18n._({ id: 'node.beam.panel.top', message: 'Top' }), onChange: (reference) => {
70
+ if (reference !== CUSTOM)
71
+ update(beamTopReferencePatch(nodes, beam, reference));
72
+ }, options: beamTopOptions(top), value: top }), _jsx(MetricControl, { label: i18n._({ id: 'node.beam.panel.topElevation', message: 'Top elevation' }), onChange: (value) => update({ topElevation: value }), precision: 3, step: 0.01, unit: "m", value: topY }), _jsx("p", { className: "px-0.5 text-muted-foreground text-xs", "data-beam-readout": true, children: i18n._({
73
+ id: 'node.beam.panel.lengthLongItsUnderside',
74
+ message: '{length} long; its underside {underside} over the floor, the ceiling plane {plane}.',
75
+ values: {
76
+ length: length(beamPlan(beam).length),
77
+ underside: length(topY - beam.depth),
78
+ plane: length(plane),
79
+ },
80
+ }) }), beam.topElevation !== undefined && (_jsx("button", { className: "self-start rounded-full border border-border/50 px-3 py-1 text-muted-foreground text-xs hover:text-foreground", onClick: () => update({ topElevation: undefined }), type: "button", children: i18n._({
81
+ id: 'node.beam.panel.followTheCeilingPlane',
82
+ message: 'Follow the ceiling plane',
83
+ }) }))] }), _jsx(PanelSection, { title: i18n._({ id: 'node.beam.panel.actions', message: 'Actions' }), children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Columns2, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.beam.panel.addPosts', message: 'Add posts' }), onClick: () => {
84
+ const posts = beam.parentId
85
+ ? framingPostsUnderBeam({
86
+ nodes,
87
+ beam,
88
+ choices: { size: DEFAULT_FRAMING_POST_SIZE, base: 'none' },
89
+ foot: electedPostFoot(nodes, beam.parentId),
90
+ })
91
+ : [];
92
+ if (posts.length === 0)
93
+ return;
94
+ const standing = Object.values(nodes).filter((node) => node.type === 'column' && node.role === 'post').length;
95
+ useScene.getState().createNodes(posts.map((post, index) => ({
96
+ node: { ...post, name: `Post ${standing + index + 1}` },
97
+ parentId: beam.parentId,
98
+ })));
99
+ triggerSFX('sfx:structure-build');
100
+ } }), _jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.beam.panel.move', message: 'Move' }), onClick: () => {
101
+ triggerSFX('sfx:item-pick');
102
+ useEditor.getState().setMovingNode(beam);
103
+ } }), _jsx(ActionButton, { icon: _jsx(Trash2, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.beam.panel.delete', message: 'Delete' }), onClick: () => {
104
+ useScene.getState().deleteNode(beam.id);
105
+ setSelection({ selectedIds: [] });
106
+ } })] }) })] }));
107
+ }
@@ -0,0 +1,3 @@
1
+ import type { BeamNode, ParametricDescriptor } from '@pascal-app/core';
2
+ export declare const beamParametrics: ParametricDescriptor<BeamNode>;
3
+ //# sourceMappingURL=parametrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parametrics.d.ts","sourceRoot":"","sources":["../../src/beam/parametrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAEtE,eAAO,MAAM,eAAe,EAAE,oBAAoB,CAAC,QAAQ,CAG1D,CAAA"}
@@ -0,0 +1,4 @@
1
+ export const beamParametrics = {
2
+ groups: [],
3
+ customPanel: () => import('./panel.js'),
4
+ };
@@ -0,0 +1,13 @@
1
+ import { type BeamNode } from '@pascal-app/core';
2
+ import type { Material } from 'three';
3
+ /** How a beam of `material` looks: its library material, or the plain surface colour when textures are off. */
4
+ export declare function useBeamMaterial(material: BeamNode['material']): Material;
5
+ /**
6
+ * A beam: its solid laid along the centreline in its level, the top where the beam's top resolves
7
+ * (`beamTopElevation`: its own, else the ceiling plane over it). Reads live overrides, so a drag
8
+ * in either view moves it at once.
9
+ */
10
+ export default function BeamRenderer({ node: stored }: {
11
+ node: BeamNode;
12
+ }): import("react").JSX.Element;
13
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/beam/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAA;AAQzB,OAAO,KAAK,EAAS,QAAQ,EAAE,MAAM,OAAO,CAAA;AAG5C,+GAA+G;AAC/G,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,QAAQ,CAWxE;AAED;;;;GAIG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,+BAqCxE"}
@@ -0,0 +1,36 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { BEAM_MATERIAL_LIBRARY_REFS, beamTopElevation, useLiveNodeOverrides, useRegistry, useScene, } from '@pascal-app/core';
4
+ import { createSurfaceRoleMaterial, resolveSlotDefaultMaterial, useNodeEvents, useViewer, } from '@pascal-app/viewer';
5
+ import { useEffect, useMemo, useRef } from 'react';
6
+ import { beamBox, buildBeamGeometry } from './geometry.js';
7
+ /** How a beam of `material` looks: its library material, or the plain surface colour when textures are off. */
8
+ export function useBeamMaterial(material) {
9
+ const shading = useViewer((state) => state.shading);
10
+ const textures = useViewer((state) => state.textures);
11
+ const colorPreset = useViewer((state) => state.colorPreset);
12
+ return useMemo(() => textures
13
+ ? resolveSlotDefaultMaterial(BEAM_MATERIAL_LIBRARY_REFS[material], shading)
14
+ : createSurfaceRoleMaterial('wall', colorPreset), [material, shading, textures, colorPreset]);
15
+ }
16
+ /**
17
+ * A beam: its solid laid along the centreline in its level, the top where the beam's top resolves
18
+ * (`beamTopElevation`: its own, else the ceiling plane over it). Reads live overrides, so a drag
19
+ * in either view moves it at once.
20
+ */
21
+ export default function BeamRenderer({ node: stored }) {
22
+ const ref = useRef(null);
23
+ useRegistry(stored.id, 'beam', ref);
24
+ const live = useLiveNodeOverrides((state) => state.overrides.get(stored.id));
25
+ const node = useMemo(() => (live ? { ...stored, ...live } : stored), [stored, live]);
26
+ const handlers = useNodeEvents(node, 'beam');
27
+ const top = useScene((state) => beamTopElevation(state.nodes, node));
28
+ const material = useBeamMaterial(node.material);
29
+ const placed = beamBox(node, top);
30
+ const length = placed?.size[0] ?? 0;
31
+ const geometry = useMemo(() => length > 0
32
+ ? buildBeamGeometry({ width: node.width, depth: node.depth, plies: node.plies, material: node.material }, length)
33
+ : null, [length, node.width, node.depth, node.plies, node.material]);
34
+ useEffect(() => () => geometry?.dispose(), [geometry]);
35
+ return (_jsx("group", { ref: ref, children: placed && geometry && (_jsx("mesh", { castShadow: true, geometry: geometry, material: material, position: placed.position, receiveShadow: true, "rotation-y": placed.rotationY, ...handlers })) }));
36
+ }
@@ -0,0 +1,2 @@
1
+ export { BeamNode } from '@pascal-app/core';
2
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/beam/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1 @@
1
+ export { BeamNode } from '@pascal-app/core';
@@ -0,0 +1,13 @@
1
+ import { type BeamNode } from '@pascal-app/core';
2
+ import { type PlacementPreviewDimension } from '@pascal-app/editor';
3
+ /** The draft's length, as a dimension along it in the plan (the 3D view prints its own label). */
4
+ export declare function beamDraftDimensions(beam: BeamNode): PlacementPreviewDimension[];
5
+ /**
6
+ * The beam tool in 2D-only view: the 3D tool lives in the canvas, which never renders while its
7
+ * pane is hidden. The plan draws the draft from the placement preview. Split and 3D views keep the
8
+ * 3D tool as the one owner.
9
+ */
10
+ export declare function BeamFloorplanTool(): null;
11
+ declare const BeamTool: () => import("react").JSX.Element | null;
12
+ export default BeamTool;
13
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/beam/tool.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,QAAQ,EAOd,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAOL,KAAK,yBAAyB,EAO/B,MAAM,oBAAoB,CAAA;AAsB3B,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,QAAQ,GAAG,yBAAyB,EAAE,CAc/E;AAmGD;;;;GAIG;AACH,wBAAgB,iBAAiB,SAGhC;AAED,QAAA,MAAM,QAAQ,0CA6Cb,CAAA;eAEc,QAAQ"}
@@ -0,0 +1,152 @@
1
+ 'use client';
2
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { beamPlan, beamTopElevation, emitter, sceneRegistry, useScene, } from '@pascal-app/core';
4
+ import { CursorSphere, DRAFT_LABEL_Y_OFFSET, DraftMeasurementLabel, formatLinearMeasurement, isSegmentLongEnough, markToolCancelConsumed, triggerSFX, useEditor, usePlacementPreview, useWallSnapIndicator, visibleScene, } from '@pascal-app/editor';
5
+ import { getSceneTheme, useViewer } from '@pascal-app/viewer';
6
+ import { createPortal } from '@react-three/fiber';
7
+ import { useEffect, useMemo, useState } from 'react';
8
+ import { DoubleSide } from 'three';
9
+ import { MeshBasicNodeMaterial } from 'three/webgpu';
10
+ import { stopPlacementCommitPropagation, subscribeFloorPlacementClicks, } from '../shared/floor-placement.js';
11
+ import { draftBeam, snapBeamPoint } from './drafting.js';
12
+ import { beamBox, buildBeamGeometry } from './geometry.js';
13
+ const ghostMaterial = new MeshBasicNodeMaterial({
14
+ color: '#f59e0b',
15
+ depthWrite: false,
16
+ opacity: 0.5,
17
+ side: DoubleSide,
18
+ transparent: true,
19
+ });
20
+ /** The draft's length, as a dimension along it in the plan (the 3D view prints its own label). */
21
+ export function beamDraftDimensions(beam) {
22
+ const plan = beamPlan(beam);
23
+ if (plan.length < 0.05)
24
+ return [];
25
+ return [
26
+ {
27
+ id: 'beam-length',
28
+ start: [plan.start[0], 0, plan.start[1]],
29
+ end: [plan.end[0], 0, plan.end[1]],
30
+ offsetNormal: plan.normal,
31
+ offsetDistance: plan.width / 2 + 0.25,
32
+ value: plan.length,
33
+ renderIn3d: false,
34
+ },
35
+ ];
36
+ }
37
+ /**
38
+ * Drafting beams from the grid events both views send: a click sets the start, the next ends the
39
+ * beam and starts the next one there, so a porch's run is drawn corner to corner; Esc ends the run.
40
+ * Points snap as walls do (wall ends, faces and crossings, other beams' ends and runs, post
41
+ * centres, the grid, the angle steps off the start); Alt places freely. The beam takes the Build
42
+ * panel's size, material and top (`useBeamDraft`), or the preset a host armed the tool with.
43
+ * `enabled` off, it stands aside.
44
+ */
45
+ function useBeamDrafting(enabled) {
46
+ const levelId = useViewer((state) => state.selection.levelId);
47
+ const [draft, setDraft] = useState(null);
48
+ const [cursor, setCursor] = useState(null);
49
+ useEffect(() => {
50
+ if (!(enabled && levelId))
51
+ return;
52
+ let start = null;
53
+ let last = null;
54
+ setDraft(null);
55
+ const snap = (event) => {
56
+ const { point, snap: caught } = snapBeamPoint({
57
+ point: [event.localPosition[0], event.localPosition[2]],
58
+ nodes: useScene.getState().nodes,
59
+ levelId,
60
+ start,
61
+ free: event.nativeEvent?.altKey === true,
62
+ });
63
+ if (caught)
64
+ useWallSnapIndicator.getState().set({ x: point[0], z: point[1], kind: caught });
65
+ else
66
+ useWallSnapIndicator.getState().clear();
67
+ return point;
68
+ };
69
+ const make = (from, to, fields) => draftBeam(from, to, levelId, useScene.getState().nodes, undefined, useEditor.getState().toolDefaults.beam, fields);
70
+ const show = (next) => {
71
+ setDraft(next);
72
+ if (next)
73
+ usePlacementPreview.getState().set(next, null, beamDraftDimensions(next));
74
+ else
75
+ usePlacementPreview.getState().clear();
76
+ };
77
+ const onMove = (event) => {
78
+ const point = snap(event);
79
+ if (last && point[0] === last[0] && point[1] === last[1])
80
+ return;
81
+ last = point;
82
+ setCursor([point[0], event.localPosition[1], point[1]]);
83
+ show(start && isSegmentLongEnough(start, point) ? make(start, point) : null);
84
+ };
85
+ const onClick = (event) => {
86
+ const point = last ?? snap(event);
87
+ stopPlacementCommitPropagation(event);
88
+ if (!start) {
89
+ start = point;
90
+ triggerSFX('sfx:grid-snap');
91
+ return;
92
+ }
93
+ if (!isSegmentLongEnough(start, point))
94
+ return;
95
+ const count = Object.values(useScene.getState().nodes).filter((node) => node.type === 'beam').length;
96
+ const beam = make(start, point, { name: `Beam ${count + 1}` });
97
+ useScene.getState().createNode(beam, levelId);
98
+ triggerSFX('sfx:structure-build');
99
+ // The run goes on from the end just placed.
100
+ start = point;
101
+ show(null);
102
+ };
103
+ const onCancel = () => {
104
+ if (!start)
105
+ return;
106
+ markToolCancelConsumed();
107
+ start = null;
108
+ show(null);
109
+ };
110
+ emitter.on('grid:move', onMove);
111
+ emitter.on('tool:cancel', onCancel);
112
+ const unsubscribeClicks = subscribeFloorPlacementClicks(onClick);
113
+ return () => {
114
+ emitter.off('grid:move', onMove);
115
+ emitter.off('tool:cancel', onCancel);
116
+ unsubscribeClicks();
117
+ usePlacementPreview.getState().clear();
118
+ useWallSnapIndicator.getState().clear();
119
+ setDraft(null);
120
+ setCursor(null);
121
+ };
122
+ }, [enabled, levelId]);
123
+ return { levelId, draft, cursor };
124
+ }
125
+ /**
126
+ * The beam tool in 2D-only view: the 3D tool lives in the canvas, which never renders while its
127
+ * pane is hidden. The plan draws the draft from the placement preview. Split and 3D views keep the
128
+ * 3D tool as the one owner.
129
+ */
130
+ export function BeamFloorplanTool() {
131
+ useBeamDrafting(useEditor((state) => visibleScene(state) === '2d'));
132
+ return null;
133
+ }
134
+ const BeamTool = () => {
135
+ const { levelId, draft, cursor } = useBeamDrafting(useEditor((state) => visibleScene(state) !== '2d'));
136
+ const top = useScene((state) => (draft ? beamTopElevation(state.nodes, draft) : 0));
137
+ const unit = useViewer((state) => state.unit);
138
+ const metricNotation = useViewer((state) => state.metricNotation);
139
+ const dark = useViewer((state) => getSceneTheme(state.sceneTheme).appearance === 'dark');
140
+ const placed = draft ? beamBox(draft, top) : null;
141
+ const length = placed?.size[0] ?? 0;
142
+ const geometry = useMemo(() => (draft && length > 0 ? buildBeamGeometry(draft, length) : null), [draft, length]);
143
+ useEffect(() => () => geometry?.dispose(), [geometry]);
144
+ const level = levelId ? sceneRegistry.nodes.get(levelId) : undefined;
145
+ if (!levelId)
146
+ return null;
147
+ return (_jsxs(_Fragment, { children: [cursor && _jsx(CursorSphere, { position: cursor }), placed &&
148
+ geometry &&
149
+ level &&
150
+ createPortal(_jsxs("group", { children: [_jsx("mesh", { geometry: geometry, material: ghostMaterial, position: placed.position, raycast: () => { }, renderOrder: 2, "rotation-y": placed.rotationY }), _jsx(DraftMeasurementLabel, { color: dark ? '#ffffff' : '#111111', label: formatLinearMeasurement(length, unit, metricNotation), position: [placed.position[0], top + DRAFT_LABEL_Y_OFFSET, placed.position[2]], shadowColor: dark ? '#111111' : '#ffffff' })] }), level)] }));
151
+ };
152
+ export default BeamTool;
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/box-vent/panel.tsx"],"names":[],"mappings":"AA0BA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,uCAiYnC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/box-vent/panel.tsx"],"names":[],"mappings":"AA2BA;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,OAAO,UAAU,YAAY,uCAsYnC"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { getActiveRoofHeight, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
3
+ import { getActiveRoofHeight, useLiveNodeOverrides, usePascalI18n, useScene, } from '@pascal-app/core';
4
4
  import { ActionButton, ActionGroup, duplicateNodeAndPickUp, PanelSection, PanelWrapper, SegmentedControl, SliderControl, triggerSFX, useEditor, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Copy, Move, Trash2 } from 'lucide-react';
@@ -18,6 +18,7 @@ import { useCallback } from 'react';
18
18
  * ghost commits; on Esc it cancels and the original mesh is restored.
19
19
  */
20
20
  export default function BoxVentPanel() {
21
+ const i18n = usePascalI18n();
21
22
  const selectedId = useViewer((s) => s.selection.selectedIds[0]);
22
23
  const setSelection = useViewer((s) => s.setSelection);
23
24
  const updateNode = useScene((s) => s.updateNode);
@@ -100,11 +101,11 @@ export default function BoxVentPanel() {
100
101
  }, [selectedId, node, deleteNode, setSelection]);
101
102
  if (!(node && node.type === 'box-vent' && selectedId))
102
103
  return null;
103
- return (_jsxs(PanelWrapper, { icon: "/icons/roof.webp", onBack: node.roofSegmentId ? handleBack : undefined, onClose: handleClose, title: node.name || 'Box Vent', width: 300, children: [_jsx(PanelSection, { title: "Style", children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ style: v }), options: [
104
- { label: 'Box', value: 'box' },
105
- { label: 'Cap', value: 'cap' },
106
- { label: 'Dome', value: 'dome' },
107
- ], value: node.style ?? 'cap' }) }), _jsxs(PanelSection, { title: "Dimensions", children: [_jsx(SliderControl, { label: "Width", max: 1000, min: 0.15, onChange: (v) => previewProp({ width: v }), onCommit: (v) => handleUpdate({ width: v }), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.width }), _jsx(SliderControl, { label: "Depth", max: 1000, min: 0.15, onChange: (v) => previewProp({ depth: v }), onCommit: (v) => handleUpdate({ depth: v }), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.depth }), _jsx(SliderControl, { label: "Height", max: 1000, min: 0.05, onChange: (v) => previewProp({ height: v }), onCommit: (v) => handleUpdate({ height: v }), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.height }), node.style === 'cap' && (_jsx(SliderControl, { label: "Hood Overhang", max: Math.max(0.02, node.width), min: 0, onChange: (v) => previewProp({ hoodOverhang: v }), onCommit: (v) => handleUpdate({ hoodOverhang: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.hoodOverhang ?? 0 })), node.style === 'box' && (_jsxs(_Fragment, { children: [_jsx(SliderControl, { label: "Base Inset", max: Math.max(0.005, Math.min(node.width, node.depth) / 2 - 0.005), min: 0, onChange: (v) => previewProp({ baseInset: v }), onCommit: (v) => handleUpdate({ baseInset: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.baseInset ?? 0.06 }), _jsx(SliderControl, { label: "Base Height", max: Math.max(0.01, node.height - 0.005), min: 0.005, onChange: (v) => previewProp({ baseHeight: v }), onCommit: (v) => handleUpdate({ baseHeight: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.baseHeight ?? 0.04 }), _jsx(SliderControl, { label: "Corner Bevel", max: Math.max(0, Math.min(node.width, node.depth) / 2 - (node.baseInset ?? 0.06) - 0.001), min: 0, onChange: (v) => previewProp({ cornerBevel: v }), onCommit: (v) => handleUpdate({ cornerBevel: v }), precision: 3, restoreOnCommit: false, step: 0.002, unit: "m", value: node.cornerBevel ?? 0.012 })] })), node.style === 'cap' && (_jsxs(_Fragment, { children: [_jsx(SliderControl, { label: "Cap Height", max: Math.max(0.02, node.height - 0.01), min: 0.01, onChange: (v) => previewProp({ capHeight: v }), onCommit: (v) => handleUpdate({ capHeight: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.capHeight ?? 0.07 }), _jsx(SliderControl, { label: "Gap Height", max: Math.max(0, node.height - Math.max(0.01, node.capHeight ?? 0.07) - 0.005), min: 0, onChange: (v) => previewProp({ capGap: v }), onCommit: (v) => handleUpdate({ capGap: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.capGap ?? 0 }), _jsx(SliderControl, { label: "Top Taper", max: 1, min: 0, onChange: (v) => previewProp({ topTaper: v }), onCommit: (v) => handleUpdate({ topTaper: v }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "", value: Math.round((node.topTaper ?? 0.4) * 100) / 100 })] })), node.style === 'dome' && (_jsxs(_Fragment, { children: [_jsx(SliderControl, { label: "Dome Curvature", max: 1.5, min: 0.3, onChange: (v) => previewProp({ domeCurvature: v }), onCommit: (v) => handleUpdate({ domeCurvature: v }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "", value: Math.round((node.domeCurvature ?? 1.0) * 100) / 100 }), _jsx(SliderControl, { label: "Base Flange", max: 0.2, min: 0, onChange: (v) => previewProp({ hoodOverhang: v }), onCommit: (v) => handleUpdate({ hoodOverhang: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.hoodOverhang ?? 0.04 })] }))] }), _jsxs(PanelSection, { title: "Position", children: [_jsx(SliderControl, { label: "X", max: Math.round(((segment?.width ?? 10) / 2) * 100) / 100, min: -Math.round(((segment?.width ?? 10) / 2) * 100) / 100, onChange: (v) => previewProp({
104
+ return (_jsxs(PanelWrapper, { icon: "/icons/roof.webp", onBack: node.roofSegmentId ? handleBack : undefined, onClose: handleClose, title: node.name || i18n._({ id: 'node.boxVent.panel.boxVent', message: 'Box Vent' }), width: 300, children: [_jsx(PanelSection, { title: i18n._({ id: 'node.boxVent.panel.style', message: 'Style' }), children: _jsx(SegmentedControl, { onChange: (v) => handleUpdate({ style: v }), options: [
105
+ { label: i18n._({ id: 'node.boxVent.panel.box', message: 'Box' }), value: 'box' },
106
+ { label: i18n._({ id: 'node.boxVent.panel.cap', message: 'Cap' }), value: 'cap' },
107
+ { label: i18n._({ id: 'node.boxVent.panel.dome', message: 'Dome' }), value: 'dome' },
108
+ ], value: node.style ?? 'cap' }) }), _jsxs(PanelSection, { title: i18n._({ id: 'node.boxVent.panel.dimensions', message: 'Dimensions' }), children: [_jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.width', message: 'Width' }), max: 1000, min: 0.15, onChange: (v) => previewProp({ width: v }), onCommit: (v) => handleUpdate({ width: v }), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.width }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.depth', message: 'Depth' }), max: 1000, min: 0.15, onChange: (v) => previewProp({ depth: v }), onCommit: (v) => handleUpdate({ depth: v }), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.depth }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.height', message: 'Height' }), max: 1000, min: 0.05, onChange: (v) => previewProp({ height: v }), onCommit: (v) => handleUpdate({ height: v }), precision: 2, restoreOnCommit: false, step: 0.01, unit: "m", value: node.height }), node.style === 'cap' && (_jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.hoodOverhang', message: 'Hood Overhang' }), max: Math.max(0.02, node.width), min: 0, onChange: (v) => previewProp({ hoodOverhang: v }), onCommit: (v) => handleUpdate({ hoodOverhang: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.hoodOverhang ?? 0 })), node.style === 'box' && (_jsxs(_Fragment, { children: [_jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.baseInset', message: 'Base Inset' }), max: Math.max(0.005, Math.min(node.width, node.depth) / 2 - 0.005), min: 0, onChange: (v) => previewProp({ baseInset: v }), onCommit: (v) => handleUpdate({ baseInset: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.baseInset ?? 0.06 }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.baseHeight', message: 'Base Height' }), max: Math.max(0.01, node.height - 0.005), min: 0.005, onChange: (v) => previewProp({ baseHeight: v }), onCommit: (v) => handleUpdate({ baseHeight: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.baseHeight ?? 0.04 }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.cornerBevel', message: 'Corner Bevel' }), max: Math.max(0, Math.min(node.width, node.depth) / 2 - (node.baseInset ?? 0.06) - 0.001), min: 0, onChange: (v) => previewProp({ cornerBevel: v }), onCommit: (v) => handleUpdate({ cornerBevel: v }), precision: 3, restoreOnCommit: false, step: 0.002, unit: "m", value: node.cornerBevel ?? 0.012 })] })), node.style === 'cap' && (_jsxs(_Fragment, { children: [_jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.capHeight', message: 'Cap Height' }), max: Math.max(0.02, node.height - 0.01), min: 0.01, onChange: (v) => previewProp({ capHeight: v }), onCommit: (v) => handleUpdate({ capHeight: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.capHeight ?? 0.07 }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.gapHeight', message: 'Gap Height' }), max: Math.max(0, node.height - Math.max(0.01, node.capHeight ?? 0.07) - 0.005), min: 0, onChange: (v) => previewProp({ capGap: v }), onCommit: (v) => handleUpdate({ capGap: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.capGap ?? 0 }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.topTaper', message: 'Top Taper' }), max: 1, min: 0, onChange: (v) => previewProp({ topTaper: v }), onCommit: (v) => handleUpdate({ topTaper: v }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "", value: Math.round((node.topTaper ?? 0.4) * 100) / 100 })] })), node.style === 'dome' && (_jsxs(_Fragment, { children: [_jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.domeCurvature', message: 'Dome Curvature' }), max: 1.5, min: 0.3, onChange: (v) => previewProp({ domeCurvature: v }), onCommit: (v) => handleUpdate({ domeCurvature: v }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "", value: Math.round((node.domeCurvature ?? 1.0) * 100) / 100 }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.baseFlange', message: 'Base Flange' }), max: 0.2, min: 0, onChange: (v) => previewProp({ hoodOverhang: v }), onCommit: (v) => handleUpdate({ hoodOverhang: v }), precision: 3, restoreOnCommit: false, step: 0.005, unit: "m", value: node.hoodOverhang ?? 0.04 })] }))] }), _jsxs(PanelSection, { title: i18n._({ id: 'node.boxVent.panel.position', message: 'Position' }), children: [_jsx(SliderControl, { label: "X", max: Math.round(((segment?.width ?? 10) / 2) * 100) / 100, min: -Math.round(((segment?.width ?? 10) / 2) * 100) / 100, onChange: (v) => previewProp({
108
109
  position: [v, node.position[1] ?? 0, node.position[2] ?? 0],
109
110
  }), onCommit: (v) => handleUpdate({
110
111
  position: [v, node.position[1] ?? 0, node.position[2] ?? 0],
@@ -116,5 +117,5 @@ export default function BoxVentPanel() {
116
117
  position: [node.position[0] ?? 0, node.position[1] ?? 0, v],
117
118
  }), onCommit: (v) => handleUpdate({
118
119
  position: [node.position[0] ?? 0, node.position[1] ?? 0, v],
119
- }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: node.position[2] ?? 0 }), _jsx(SliderControl, { label: "Rotation", max: 180, min: -180, onChange: (deg) => previewProp({ rotation: (deg * Math.PI) / 180 }), onCommit: (deg) => handleUpdate({ rotation: (deg * Math.PI) / 180 }), precision: 0, restoreOnCommit: false, step: 1, unit: "\u00B0", value: Math.round(((node.rotation ?? 0) * 180) / Math.PI) })] }), _jsx(PanelSection, { title: "Actions", children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: "Move", onClick: handleMove }), _jsx(ActionButton, { icon: _jsx(Copy, { className: "h-3.5 w-3.5" }), label: "Duplicate", onClick: handleDuplicate }), _jsx(ActionButton, { className: "hover:bg-red-500/20", icon: _jsx(Trash2, { className: "h-3.5 w-3.5 text-red-600 dark:text-red-400" }), label: "Delete", onClick: handleDelete })] }) })] }));
120
+ }), precision: 2, restoreOnCommit: false, step: 0.05, unit: "m", value: node.position[2] ?? 0 }), _jsx(SliderControl, { label: i18n._({ id: 'node.boxVent.panel.rotation', message: 'Rotation' }), max: 180, min: -180, onChange: (deg) => previewProp({ rotation: (deg * Math.PI) / 180 }), onCommit: (deg) => handleUpdate({ rotation: (deg * Math.PI) / 180 }), precision: 0, restoreOnCommit: false, step: 1, unit: "\u00B0", value: Math.round(((node.rotation ?? 0) * 180) / Math.PI) })] }), _jsx(PanelSection, { title: i18n._({ id: 'node.boxVent.panel.actions', message: 'Actions' }), children: _jsxs(ActionGroup, { children: [_jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.boxVent.panel.move', message: 'Move' }), onClick: handleMove }), _jsx(ActionButton, { icon: _jsx(Copy, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.boxVent.panel.duplicate', message: 'Duplicate' }), onClick: handleDuplicate }), _jsx(ActionButton, { className: "hover:bg-red-500/20", icon: _jsx(Trash2, { className: "h-3.5 w-3.5 text-red-600 dark:text-red-400" }), label: i18n._({ id: 'node.boxVent.panel.delete', message: 'Delete' }), onClick: handleDelete })] }) })] }));
120
121
  }
@@ -0,0 +1,10 @@
1
+ import type { BatchableConfig } from '@pascal-app/core';
2
+ /**
3
+ * Cabinet runs and modules batch wherever they sit under a level: a run's
4
+ * modules (and the wall units stacked on them) are released by the run's
5
+ * edits, tint and gestures. Opening a door or drawer is a live override or a
6
+ * dirty mark, both of which release. A cooktop with lit burners animates its
7
+ * flames every frame and draws itself.
8
+ */
9
+ export declare const cabinetBatchable: BatchableConfig;
10
+ //# sourceMappingURL=batchable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchable.d.ts","sourceRoot":"","sources":["../../src/cabinet/batchable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAW,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAIhE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,EAAE,eAI9B,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { compartmentCooktopBurnersOn, stackForCabinet } from './stack.js';
2
+ /**
3
+ * Cabinet runs and modules batch wherever they sit under a level: a run's
4
+ * modules (and the wall units stacked on them) are released by the run's
5
+ * edits, tint and gestures. Opening a door or drawer is a live override or a
6
+ * dirty mark, both of which release. A cooktop with lit burners animates its
7
+ * flames every frame and draws itself.
8
+ */
9
+ export const cabinetBatchable = {
10
+ scope: 'level',
11
+ excluded: (node) => stackForCabinet(node).some(compartmentCooktopBurnersOn),
12
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"compartment-card.d.ts","sourceRoot":"","sources":["../../src/cabinet/compartment-card.tsx"],"names":[],"mappings":"AAIA,OAAO,EACL,KAAK,kBAAkB,EAwBxB,MAAM,SAAS,CAAA;AAwJhB,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,KAAK,EACL,YAAY,EACZ,KAAK,EACL,aAAa,EACb,cAAc,EACd,KAAK,EACL,SAAS,EACT,cAAc,EACd,QAAQ,EACR,MAAM,EACN,SAAiB,EACjB,WAAmB,GACpB,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,+BA0SA"}
1
+ {"version":3,"file":"compartment-card.d.ts","sourceRoot":"","sources":["../../src/cabinet/compartment-card.tsx"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,kBAAkB,EAwBxB,MAAM,SAAS,CAAA;AA+OhB,wBAAgB,eAAe,CAAC,EAC9B,WAAW,EACX,KAAK,EACL,YAAY,EACZ,KAAK,EACL,aAAa,EACb,cAAc,EACd,KAAK,EACL,SAAS,EACT,cAAc,EACd,QAAQ,EACR,MAAM,EACN,SAAiB,EACjB,WAAmB,GACpB,EAAE;IACD,WAAW,EAAE,kBAAkB,CAAA;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,YAAY,EAAE,MAAM,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,EAAE,CAAC,IAAI,EAAE,kBAAkB,KAAK,IAAI,CAAA;IAC7C,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;IACxC,QAAQ,EAAE,MAAM,IAAI,CAAA;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,WAAW,CAAC,EAAE,OAAO,CAAA;CACtB,+BA0TA"}