@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
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/window/tool.tsx"],"names":[],"mappings":"AA+GA;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EA2oCvB,CAAA;eAEc,UAAU"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/window/tool.tsx"],"names":[],"mappings":"AAmHA;;;;;;;;;GASG;AACH,QAAA,MAAM,UAAU,EAAE,KAAK,CAAC,EAqqCvB,CAAA;eAEc,UAAU"}
@@ -1,5 +1,5 @@
1
1
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { beginSceneHistoryDraft, createSnapEaser, dormerWallFacePointToDormer, emitter, evaluateCorner, getEffectiveNode, holdHiddenWallPointerEvents, isCurvedWall, prefersReducedMotion, runAsSingleSceneHistoryStep, sceneRegistry, spatialGridManager, useLiveNodeOverrides, useScene, WallNode as WallNodeSchema, WindowNode, } from '@pascal-app/core';
2
+ import { beginSceneHistoryDraft, createSnapEaser, DEFAULT_WALL_THICKNESS, dormerWallFacePointToDormer, emitter, evaluateCorner, getEffectiveNode, getWallThickness, holdHiddenWallPointerEvents, isCurvedWall, isRailingWall, prefersReducedMotion, resolveOpeningFrameDepth, runAsSingleSceneHistoryStep, sceneRegistry, spatialGridManager, useLiveNodeOverrides, useScene, WallNode as WallNodeSchema, WindowNode, } from '@pascal-app/core';
3
3
  import { windowTakesStyle } from '@pascal-app/core/building';
4
4
  import { calculateItemRotation, clearPlacementSurface, EDITOR_LAYER, getSideFromNormal, isMagneticSnapActive, isTypingTarget, isValidWallSideFace, publishPlacementSurface, snapToHalf, triggerSFX, useAlignmentGuides, useEditor, useFacingPose, usePlacementPreview, useRegistryToolContext, } from '@pascal-app/editor';
5
5
  import { useEffect, useMemo, useRef, useState } from 'react';
@@ -64,10 +64,6 @@ const WindowTool = () => {
64
64
  rotation: [0, 0, 0],
65
65
  side: fallbackPose?.side ?? 'front',
66
66
  }), [fallbackPose?.side, placedType, placedStyle]);
67
- // The frame depth is a fixed parse default (the `side` flip doesn't change
68
- // it); a ref lets the facing-pose publish inside the setup effect read it
69
- // without re-subscribing every event listener.
70
- const frameDepthRef = useRef(ghostStub.frameDepth);
71
67
  useEffect(() => {
72
68
  useScene.temporal.getState().pause();
73
69
  // The draft is a created carry draft: undo history and every save leave it out
@@ -202,7 +198,7 @@ const WindowTool = () => {
202
198
  // On-host cursor: the green/red wireframe outline tracks a live draft.
203
199
  // Showing it always clears the off-host floating ghost (they never
204
200
  // coexist — a draft means the cursor is on a valid host).
205
- const updateCursor = (worldPosition, cursorRotationY, valid, indicatorYOffset) => {
201
+ const updateCursor = (worldPosition, cursorRotationY, valid, indicatorYOffset, hostThickness) => {
206
202
  setFallbackPose(null);
207
203
  const group = cursorGroupRef.current;
208
204
  if (!group)
@@ -217,7 +213,7 @@ const WindowTool = () => {
217
213
  useFacingPose.getState().set({
218
214
  position: [worldPosition[0], worldPosition[1] + indicatorYOffset, worldPosition[2]],
219
215
  rotationY: cursorRotationY,
220
- depth: frameDepthRef.current,
216
+ depth: resolveOpeningFrameDepth({ frameDepth: draftRef.current?.frameDepth }, hostThickness),
221
217
  });
222
218
  };
223
219
  // Off-host fallback: hide the wireframe outline and float the real window
@@ -305,7 +301,7 @@ const WindowTool = () => {
305
301
  clearOpeningGuides3D();
306
302
  const worldPosition = dormerWindowWorldPosition(event, target);
307
303
  publishPlacementSurface(new Vector3(...worldPosition), getDormerWindowWorldNormal(event, target));
308
- updateCursor(worldPosition, getDormerWindowWorldYaw(event, target), target.valid, 0);
304
+ updateCursor(worldPosition, getDormerWindowWorldYaw(event, target), target.valid, 0, DEFAULT_WALL_THICKNESS);
309
305
  };
310
306
  // Sill alignment (snap + guide): a sibling sill/centre/top wins over the
311
307
  // grid when within threshold — it's the magnetic ("lines") component for the
@@ -432,7 +428,7 @@ const WindowTool = () => {
432
428
  });
433
429
  }
434
430
  publishDraftPreview(wall);
435
- updateCursor(wallLocalToWorld(wall, shownX, clampedY, getLevelYOffset(), getSlabElevationForWall(wall)), cursorRotationY, valid, -clampedY);
431
+ updateCursor(wallLocalToWorld(wall, shownX, clampedY, getLevelYOffset(), getSlabElevationForWall(wall)), cursorRotationY, valid, -clampedY, getWallThickness(wall));
436
432
  if (draftRef.current) {
437
433
  publishOpeningGuidesForWallEvent({
438
434
  wall,
@@ -483,8 +479,10 @@ const WindowTool = () => {
483
479
  awningDirection: draft.awningDirection,
484
480
  casementStyle: draft.casementStyle,
485
481
  hingesSide: draft.hingesSide,
482
+ casingFaceA: draft.casingFaceA,
483
+ casingFaceB: draft.casingFaceB,
484
+ casingWidth: draft.casingWidth,
486
485
  frameThickness: draft.frameThickness,
487
- frameDepth: draft.frameDepth,
488
486
  columnRatios: draft.columnRatios,
489
487
  rowRatios: draft.rowRatios,
490
488
  columnDividerThickness: draft.columnDividerThickness,
@@ -548,8 +546,10 @@ const WindowTool = () => {
548
546
  openingCornerRadii: draft.openingCornerRadii,
549
547
  cornerRadius: draft.cornerRadius,
550
548
  archHeight: draft.archHeight,
549
+ casingFaceA: draft.casingFaceA,
550
+ casingFaceB: draft.casingFaceB,
551
+ casingWidth: draft.casingWidth,
551
552
  frameThickness: draft.frameThickness,
552
- frameDepth: draft.frameDepth,
553
553
  columnRatios: draft.columnRatios,
554
554
  rowRatios: draft.rowRatios,
555
555
  columnDividerThickness: draft.columnDividerThickness,
@@ -574,8 +574,10 @@ const WindowTool = () => {
574
574
  const onWallHover = (event) => {
575
575
  hostKind = 'wall';
576
576
  lastMeshEventTime = event.nativeEvent?.timeStamp ?? -1;
577
+ // A railing takes no window: its openings are gaps a door leaves in the guard.
577
578
  if (!isValidWallSideFace(event.normal) ||
578
579
  isCurvedWall(event.node) ||
580
+ isRailingWall(event.node) ||
579
581
  event.node.parentId !== getLevelId()) {
580
582
  destroyDraft();
581
583
  showWallFallbackCursor(event);
@@ -612,6 +614,7 @@ const WindowTool = () => {
612
614
  return;
613
615
  if (!isValidWallSideFace(event.normal) ||
614
616
  isCurvedWall(event.node) ||
617
+ isRailingWall(event.node) ||
615
618
  event.node.parentId !== getLevelId()) {
616
619
  return;
617
620
  }
@@ -776,7 +779,7 @@ const WindowTool = () => {
776
779
  const updateRoofCursor = (target, roof) => {
777
780
  const pose = getRoofWallOpeningCursorPose(target, roof);
778
781
  if (pose)
779
- updateCursor(pose.position, pose.rotationY, target.valid, -target.position[1]);
782
+ updateCursor(pose.position, pose.rotationY, target.valid, -target.position[1], DEFAULT_WALL_THICKNESS);
780
783
  };
781
784
  const onRoofHover = (event) => {
782
785
  hostKind = 'roof';
@@ -853,8 +856,10 @@ const WindowTool = () => {
853
856
  awningDirection: draft.awningDirection,
854
857
  casementStyle: draft.casementStyle,
855
858
  hingesSide: draft.hingesSide,
859
+ casingFaceA: draft.casingFaceA,
860
+ casingFaceB: draft.casingFaceB,
861
+ casingWidth: draft.casingWidth,
856
862
  frameThickness: draft.frameThickness,
857
- frameDepth: draft.frameDepth,
858
863
  columnRatios: draft.columnRatios,
859
864
  rowRatios: draft.rowRatios,
860
865
  columnDividerThickness: draft.columnDividerThickness,
@@ -1029,7 +1034,7 @@ const WindowTool = () => {
1029
1034
  // dispose on unmount rather than reallocating (and orphaning) an EdgesGeometry
1030
1035
  // on every re-render during placement.
1031
1036
  const edgesGeo = useMemo(() => {
1032
- const boxGeo = new BoxGeometry(FALLBACK_WIDTH, FALLBACK_HEIGHT, 0.07);
1037
+ const boxGeo = new BoxGeometry(FALLBACK_WIDTH, FALLBACK_HEIGHT, resolveOpeningFrameDepth({}, DEFAULT_WALL_THICKNESS));
1033
1038
  const geo = new EdgesGeometry(boxGeo);
1034
1039
  boxGeo.dispose();
1035
1040
  return geo;
@@ -104,6 +104,16 @@ export declare const zoneMoveVertexAffordance: import("@pascal-app/core").Floorp
104
104
  color: string;
105
105
  intensity: number;
106
106
  distance?: number | undefined;
107
+ spot?: {
108
+ direction: [number, number, number];
109
+ angle: number;
110
+ softness: number;
111
+ } | undefined;
112
+ shadows?: boolean | undefined;
113
+ glow?: {
114
+ size: number;
115
+ strength: number;
116
+ } | undefined;
107
117
  }[];
108
118
  undersides: {
109
119
  part?: string | undefined;
@@ -122,6 +132,17 @@ export declare const zoneMoveVertexAffordance: import("@pascal-app/core").Floorp
122
132
  }[] | undefined;
123
133
  cutout: boolean;
124
134
  collider: boolean;
135
+ shape?: {
136
+ tolerance: number;
137
+ bands: {
138
+ y0: number;
139
+ y1: number;
140
+ polygons: {
141
+ outer: [number, number][];
142
+ holes?: [number, number][][] | undefined;
143
+ }[];
144
+ }[];
145
+ } | undefined;
125
146
  triangles: number;
126
147
  coverage?: number | undefined;
127
148
  uncovered?: {
@@ -136,6 +157,19 @@ export declare const zoneMoveVertexAffordance: import("@pascal-app/core").Floorp
136
157
  } | undefined;
137
158
  inputs: string;
138
159
  } | undefined;
160
+ drop?: number | undefined;
161
+ } | undefined;
162
+ roomType?: "deck" | "patio" | "porch" | undefined;
163
+ porchFraming?: {
164
+ auto?: boolean | undefined;
165
+ postSize?: string | undefined;
166
+ postSpacing?: number | undefined;
167
+ beamSize?: string | undefined;
168
+ } | undefined;
169
+ decking?: {
170
+ boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
171
+ gap?: number | undefined;
172
+ direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
139
173
  } | undefined;
140
174
  ceiling?: {
141
175
  regions?: {
@@ -277,6 +311,16 @@ export declare const zoneAddVertexAffordance: import("@pascal-app/core").Floorpl
277
311
  color: string;
278
312
  intensity: number;
279
313
  distance?: number | undefined;
314
+ spot?: {
315
+ direction: [number, number, number];
316
+ angle: number;
317
+ softness: number;
318
+ } | undefined;
319
+ shadows?: boolean | undefined;
320
+ glow?: {
321
+ size: number;
322
+ strength: number;
323
+ } | undefined;
280
324
  }[];
281
325
  undersides: {
282
326
  part?: string | undefined;
@@ -295,6 +339,17 @@ export declare const zoneAddVertexAffordance: import("@pascal-app/core").Floorpl
295
339
  }[] | undefined;
296
340
  cutout: boolean;
297
341
  collider: boolean;
342
+ shape?: {
343
+ tolerance: number;
344
+ bands: {
345
+ y0: number;
346
+ y1: number;
347
+ polygons: {
348
+ outer: [number, number][];
349
+ holes?: [number, number][][] | undefined;
350
+ }[];
351
+ }[];
352
+ } | undefined;
298
353
  triangles: number;
299
354
  coverage?: number | undefined;
300
355
  uncovered?: {
@@ -309,6 +364,19 @@ export declare const zoneAddVertexAffordance: import("@pascal-app/core").Floorpl
309
364
  } | undefined;
310
365
  inputs: string;
311
366
  } | undefined;
367
+ drop?: number | undefined;
368
+ } | undefined;
369
+ roomType?: "deck" | "patio" | "porch" | undefined;
370
+ porchFraming?: {
371
+ auto?: boolean | undefined;
372
+ postSize?: string | undefined;
373
+ postSpacing?: number | undefined;
374
+ beamSize?: string | undefined;
375
+ } | undefined;
376
+ decking?: {
377
+ boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
378
+ gap?: number | undefined;
379
+ direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
312
380
  } | undefined;
313
381
  ceiling?: {
314
382
  regions?: {
@@ -450,6 +518,16 @@ export declare const zoneMoveEdgeAffordance: import("@pascal-app/core").Floorpla
450
518
  color: string;
451
519
  intensity: number;
452
520
  distance?: number | undefined;
521
+ spot?: {
522
+ direction: [number, number, number];
523
+ angle: number;
524
+ softness: number;
525
+ } | undefined;
526
+ shadows?: boolean | undefined;
527
+ glow?: {
528
+ size: number;
529
+ strength: number;
530
+ } | undefined;
453
531
  }[];
454
532
  undersides: {
455
533
  part?: string | undefined;
@@ -468,6 +546,17 @@ export declare const zoneMoveEdgeAffordance: import("@pascal-app/core").Floorpla
468
546
  }[] | undefined;
469
547
  cutout: boolean;
470
548
  collider: boolean;
549
+ shape?: {
550
+ tolerance: number;
551
+ bands: {
552
+ y0: number;
553
+ y1: number;
554
+ polygons: {
555
+ outer: [number, number][];
556
+ holes?: [number, number][][] | undefined;
557
+ }[];
558
+ }[];
559
+ } | undefined;
471
560
  triangles: number;
472
561
  coverage?: number | undefined;
473
562
  uncovered?: {
@@ -482,6 +571,19 @@ export declare const zoneMoveEdgeAffordance: import("@pascal-app/core").Floorpla
482
571
  } | undefined;
483
572
  inputs: string;
484
573
  } | undefined;
574
+ drop?: number | undefined;
575
+ } | undefined;
576
+ roomType?: "deck" | "patio" | "porch" | undefined;
577
+ porchFraming?: {
578
+ auto?: boolean | undefined;
579
+ postSize?: string | undefined;
580
+ postSpacing?: number | undefined;
581
+ beamSize?: string | undefined;
582
+ } | undefined;
583
+ decking?: {
584
+ boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
585
+ gap?: number | undefined;
586
+ direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
485
587
  } | undefined;
486
588
  ceiling?: {
487
589
  regions?: {
@@ -623,6 +725,16 @@ export declare const zoneDeleteVertexAffordance: import("@pascal-app/core").Floo
623
725
  color: string;
624
726
  intensity: number;
625
727
  distance?: number | undefined;
728
+ spot?: {
729
+ direction: [number, number, number];
730
+ angle: number;
731
+ softness: number;
732
+ } | undefined;
733
+ shadows?: boolean | undefined;
734
+ glow?: {
735
+ size: number;
736
+ strength: number;
737
+ } | undefined;
626
738
  }[];
627
739
  undersides: {
628
740
  part?: string | undefined;
@@ -641,6 +753,17 @@ export declare const zoneDeleteVertexAffordance: import("@pascal-app/core").Floo
641
753
  }[] | undefined;
642
754
  cutout: boolean;
643
755
  collider: boolean;
756
+ shape?: {
757
+ tolerance: number;
758
+ bands: {
759
+ y0: number;
760
+ y1: number;
761
+ polygons: {
762
+ outer: [number, number][];
763
+ holes?: [number, number][][] | undefined;
764
+ }[];
765
+ }[];
766
+ } | undefined;
644
767
  triangles: number;
645
768
  coverage?: number | undefined;
646
769
  uncovered?: {
@@ -655,6 +778,19 @@ export declare const zoneDeleteVertexAffordance: import("@pascal-app/core").Floo
655
778
  } | undefined;
656
779
  inputs: string;
657
780
  } | undefined;
781
+ drop?: number | undefined;
782
+ } | undefined;
783
+ roomType?: "deck" | "patio" | "porch" | undefined;
784
+ porchFraming?: {
785
+ auto?: boolean | undefined;
786
+ postSize?: string | undefined;
787
+ postSpacing?: number | undefined;
788
+ beamSize?: string | undefined;
789
+ } | undefined;
790
+ decking?: {
791
+ boardSize?: "2x4" | "2x6" | "5/4x6" | "composite" | undefined;
792
+ gap?: number | undefined;
793
+ direction?: "diagonal" | "parallel" | "perpendicular" | undefined;
658
794
  } | undefined;
659
795
  ceiling?: {
660
796
  regions?: {
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/zone/floorplan-affordances.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGpC,CAAA;AACD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGnC,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlC,CAAA;AACD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGtC,CAAA"}
1
+ {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/zone/floorplan-affordances.ts"],"names":[],"mappings":"AAuBA,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGpC,CAAA;AACD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGnC,CAAA;AACD,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlC,CAAA;AACD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGtC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"quantities-panel.d.ts","sourceRoot":"","sources":["../../src/zone/quantities-panel.tsx"],"names":[],"mappings":"AAqMA,MAAM,CAAC,OAAO,UAAU,mBAAmB,uCAkF1C"}
1
+ {"version":3,"file":"quantities-panel.d.ts","sourceRoot":"","sources":["../../src/zone/quantities-panel.tsx"],"names":[],"mappings":"AAqNA,MAAM,CAAC,OAAO,UAAU,mBAAmB,uCAiG1C"}
@@ -1,15 +1,19 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { deriveZoneQuantityReport, useLiveNodeOverrides, useScene, } from '@pascal-app/core';
4
- import { formatAreaLabel, formatLinearMeasurement, formatVolumeLabel, PanelSection, } from '@pascal-app/editor';
3
+ import { deriveZoneQuantityReport, useLiveNodeOverrides, usePascalI18n, useScene, } from '@pascal-app/core';
4
+ import { displayRoomName, formatAreaLabel, formatLinearMeasurement, formatVolumeLabel, PanelSection, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { useMemo } from 'react';
7
7
  import { useShallow } from 'zustand/react/shallow';
8
8
  import { PanelSelect } from '../shared/panel-fields.js';
9
9
  import { buildingUnitsForZone } from './unit-membership.js';
10
10
  function ZonePlanSketch({ edgeLengths, metricNotation, polygon, unit, }) {
11
+ const i18n = usePascalI18n();
11
12
  if (polygon.length < 3) {
12
- return (_jsx("div", { className: "flex h-28 items-center justify-center rounded-md border border-border/50 text-muted-foreground text-xs", children: "Zone boundary unavailable" }));
13
+ return (_jsx("div", { className: "flex h-28 items-center justify-center rounded-md border border-border/50 text-muted-foreground text-xs", children: i18n._({
14
+ id: 'node.zone.quantitiesPanel.zoneBoundaryUnavailable',
15
+ message: 'Zone boundary unavailable',
16
+ }) }));
13
17
  }
14
18
  const viewWidth = 276;
15
19
  const viewHeight = 176;
@@ -27,7 +31,10 @@ function ZonePlanSketch({ edgeLengths, metricNotation, polygon, unit, }) {
27
31
  const offsetY = (viewHeight - height * scale) / 2;
28
32
  const projected = polygon.map(([x, y]) => [offsetX + (x - minX) * scale, offsetY + (maxY - y) * scale]);
29
33
  const center = projected.reduce((sum, point) => [sum[0] + point[0] / projected.length, sum[1] + point[1] / projected.length], [0, 0]);
30
- return (_jsxs("svg", { "aria-label": "Top view with zone edge dimensions", className: "h-auto w-full rounded-md border border-cyan-950/20 bg-[#f8faf7]", role: "img", viewBox: `0 0 ${viewWidth} ${viewHeight}`, children: [_jsx("defs", { children: _jsx("pattern", { height: "12", id: "zone-quantity-grid", patternUnits: "userSpaceOnUse", width: "12", children: _jsx("path", { d: "M 12 0 L 0 0 0 12", fill: "none", stroke: "#0891b2", strokeOpacity: "0.08" }) }) }), _jsx("rect", { fill: "url(#zone-quantity-grid)", height: viewHeight, width: viewWidth }), _jsx("polygon", { fill: "#67e8f9", fillOpacity: "0.12", points: projected.map((point) => point.join(',')).join(' '), stroke: "#0e7490", strokeLinejoin: "round", strokeWidth: "1.5" }), projected.map((start, index) => {
34
+ return (_jsxs("svg", { "aria-label": i18n._({
35
+ id: 'node.zone.quantitiesPanel.topViewWithZoneEdgeDimensions',
36
+ message: 'Top view with zone edge dimensions',
37
+ }), className: "h-auto w-full rounded-md border border-cyan-950/20 bg-[#f8faf7]", role: "img", viewBox: `0 0 ${viewWidth} ${viewHeight}`, children: [_jsx("defs", { children: _jsx("pattern", { height: "12", id: "zone-quantity-grid", patternUnits: "userSpaceOnUse", width: "12", children: _jsx("path", { d: "M 12 0 L 0 0 0 12", fill: "none", stroke: "#0891b2", strokeOpacity: "0.08" }) }) }), _jsx("rect", { fill: "url(#zone-quantity-grid)", height: viewHeight, width: viewWidth }), _jsx("polygon", { fill: "#67e8f9", fillOpacity: "0.12", points: projected.map((point) => point.join(',')).join(' '), stroke: "#0e7490", strokeLinejoin: "round", strokeWidth: "1.5" }), projected.map((start, index) => {
31
38
  const end = projected[(index + 1) % projected.length];
32
39
  if (!end)
33
40
  return null;
@@ -44,9 +51,13 @@ function ZonePlanSketch({ edgeLengths, metricNotation, polygon, unit, }) {
44
51
  })] }));
45
52
  }
46
53
  function QuantityRow({ abbreviation, format, label, quantity, }) {
47
- return (_jsxs("div", { className: "rounded-md border border-border/50 bg-background/35 px-2.5 py-2", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "font-mono font-semibold text-cyan-600 text-[10px]", children: abbreviation }), _jsx("span", { className: "text-muted-foreground text-xs", children: label }), _jsx("span", { className: "ml-auto font-mono font-medium text-foreground text-xs tabular-nums", children: quantity.status === 'available' ? format(quantity.value) : 'Not proven' })] }), _jsx("div", { className: "mt-1 text-[10px] text-muted-foreground leading-snug", children: quantity.status === 'available' ? quantity.note : quantity.reason })] }));
54
+ const i18n = usePascalI18n();
55
+ return (_jsxs("div", { className: "rounded-md border border-border/50 bg-background/35 px-2.5 py-2", children: [_jsxs("div", { className: "flex items-baseline gap-2", children: [_jsx("span", { className: "font-mono font-semibold text-cyan-600 text-[10px]", children: abbreviation }), _jsx("span", { className: "text-muted-foreground text-xs", children: label }), _jsx("span", { className: "ml-auto font-mono font-medium text-foreground text-xs tabular-nums", children: quantity.status === 'available'
56
+ ? format(quantity.value)
57
+ : i18n._({ id: 'node.zone.quantitiesPanel.notProven', message: 'Not proven' }) })] }), _jsx("div", { className: "mt-1 text-[10px] text-muted-foreground leading-snug", children: quantity.status === 'available' ? quantity.note : quantity.reason })] }));
48
58
  }
49
59
  function ZoneUnitPanel({ zone }) {
60
+ const i18n = usePascalI18n();
50
61
  const units = useScene(useShallow((state) => buildingUnitsForZone(zone, (id) => state.nodes[id])));
51
62
  if (units.length === 0)
52
63
  return null;
@@ -71,12 +82,16 @@ function ZoneUnitPanel({ zone }) {
71
82
  if (updates.length > 0)
72
83
  updateNodes(updates);
73
84
  };
74
- return (_jsx(PanelSection, { title: "Unit", children: _jsx(PanelSelect, { label: "Unit", onChange: handleChange, options: [
75
- { label: 'None', value: '' },
76
- ...units.map((unit) => ({ label: unit.name || 'Unit', value: unit.id })),
85
+ return (_jsx(PanelSection, { title: i18n._({ id: 'node.zone.quantitiesPanel.unit', message: 'Unit' }), children: _jsx(PanelSelect, { label: i18n._({ id: 'node.zone.quantitiesPanel.unit', message: 'Unit' }), onChange: handleChange, options: [
86
+ { label: i18n._({ id: 'node.zone.quantitiesPanel.none', message: 'None' }), value: '' },
87
+ ...units.map((unit) => ({
88
+ label: unit.name || i18n._({ id: 'node.zone.quantitiesPanel.unit', message: 'Unit' }),
89
+ value: unit.id,
90
+ })),
77
91
  ], value: current?.id ?? '' }) }));
78
92
  }
79
93
  export default function ZoneQuantitiesPanel() {
94
+ const i18n = usePascalI18n();
80
95
  const selectedZoneId = useViewer((state) => state.selection.zoneId);
81
96
  const unit = useViewer((state) => state.unit);
82
97
  const metricNotation = useViewer((state) => state.metricNotation);
@@ -101,5 +116,15 @@ export default function ZoneQuantitiesPanel() {
101
116
  const report = useMemo(() => (effectiveZone ? deriveZoneQuantityReport(effectiveZone, effectiveNodes) : null), [effectiveNodes, effectiveZone]);
102
117
  if (!effectiveZone || !report)
103
118
  return null;
104
- return (_jsxs(_Fragment, { children: [_jsx(ZoneUnitPanel, { zone: effectiveZone }), _jsxs(PanelSection, { title: effectiveZone.spaceRole === 'room' ? 'Room quantities' : 'Zone quantities', children: [_jsxs("div", { className: "overflow-hidden rounded-md border border-cyan-950/20 bg-[#f8faf7] text-slate-950", children: [_jsxs("div", { className: "flex items-center border-cyan-950/15 border-b px-2.5 py-2", children: [_jsx("span", { className: "font-semibold text-[11px]", children: effectiveZone.name }), _jsx("span", { className: "ml-auto rounded-full border border-cyan-800/25 bg-cyan-50 px-2 py-0.5 text-cyan-900 text-[9px]", children: report.classification === 'enclosed-room' ? 'Enclosed room' : 'Footprint only' })] }), _jsxs("div", { className: "flex items-baseline gap-2 px-2.5 py-2 font-mono text-[10px]", children: [_jsx("span", { className: "text-cyan-800", children: "A" }), _jsx("span", { children: formatAreaLabel(report.footprintArea, unit, 2) }), _jsx("span", { className: "ml-auto text-slate-600", children: "P" }), _jsx("span", { children: formatLinearMeasurement(report.perimeter, unit, metricNotation) })] })] }), _jsx(ZonePlanSketch, { edgeLengths: report.edgeLengths, metricNotation: metricNotation, polygon: effectiveZone.polygon, unit: unit }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(QuantityRow, { abbreviation: "Aw", format: (value) => formatAreaLabel(value, unit, 2), label: "Wall surface", quantity: report.wallSurface }), _jsx(QuantityRow, { abbreviation: "Af", format: (value) => formatAreaLabel(value, unit, 2), label: "Floor surface", quantity: report.floorSurface }), _jsx(QuantityRow, { abbreviation: "V", format: (value) => formatVolumeLabel(value, unit, 2), label: "Volume", quantity: report.volume })] })] })] }));
119
+ return (_jsxs(_Fragment, { children: [_jsx(ZoneUnitPanel, { zone: effectiveZone }), _jsxs(PanelSection, { title: effectiveZone.spaceRole === 'room'
120
+ ? i18n._({ id: 'node.zone.quantitiesPanel.roomQuantities', message: 'Room quantities' })
121
+ : i18n._({ id: 'node.zone.quantitiesPanel.zoneQuantities', message: 'Zone quantities' }), children: [_jsxs("div", { className: "overflow-hidden rounded-md border border-cyan-950/20 bg-[#f8faf7] text-slate-950", children: [_jsxs("div", { className: "flex items-center border-cyan-950/15 border-b px-2.5 py-2", children: [_jsx("span", { className: "font-semibold text-[11px]", children: displayRoomName(effectiveZone.name ?? '', i18n) }), _jsx("span", { className: "ml-auto rounded-full border border-cyan-800/25 bg-cyan-50 px-2 py-0.5 text-cyan-900 text-[9px]", children: report.classification === 'enclosed-room'
122
+ ? i18n._({ id: 'node.zone.quantitiesPanel.enclosedRoom', message: 'Enclosed room' })
123
+ : i18n._({
124
+ id: 'node.zone.quantitiesPanel.footprintOnly',
125
+ message: 'Footprint only',
126
+ }) })] }), _jsxs("div", { className: "flex items-baseline gap-2 px-2.5 py-2 font-mono text-[10px]", children: [_jsx("span", { className: "text-cyan-800", children: "A" }), _jsx("span", { children: formatAreaLabel(report.footprintArea, unit, 2) }), _jsx("span", { className: "ml-auto text-slate-600", children: "P" }), _jsx("span", { children: formatLinearMeasurement(report.perimeter, unit, metricNotation) })] })] }), _jsx(ZonePlanSketch, { edgeLengths: report.edgeLengths, metricNotation: metricNotation, polygon: effectiveZone.polygon, unit: unit }), _jsxs("div", { className: "flex flex-col gap-1.5", children: [_jsx(QuantityRow, { abbreviation: "Aw", format: (value) => formatAreaLabel(value, unit, 2), label: i18n._({ id: 'node.zone.quantitiesPanel.wallSurface', message: 'Wall surface' }), quantity: report.wallSurface }), _jsx(QuantityRow, { abbreviation: "Af", format: (value) => formatAreaLabel(value, unit, 2), label: i18n._({
127
+ id: 'node.zone.quantitiesPanel.floorSurface',
128
+ message: 'Floor surface',
129
+ }), quantity: report.floorSurface }), _jsx(QuantityRow, { abbreviation: "V", format: (value) => formatVolumeLabel(value, unit, 2), label: i18n._({ id: 'node.zone.quantitiesPanel.volume', message: 'Volume' }), quantity: report.volume })] })] })] }));
105
130
  }
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/zone/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AA8DzB,eAAO,MAAM,YAAY,aAAc;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAWxD,CAAA;eAwJc,YAAY"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/zone/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,QAAQ,EACd,MAAM,kBAAkB,CAAA;AA8DzB,eAAO,MAAM,YAAY,aAAc;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,gCAWxD,CAAA;eA0Jc,YAAY"}
@@ -1,6 +1,6 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { polygonInteriorPoint, useLiveNodeOverrides, useRegistry, useScene, } from '@pascal-app/core';
3
+ import { FLOOR_SCRIPT_LIFT, floorScriptSurface, polygonInteriorPoint, useLiveNodeOverrides, useRegistry, useScene, } from '@pascal-app/core';
4
4
  import { createZoneShape, createZoneWallGeometry, useNodeEvents, useViewer, ZONE_LAYER, } from '@pascal-app/viewer';
5
5
  import { Html } from '@react-three/drei';
6
6
  import { useEffect, useMemo, useRef } from 'react';
@@ -56,11 +56,15 @@ export const ZoneRenderer = ({ node }) => {
56
56
  const script = node.floor?.script;
57
57
  return (_jsxs("group", { ref: ref, visible: node.visible !== false, children: [showZones ? _jsx(ZoneVisuals, { node: node }) : null, script ? _jsx(FloorScriptModel, { node: node, script: script }) : null] }));
58
58
  };
59
- /** Over the floor plate's top, so the plate's own finish never shows through the boards. */
60
- const FLOOR_SCRIPT_LIFT = 0.001;
61
- /** The room's floor finish its script built, in the level's frame, just over the plate. */
59
+ /**
60
+ * The room's floor finish its script built: in the level's plan, its y = 0 on the floor plate's
61
+ * top. A room with no plate has no floor for it to stand on.
62
+ */
62
63
  function FloorScriptModel({ node, script }) {
63
- return (_jsx("group", { "position-y": FLOOR_SCRIPT_LIFT, children: _jsx(FinishScriptModel, { ownerId: node.id, parentId: node.parentId, script: script }) }));
64
+ const surface = useScene((state) => floorScriptSurface(state.nodes, node.id));
65
+ if (surface === null)
66
+ return null;
67
+ return (_jsx("group", { "position-y": surface + FLOOR_SCRIPT_LIFT, children: _jsx(FinishScriptModel, { ownerId: node.id, parentId: node.parentId, script: script }) }));
64
68
  }
65
69
  function ZoneVisuals({ node }) {
66
70
  // Group-transform drags publish a translated/rotated polygon to
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pascal-app/nodes",
3
- "version": "1.0.6",
3
+ "version": "1.0.7",
4
4
  "description": "Built-in node bundles for the Pascal 3D editor — one folder per kind, exported as `builtinPlugin`",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,31 +38,31 @@
38
38
  "prepublishOnly": "bun run build && bun test"
39
39
  },
40
40
  "peerDependencies": {
41
- "@pascal-app/core": "^1.0.6",
42
- "@pascal-app/editor": "^1.0.6",
43
- "@pascal-app/viewer": "^1.0.6",
41
+ "@pascal-app/core": "^1.0.7",
42
+ "@pascal-app/editor": "^1.0.7",
43
+ "@pascal-app/viewer": "^1.0.7",
44
44
  "@react-three/drei": "^10",
45
45
  "@react-three/fiber": "^9",
46
46
  "lucide-react": "^1",
47
47
  "react": "^18 || ^19",
48
48
  "react-dom": "^18 || ^19",
49
- "three": "^0.186",
49
+ "three": "^0.187",
50
50
  "zustand": "^5"
51
51
  },
52
52
  "devDependencies": {
53
- "@modelcontextprotocol/client": "^2.3.1",
54
- "@modelcontextprotocol/server": "^2.3.1",
55
- "@pascal-app/core": "^1.0.6",
56
- "@pascal-app/editor": "^1.0.6",
57
- "@pascal-app/mcp": "^1.0.6",
58
- "@pascal-app/viewer": "^1.0.6",
53
+ "@modelcontextprotocol/client": "^2.4.0",
54
+ "@modelcontextprotocol/server": "^2.4.0",
55
+ "@pascal-app/core": "^1.0.7",
56
+ "@pascal-app/editor": "^1.0.7",
57
+ "@pascal-app/mcp": "^1.0.7",
58
+ "@pascal-app/viewer": "^1.0.7",
59
59
  "@pascal/typescript-config": "*",
60
60
  "@react-three/test-renderer": "^9.1.1",
61
- "@types/bun": "^1.4.3",
62
- "@types/node": "^26.6.5",
61
+ "@types/bun": "^1.4.4",
62
+ "@types/node": "^26.6.6",
63
63
  "@types/react": "19.3.0",
64
64
  "@types/react-dom": "19.3.0",
65
- "@types/three": "^0.186.0",
65
+ "@types/three": "^0.187",
66
66
  "typescript": "7.0.2"
67
67
  },
68
68
  "keywords": [
@@ -1,16 +0,0 @@
1
- import type { FoundationMember } from '@pascal-app/core';
2
- /** The foundation members of one kind as one indexed mesh, in world coordinates. */
3
- export type FoundationMesh = {
4
- positions: Float32Array;
5
- normals: Float32Array;
6
- /** Metres along the run, for the courses of block to bond along the wall. */
7
- along: Float32Array;
8
- indices: Uint32Array;
9
- };
10
- /**
11
- * The runs of `kind` as closed boxes, six faces each with its own flat normal. A run is a prism on
12
- * the plan line `from` to `to`, `width` across, from `bottomY` to `topY`. Corners are closed by the
13
- * runs themselves (they overlap), so the boxes carry no joins.
14
- */
15
- export declare function buildFoundationMesh(members: readonly FoundationMember[], kind: FoundationMember['kind']): FoundationMesh | null;
16
- //# sourceMappingURL=generic-foundation-geometry.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generic-foundation-geometry.d.ts","sourceRoot":"","sources":["../../src/site/generic-foundation-geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAExD,oFAAoF;AACpF,MAAM,MAAM,cAAc,GAAG;IAC3B,SAAS,EAAE,YAAY,CAAA;IACvB,OAAO,EAAE,YAAY,CAAA;IACrB,6EAA6E;IAC7E,KAAK,EAAE,YAAY,CAAA;IACnB,OAAO,EAAE,WAAW,CAAA;CACrB,CAAA;AAYD;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,SAAS,gBAAgB,EAAE,EACpC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAC7B,cAAc,GAAG,IAAI,CA6DvB"}
@@ -1,75 +0,0 @@
1
- const sub = (a, b) => [a[0] - b[0], a[1] - b[1], a[2] - b[2]];
2
- const cross = (a, b) => [
3
- a[1] * b[2] - a[2] * b[1],
4
- a[2] * b[0] - a[0] * b[2],
5
- a[0] * b[1] - a[1] * b[0],
6
- ];
7
- const dot = (a, b) => a[0] * b[0] + a[1] * b[1] + a[2] * b[2];
8
- /**
9
- * The runs of `kind` as closed boxes, six faces each with its own flat normal. A run is a prism on
10
- * the plan line `from` to `to`, `width` across, from `bottomY` to `topY`. Corners are closed by the
11
- * runs themselves (they overlap), so the boxes carry no joins.
12
- */
13
- export function buildFoundationMesh(members, kind) {
14
- const runs = members.filter((member) => member.kind === kind);
15
- if (runs.length === 0)
16
- return null;
17
- const positions = [];
18
- const normals = [];
19
- const along = [];
20
- const indices = [];
21
- const quad = (corners, outward, alongAt) => {
22
- const [a, b, c] = corners;
23
- const facing = dot(cross(sub(b, a), sub(c, a)), outward) >= 0;
24
- const order = facing ? [0, 1, 2, 3] : [0, 3, 2, 1];
25
- const base = positions.length / 3;
26
- for (const index of order) {
27
- positions.push(...corners[index]);
28
- normals.push(...outward);
29
- along.push(alongAt[index]);
30
- }
31
- indices.push(base, base + 1, base + 2, base, base + 2, base + 3);
32
- };
33
- for (const { from, to, width, bottomY, topY } of runs) {
34
- const dx = to[0] - from[0];
35
- const dz = to[1] - from[1];
36
- const length = Math.hypot(dx, dz);
37
- if (length < 1e-9 || topY - bottomY < 1e-9)
38
- continue;
39
- const [ux, uz] = [dx / length, dz / length];
40
- const [nx, nz] = [-uz, ux];
41
- const half = width / 2;
42
- const at = (end, side, y) => [
43
- end[0] + nx * half * side,
44
- y,
45
- end[1] + nz * half * side,
46
- ];
47
- const [a0, a1, a2, a3] = [
48
- at(from, 1, bottomY),
49
- at(to, 1, bottomY),
50
- at(to, -1, bottomY),
51
- at(from, -1, bottomY),
52
- ];
53
- const [b0, b1, b2, b3] = [
54
- at(from, 1, topY),
55
- at(to, 1, topY),
56
- at(to, -1, topY),
57
- at(from, -1, topY),
58
- ];
59
- const run = [0, length, length, 0];
60
- quad([b0, b1, b2, b3], [0, 1, 0], run);
61
- quad([a0, a1, a2, a3], [0, -1, 0], run);
62
- quad([a0, a1, b1, b0], [nx, 0, nz], [0, length, length, 0]);
63
- quad([a3, a2, b2, b3], [-nx, 0, -nz], [0, length, length, 0]);
64
- quad([a0, a3, b3, b0], [-ux, 0, -uz], [0, 0, 0, 0]);
65
- quad([a1, a2, b2, b1], [ux, 0, uz], [length, length, length, length]);
66
- }
67
- if (indices.length === 0)
68
- return null;
69
- return {
70
- positions: new Float32Array(positions),
71
- normals: new Float32Array(normals),
72
- along: new Float32Array(along),
73
- indices: new Uint32Array(indices),
74
- };
75
- }
@@ -1,4 +0,0 @@
1
- import { type FoundationMember } from '@pascal-app/core';
2
- export declare function sameFoundation(a: readonly FoundationMember[], b: readonly FoundationMember[]): boolean;
3
- export declare function GenericFoundation(): import("react").JSX.Element;
4
- //# sourceMappingURL=generic-foundation.d.ts.map