@pascal-app/nodes 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (566) hide show
  1. package/README.md +1 -0
  2. package/dist/beam/actions/move-endpoint.d.ts +24 -0
  3. package/dist/beam/actions/move-endpoint.d.ts.map +1 -0
  4. package/dist/beam/actions/move-endpoint.js +54 -0
  5. package/dist/beam/definition.d.ts +14 -0
  6. package/dist/beam/definition.d.ts.map +1 -0
  7. package/dist/beam/definition.js +173 -0
  8. package/dist/beam/draft-settings.d.ts +17 -0
  9. package/dist/beam/draft-settings.d.ts.map +1 -0
  10. package/dist/beam/draft-settings.js +81 -0
  11. package/dist/beam/drafting.d.ts +35 -0
  12. package/dist/beam/drafting.d.ts.map +1 -0
  13. package/dist/beam/drafting.js +103 -0
  14. package/dist/beam/floorplan-affordances.d.ts +8 -0
  15. package/dist/beam/floorplan-affordances.d.ts.map +1 -0
  16. package/dist/beam/floorplan-affordances.js +40 -0
  17. package/dist/beam/floorplan-move.d.ts +11 -0
  18. package/dist/beam/floorplan-move.d.ts.map +1 -0
  19. package/dist/beam/floorplan-move.js +54 -0
  20. package/dist/beam/floorplan.d.ts +11 -0
  21. package/dist/beam/floorplan.d.ts.map +1 -0
  22. package/dist/beam/floorplan.js +91 -0
  23. package/dist/beam/geometry.d.ts +19 -0
  24. package/dist/beam/geometry.d.ts.map +1 -0
  25. package/dist/beam/geometry.js +63 -0
  26. package/dist/beam/index.d.ts +3 -0
  27. package/dist/beam/index.d.ts.map +1 -0
  28. package/dist/beam/index.js +2 -0
  29. package/dist/beam/move-endpoint-tool.d.ts +21 -0
  30. package/dist/beam/move-endpoint-tool.d.ts.map +1 -0
  31. package/dist/beam/move-endpoint-tool.js +49 -0
  32. package/dist/beam/move-tool.d.ts +12 -0
  33. package/dist/beam/move-tool.d.ts.map +1 -0
  34. package/dist/beam/move-tool.js +114 -0
  35. package/dist/beam/panel-model.d.ts +28 -0
  36. package/dist/beam/panel-model.d.ts.map +1 -0
  37. package/dist/beam/panel-model.js +123 -0
  38. package/dist/beam/panel.d.ts +13 -0
  39. package/dist/beam/panel.d.ts.map +1 -0
  40. package/dist/beam/panel.js +107 -0
  41. package/dist/beam/parametrics.d.ts +3 -0
  42. package/dist/beam/parametrics.d.ts.map +1 -0
  43. package/dist/beam/parametrics.js +4 -0
  44. package/dist/beam/renderer.d.ts +13 -0
  45. package/dist/beam/renderer.d.ts.map +1 -0
  46. package/dist/beam/renderer.js +36 -0
  47. package/dist/beam/schema.d.ts +2 -0
  48. package/dist/beam/schema.d.ts.map +1 -0
  49. package/dist/beam/schema.js +1 -0
  50. package/dist/beam/tool.d.ts +13 -0
  51. package/dist/beam/tool.d.ts.map +1 -0
  52. package/dist/beam/tool.js +152 -0
  53. package/dist/box-vent/panel.d.ts.map +1 -1
  54. package/dist/box-vent/panel.js +8 -7
  55. package/dist/cabinet/batchable.d.ts +10 -0
  56. package/dist/cabinet/batchable.d.ts.map +1 -0
  57. package/dist/cabinet/batchable.js +12 -0
  58. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  59. package/dist/cabinet/compartment-card.js +142 -46
  60. package/dist/cabinet/countertop-layout.d.ts +5 -0
  61. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  62. package/dist/cabinet/definition.d.ts.map +1 -1
  63. package/dist/cabinet/definition.js +3 -0
  64. package/dist/cabinet/dimension-input.d.ts +6 -0
  65. package/dist/cabinet/dimension-input.d.ts.map +1 -0
  66. package/dist/cabinet/dimension-input.js +8 -0
  67. package/dist/cabinet/essential-controls.d.ts.map +1 -1
  68. package/dist/cabinet/essential-controls.js +82 -17
  69. package/dist/cabinet/index.d.ts +1 -1
  70. package/dist/cabinet/index.d.ts.map +1 -1
  71. package/dist/cabinet/index.js +1 -1
  72. package/dist/cabinet/kitchen-catalog.d.ts +17 -4
  73. package/dist/cabinet/kitchen-catalog.d.ts.map +1 -1
  74. package/dist/cabinet/kitchen-catalog.js +45 -7
  75. package/dist/cabinet/kitchen-collection.d.ts.map +1 -1
  76. package/dist/cabinet/kitchen-collection.js +21 -5
  77. package/dist/cabinet/kitchen-module-actions.d.ts.map +1 -1
  78. package/dist/cabinet/kitchen-module-actions.js +107 -14
  79. package/dist/cabinet/neighbor-placement.d.ts +10 -0
  80. package/dist/cabinet/neighbor-placement.d.ts.map +1 -1
  81. package/dist/cabinet/panel.d.ts.map +1 -1
  82. package/dist/cabinet/panel.js +127 -50
  83. package/dist/cabinet/run-finishing.d.ts +5 -0
  84. package/dist/cabinet/run-finishing.d.ts.map +1 -1
  85. package/dist/cabinet/run-ops.d.ts +5 -0
  86. package/dist/cabinet/run-ops.d.ts.map +1 -1
  87. package/dist/cabinet/run-panel.d.ts.map +1 -1
  88. package/dist/cabinet/run-panel.js +203 -52
  89. package/dist/cabinet/tool.d.ts.map +1 -1
  90. package/dist/cabinet/tool.js +8 -5
  91. package/dist/ceiling/build-up-section.d.ts +7 -0
  92. package/dist/ceiling/build-up-section.d.ts.map +1 -0
  93. package/dist/ceiling/build-up-section.js +57 -0
  94. package/dist/ceiling/definition.d.ts.map +1 -1
  95. package/dist/ceiling/definition.js +3 -1
  96. package/dist/ceiling/floorplan-affordances.d.ts +112 -0
  97. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  98. package/dist/ceiling/materials.d.ts +5 -0
  99. package/dist/ceiling/materials.d.ts.map +1 -1
  100. package/dist/ceiling/materials.js +17 -0
  101. package/dist/ceiling/panel-model.d.ts +13 -0
  102. package/dist/ceiling/panel-model.d.ts.map +1 -0
  103. package/dist/ceiling/panel-model.js +49 -0
  104. package/dist/ceiling/panel.d.ts.map +1 -1
  105. package/dist/ceiling/panel.js +82 -18
  106. package/dist/ceiling/renderer.d.ts.map +1 -1
  107. package/dist/ceiling/renderer.js +10 -4
  108. package/dist/ceiling/tool.d.ts.map +1 -1
  109. package/dist/ceiling/tool.js +24 -4
  110. package/dist/chimney/panel.d.ts.map +1 -1
  111. package/dist/chimney/panel.js +113 -41
  112. package/dist/column/definition.d.ts.map +1 -1
  113. package/dist/column/definition.js +3 -0
  114. package/dist/column/floorplan.d.ts.map +1 -1
  115. package/dist/column/floorplan.js +17 -0
  116. package/dist/column/hosted-resize.d.ts +28 -1
  117. package/dist/column/hosted-resize.d.ts.map +1 -1
  118. package/dist/column/panel.d.ts.map +1 -1
  119. package/dist/column/panel.js +125 -37
  120. package/dist/column/post-options.d.ts +10 -0
  121. package/dist/column/post-options.d.ts.map +1 -0
  122. package/dist/column/post-options.js +71 -0
  123. package/dist/column/post-placement.d.ts +78 -0
  124. package/dist/column/post-placement.d.ts.map +1 -0
  125. package/dist/column/post-placement.js +157 -0
  126. package/dist/column/post-section.d.ts +17 -0
  127. package/dist/column/post-section.d.ts.map +1 -0
  128. package/dist/column/post-section.js +95 -0
  129. package/dist/column/post-tool.d.ts +11 -0
  130. package/dist/column/post-tool.d.ts.map +1 -0
  131. package/dist/column/post-tool.js +94 -0
  132. package/dist/column/tool.d.ts +3 -10
  133. package/dist/column/tool.d.ts.map +1 -1
  134. package/dist/column/tool.js +13 -1
  135. package/dist/cupola/panel.d.ts.map +1 -1
  136. package/dist/cupola/panel.js +14 -7
  137. package/dist/door/actions.d.ts +7 -0
  138. package/dist/door/actions.d.ts.map +1 -0
  139. package/dist/door/actions.js +32 -0
  140. package/dist/door/contextual-dimensions.d.ts.map +1 -1
  141. package/dist/door/contextual-dimensions.js +11 -1
  142. package/dist/door/definition.d.ts.map +1 -1
  143. package/dist/door/definition.js +34 -7
  144. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  145. package/dist/door/floorplan-affordances.js +5 -2
  146. package/dist/door/floorplan-move.d.ts.map +1 -1
  147. package/dist/door/floorplan-move.js +28 -6
  148. package/dist/door/floorplan.d.ts +2 -0
  149. package/dist/door/floorplan.d.ts.map +1 -1
  150. package/dist/door/floorplan.js +89 -16
  151. package/dist/door/move-tool.d.ts.map +1 -1
  152. package/dist/door/move-tool.js +60 -16
  153. package/dist/door/paint.d.ts +2 -7
  154. package/dist/door/paint.d.ts.map +1 -1
  155. package/dist/door/paint.js +26 -2
  156. package/dist/door/panel.d.ts.map +1 -1
  157. package/dist/door/panel.js +242 -90
  158. package/dist/door/parametrics.js +1 -1
  159. package/dist/door/placement.d.ts.map +1 -1
  160. package/dist/door/placement.js +9 -2
  161. package/dist/door/swing.d.ts +22 -0
  162. package/dist/door/swing.d.ts.map +1 -0
  163. package/dist/door/swing.js +36 -0
  164. package/dist/door/tool.d.ts.map +1 -1
  165. package/dist/door/tool.js +76 -29
  166. package/dist/dormer/panel-actions-section.d.ts.map +1 -1
  167. package/dist/dormer/panel-actions-section.js +3 -1
  168. package/dist/dormer/panel-position-section.d.ts.map +1 -1
  169. package/dist/dormer/panel-position-section.js +4 -3
  170. package/dist/dormer/panel-windows-section.d.ts.map +1 -1
  171. package/dist/dormer/panel-windows-section.js +38 -1
  172. package/dist/dormer/panel.d.ts.map +1 -1
  173. package/dist/dormer/panel.js +24 -18
  174. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  175. package/dist/downspout/inspector-editors.js +3 -2
  176. package/dist/duct-fitting/inspector-editors.d.ts.map +1 -1
  177. package/dist/duct-fitting/inspector-editors.js +6 -1
  178. package/dist/duct-fitting/tool.d.ts.map +1 -1
  179. package/dist/duct-fitting/tool.js +11 -2
  180. package/dist/duct-terminal/tool.d.ts.map +1 -1
  181. package/dist/duct-terminal/tool.js +11 -2
  182. package/dist/elevator/panel.d.ts.map +1 -1
  183. package/dist/elevator/panel.js +41 -18
  184. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  185. package/dist/eyebrow-vent/panel.js +16 -6
  186. package/dist/fence/drafting.d.ts +2 -3
  187. package/dist/fence/drafting.d.ts.map +1 -1
  188. package/dist/fence/drafting.js +2 -3
  189. package/dist/fence/inspector-editors.d.ts.map +1 -1
  190. package/dist/fence/inspector-editors.js +64 -21
  191. package/dist/fence/move-endpoint-tool.d.ts.map +1 -1
  192. package/dist/fence/move-endpoint-tool.js +11 -2
  193. package/dist/fence/system.d.ts.map +1 -1
  194. package/dist/fence/system.js +13 -0
  195. package/dist/fence-feature/actions.d.ts.map +1 -1
  196. package/dist/fence-feature/actions.js +5 -2
  197. package/dist/fence-feature/inspector.d.ts.map +1 -1
  198. package/dist/fence-feature/inspector.js +150 -34
  199. package/dist/fence-feature/move-session.d.ts +1 -1
  200. package/dist/floor-opening/floorplan.d.ts +29 -6
  201. package/dist/floor-opening/floorplan.d.ts.map +1 -1
  202. package/dist/floor-opening/floorplan.js +172 -14
  203. package/dist/gutter/downspouts-panel.d.ts.map +1 -1
  204. package/dist/gutter/downspouts-panel.js +14 -2
  205. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  206. package/dist/hvac-equipment/tool.js +3 -2
  207. package/dist/i18n/definition-messages.d.ts +5 -0
  208. package/dist/i18n/definition-messages.d.ts.map +1 -0
  209. package/dist/i18n/definition-messages.js +771 -0
  210. package/dist/index.d.ts +4 -1
  211. package/dist/index.d.ts.map +1 -1
  212. package/dist/index.js +6 -1
  213. package/dist/item/authored-params.d.ts.map +1 -1
  214. package/dist/item/authored-params.js +19 -4
  215. package/dist/item/floorplan.d.ts +1 -1
  216. package/dist/item/floorplan.d.ts.map +1 -1
  217. package/dist/item/panel.d.ts.map +1 -1
  218. package/dist/item/panel.js +9 -7
  219. package/dist/liquid-line/tool.d.ts.map +1 -1
  220. package/dist/liquid-line/tool.js +10 -3
  221. package/dist/measurement/tool.d.ts +1 -1
  222. package/dist/measurement/tool.d.ts.map +1 -1
  223. package/dist/measurement/tool.js +8 -8
  224. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  225. package/dist/pipe-fitting/tool.js +3 -2
  226. package/dist/pipe-trap/tool.d.ts.map +1 -1
  227. package/dist/pipe-trap/tool.js +7 -2
  228. package/dist/procedural-item/renderer.d.ts.map +1 -1
  229. package/dist/procedural-item/renderer.js +8 -1
  230. package/dist/ridge-vent/panel.d.ts.map +1 -1
  231. package/dist/ridge-vent/panel.js +22 -9
  232. package/dist/roof/barrel-panel.d.ts.map +1 -1
  233. package/dist/roof/barrel-panel.js +7 -3
  234. package/dist/roof/definition.d.ts.map +1 -1
  235. package/dist/roof/definition.js +33 -3
  236. package/dist/roof/floorplan-overrides.d.ts +22 -0
  237. package/dist/roof/floorplan-overrides.d.ts.map +1 -0
  238. package/dist/roof/floorplan-overrides.js +46 -0
  239. package/dist/roof/floorplan-tool.d.ts +9 -0
  240. package/dist/roof/floorplan-tool.d.ts.map +1 -0
  241. package/dist/roof/floorplan-tool.js +168 -0
  242. package/dist/roof/floorplan.d.ts.map +1 -1
  243. package/dist/roof/floorplan.js +131 -41
  244. package/dist/roof/glazing-controls.d.ts +2 -1
  245. package/dist/roof/glazing-controls.d.ts.map +1 -1
  246. package/dist/roof/glazing-controls.js +51 -13
  247. package/dist/roof/glazing-panel-editor.d.ts.map +1 -1
  248. package/dist/roof/glazing-panel-editor.js +40 -13
  249. package/dist/roof/glazing-panel.d.ts.map +1 -1
  250. package/dist/roof/glazing-panel.js +73 -9
  251. package/dist/roof/paint.d.ts +19 -0
  252. package/dist/roof/paint.d.ts.map +1 -0
  253. package/dist/roof/paint.js +158 -0
  254. package/dist/roof/panel.d.ts.map +1 -1
  255. package/dist/roof/panel.js +90 -22
  256. package/dist/roof/renderer.d.ts.map +1 -1
  257. package/dist/roof/renderer.js +13 -2
  258. package/dist/roof/roof-footprint-source.d.ts +17 -0
  259. package/dist/roof/roof-footprint-source.d.ts.map +1 -1
  260. package/dist/roof/roof-footprint-source.js +14 -0
  261. package/dist/roof/roof-footprint.d.ts +36 -2
  262. package/dist/roof/roof-footprint.d.ts.map +1 -1
  263. package/dist/roof/roof-footprint.js +124 -2
  264. package/dist/roof/roof-materials.d.ts.map +1 -1
  265. package/dist/roof/roof-materials.js +10 -1
  266. package/dist/roof/roof-placement-mode.d.ts +0 -2
  267. package/dist/roof/roof-placement-mode.d.ts.map +1 -1
  268. package/dist/roof/roof-placement-mode.js +8 -6
  269. package/dist/roof/roof-plan-creases.d.ts +50 -0
  270. package/dist/roof/roof-plan-creases.d.ts.map +1 -0
  271. package/dist/roof/roof-plan-creases.js +194 -0
  272. package/dist/roof/roof-ridge-mode.d.ts +20 -0
  273. package/dist/roof/roof-ridge-mode.d.ts.map +1 -0
  274. package/dist/roof/roof-ridge-mode.js +16 -0
  275. package/dist/roof/tool.d.ts +17 -4
  276. package/dist/roof/tool.d.ts.map +1 -1
  277. package/dist/roof/tool.js +211 -113
  278. package/dist/roof/wall-catch.d.ts +106 -0
  279. package/dist/roof/wall-catch.d.ts.map +1 -0
  280. package/dist/roof/wall-catch.js +267 -0
  281. package/dist/roof-segment/build-up-section.d.ts +9 -0
  282. package/dist/roof-segment/build-up-section.d.ts.map +1 -0
  283. package/dist/roof-segment/build-up-section.js +191 -0
  284. package/dist/roof-segment/definition.d.ts.map +1 -1
  285. package/dist/roof-segment/definition.js +50 -5
  286. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  287. package/dist/roof-segment/floorplan-affordances.js +68 -19
  288. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  289. package/dist/roof-segment/floorplan.js +16 -12
  290. package/dist/roof-segment/paint.d.ts +3 -1
  291. package/dist/roof-segment/paint.d.ts.map +1 -1
  292. package/dist/roof-segment/paint.js +43 -2
  293. package/dist/roof-segment/panel-model.d.ts +23 -0
  294. package/dist/roof-segment/panel-model.d.ts.map +1 -0
  295. package/dist/roof-segment/panel-model.js +64 -0
  296. package/dist/roof-segment/panel.d.ts.map +1 -1
  297. package/dist/roof-segment/panel.js +96 -14
  298. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  299. package/dist/roof-segment/parametrics.js +4 -0
  300. package/dist/roof-segment/renderer.d.ts.map +1 -1
  301. package/dist/roof-segment/renderer.js +26 -5
  302. package/dist/separator/definition.d.ts.map +1 -1
  303. package/dist/separator/definition.js +10 -12
  304. package/dist/separator/floorplan-affordances.d.ts +9 -0
  305. package/dist/separator/floorplan-affordances.d.ts.map +1 -0
  306. package/dist/separator/floorplan-affordances.js +23 -0
  307. package/dist/separator/floorplan.d.ts +9 -0
  308. package/dist/separator/floorplan.d.ts.map +1 -0
  309. package/dist/separator/floorplan.js +54 -0
  310. package/dist/separator/renderer.d.ts +4 -0
  311. package/dist/separator/renderer.d.ts.map +1 -1
  312. package/dist/separator/renderer.js +21 -6
  313. package/dist/separator/selection.d.ts +10 -0
  314. package/dist/separator/selection.d.ts.map +1 -0
  315. package/dist/separator/selection.js +35 -0
  316. package/dist/shared/build-up-controls.d.ts +88 -0
  317. package/dist/shared/build-up-controls.d.ts.map +1 -0
  318. package/dist/shared/build-up-controls.js +139 -0
  319. package/dist/shared/curtain-opening-limits.d.ts.map +1 -1
  320. package/dist/shared/curtain-opening-limits.js +44 -14
  321. package/dist/shared/item-interaction-actions.d.ts.map +1 -1
  322. package/dist/shared/item-interaction-actions.js +11 -2
  323. package/dist/shared/layer-thickness.d.ts +2 -0
  324. package/dist/shared/layer-thickness.d.ts.map +1 -0
  325. package/dist/shared/layer-thickness.js +3 -0
  326. package/dist/shared/move-roof-tool.d.ts.map +1 -1
  327. package/dist/shared/move-roof-tool.js +100 -5
  328. package/dist/shared/node-batch/batchable.d.ts +2 -0
  329. package/dist/shared/node-batch/batchable.d.ts.map +1 -1
  330. package/dist/shared/node-batch/batchable.js +4 -0
  331. package/dist/shared/node-batch/candidates.d.ts +21 -5
  332. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  333. package/dist/shared/node-batch/candidates.js +85 -50
  334. package/dist/shared/node-batch/system.d.ts.map +1 -1
  335. package/dist/shared/node-batch/system.js +24 -15
  336. package/dist/shared/opening-casing-move.d.ts +16 -0
  337. package/dist/shared/opening-casing-move.d.ts.map +1 -0
  338. package/dist/shared/opening-casing-move.js +33 -0
  339. package/dist/shared/opening-casing-section.d.ts +15 -0
  340. package/dist/shared/opening-casing-section.d.ts.map +1 -0
  341. package/dist/shared/opening-casing-section.js +38 -0
  342. package/dist/shared/opening-casing.d.ts +26 -0
  343. package/dist/shared/opening-casing.d.ts.map +1 -0
  344. package/dist/shared/opening-casing.js +80 -0
  345. package/dist/shared/opening-depth-position.d.ts +13 -0
  346. package/dist/shared/opening-depth-position.d.ts.map +1 -0
  347. package/dist/shared/opening-depth-position.js +34 -0
  348. package/dist/shared/opening-documentation.d.ts.map +1 -1
  349. package/dist/shared/opening-documentation.js +17 -8
  350. package/dist/shared/opening-guides-runtime.d.ts +2 -1
  351. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  352. package/dist/shared/opening-guides-runtime.js +11 -7
  353. package/dist/shared/opening-labels.d.ts +11 -0
  354. package/dist/shared/opening-labels.d.ts.map +1 -0
  355. package/dist/shared/opening-labels.js +46 -0
  356. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  357. package/dist/shared/opening-placement-dimensions.js +11 -9
  358. package/dist/shared/opening-plane-offset.d.ts +4 -3
  359. package/dist/shared/opening-plane-offset.d.ts.map +1 -1
  360. package/dist/shared/opening-plane-offset.js +7 -4
  361. package/dist/shared/opening-swap.d.ts +8 -0
  362. package/dist/shared/opening-swap.d.ts.map +1 -0
  363. package/dist/shared/opening-swap.js +18 -0
  364. package/dist/shared/polygon-vertex-affordance.d.ts +19 -0
  365. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  366. package/dist/shared/polygon-vertex-affordance.js +65 -6
  367. package/dist/shared/roof-opening-host.d.ts +2 -1
  368. package/dist/shared/roof-opening-host.d.ts.map +1 -1
  369. package/dist/shared/roof-opening-host.js +14 -5
  370. package/dist/shared/roof-wall-opening-cut.d.ts.map +1 -1
  371. package/dist/shared/roof-wall-opening-cut.js +14 -6
  372. package/dist/shared/roof-wall-opening-placement.d.ts +2 -1
  373. package/dist/shared/roof-wall-opening-placement.d.ts.map +1 -1
  374. package/dist/shared/roof-wall-opening-placement.js +6 -4
  375. package/dist/shared/run-hanger-inspector.d.ts.map +1 -1
  376. package/dist/shared/run-hanger-inspector.js +39 -5
  377. package/dist/shared/system-check-panel.d.ts.map +1 -1
  378. package/dist/shared/system-check-panel.js +94 -15
  379. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  380. package/dist/shared/wall-attach-target.js +6 -3
  381. package/dist/shelf/definition.d.ts.map +1 -1
  382. package/dist/shelf/definition.js +2 -0
  383. package/dist/site/ground-hole.d.ts +3 -3
  384. package/dist/site/ground-hole.js +3 -3
  385. package/dist/site/ground-veil.d.ts +5 -12
  386. package/dist/site/ground-veil.d.ts.map +1 -1
  387. package/dist/site/ground-veil.js +9 -33
  388. package/dist/site/panel.d.ts.map +1 -1
  389. package/dist/site/panel.js +52 -12
  390. package/dist/site/renderer.d.ts.map +1 -1
  391. package/dist/site/renderer.js +52 -23
  392. package/dist/skylight/panel.d.ts.map +1 -1
  393. package/dist/skylight/panel.js +49 -19
  394. package/dist/slab/deck-geometry.d.ts +28 -0
  395. package/dist/slab/deck-geometry.d.ts.map +1 -0
  396. package/dist/slab/deck-geometry.js +320 -0
  397. package/dist/slab/definition.d.ts +2 -1
  398. package/dist/slab/definition.d.ts.map +1 -1
  399. package/dist/slab/definition.js +6 -1
  400. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  401. package/dist/slab/dependency-tracker.js +3 -0
  402. package/dist/slab/floorplan-affordances.d.ts +500 -0
  403. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  404. package/dist/slab/geometry.d.ts.map +1 -1
  405. package/dist/slab/geometry.js +46 -9
  406. package/dist/slab/panel.d.ts.map +1 -1
  407. package/dist/slab/panel.js +97 -21
  408. package/dist/slab/renderer.d.ts +11 -0
  409. package/dist/slab/renderer.d.ts.map +1 -0
  410. package/dist/slab/renderer.js +19 -0
  411. package/dist/slab/system.d.ts.map +1 -1
  412. package/dist/slab/system.js +12 -1
  413. package/dist/solar-panel/panel.d.ts.map +1 -1
  414. package/dist/solar-panel/panel.js +49 -14
  415. package/dist/stair/construction-controls.d.ts +3 -1
  416. package/dist/stair/construction-controls.d.ts.map +1 -1
  417. package/dist/stair/construction-controls.js +75 -12
  418. package/dist/stair/paint.d.ts +6 -0
  419. package/dist/stair/paint.d.ts.map +1 -1
  420. package/dist/stair/panel.d.ts.map +1 -1
  421. package/dist/stair/panel.js +243 -51
  422. package/dist/stair/parametrics.d.ts.map +1 -1
  423. package/dist/stair/parametrics.js +7 -0
  424. package/dist/stair/placement-defaults.d.ts +18 -0
  425. package/dist/stair/placement-defaults.d.ts.map +1 -0
  426. package/dist/stair/placement-defaults.js +27 -0
  427. package/dist/stair/railing-controls.d.ts.map +1 -1
  428. package/dist/stair/railing-controls.js +78 -18
  429. package/dist/stair/renderer.d.ts.map +1 -1
  430. package/dist/stair/renderer.js +16 -10
  431. package/dist/stair/structure-controls.d.ts +18 -0
  432. package/dist/stair/structure-controls.d.ts.map +1 -0
  433. package/dist/stair/structure-controls.js +275 -0
  434. package/dist/stair/tool.d.ts.map +1 -1
  435. package/dist/stair/tool.js +13 -9
  436. package/dist/stair/use-stair-render-data.d.ts +41 -0
  437. package/dist/stair/use-stair-render-data.d.ts.map +1 -1
  438. package/dist/stair-segment/panel.d.ts.map +1 -1
  439. package/dist/stair-segment/panel.js +65 -18
  440. package/dist/turbine-vent/panel.d.ts.map +1 -1
  441. package/dist/turbine-vent/panel.js +14 -5
  442. package/dist/unit/unit-panel.d.ts.map +1 -1
  443. package/dist/unit/unit-panel.js +28 -12
  444. package/dist/wall/actions.d.ts +1 -1
  445. package/dist/wall/actions.d.ts.map +1 -1
  446. package/dist/wall/actions.js +17 -13
  447. package/dist/wall/construction-dimensions.d.ts +6 -0
  448. package/dist/wall/construction-dimensions.d.ts.map +1 -1
  449. package/dist/wall/construction-dimensions.js +8 -0
  450. package/dist/wall/contextual-dimensions.d.ts +6 -0
  451. package/dist/wall/contextual-dimensions.d.ts.map +1 -1
  452. package/dist/wall/contextual-dimensions.js +104 -17
  453. package/dist/wall/curtain-opening-frame.d.ts.map +1 -1
  454. package/dist/wall/curtain-opening-frame.js +6 -4
  455. package/dist/wall/curtain-wall-layout.d.ts +1 -1
  456. package/dist/wall/curtain-wall-layout.d.ts.map +1 -1
  457. package/dist/wall/curtain-wall-layout.js +6 -4
  458. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  459. package/dist/wall/curtain-wall-materials.js +8 -3
  460. package/dist/wall/curtain-wall-panel.d.ts.map +1 -1
  461. package/dist/wall/curtain-wall-panel.js +241 -37
  462. package/dist/wall/curve-tool.d.ts.map +1 -1
  463. package/dist/wall/curve-tool.js +2 -3
  464. package/dist/wall/definition.d.ts.map +1 -1
  465. package/dist/wall/definition.js +20 -5
  466. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  467. package/dist/wall/floorplan-affordances.js +9 -6
  468. package/dist/wall/floorplan-move.d.ts.map +1 -1
  469. package/dist/wall/floorplan-move.js +66 -16
  470. package/dist/wall/floorplan.d.ts +4 -5
  471. package/dist/wall/floorplan.d.ts.map +1 -1
  472. package/dist/wall/floorplan.js +62 -46
  473. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  474. package/dist/wall/move-endpoint-tool.js +1 -0
  475. package/dist/wall/move-tool.d.ts.map +1 -1
  476. package/dist/wall/move-tool.js +77 -12
  477. package/dist/wall/paint.d.ts +2 -2
  478. package/dist/wall/paint.d.ts.map +1 -1
  479. package/dist/wall/paint.js +11 -4
  480. package/dist/wall/panel-model.d.ts +17 -2
  481. package/dist/wall/panel-model.d.ts.map +1 -1
  482. package/dist/wall/panel-model.js +158 -18
  483. package/dist/wall/panel.d.ts +8 -0
  484. package/dist/wall/panel.d.ts.map +1 -1
  485. package/dist/wall/panel.js +228 -156
  486. package/dist/wall/parametrics.d.ts +1 -1
  487. package/dist/wall/parametrics.d.ts.map +1 -1
  488. package/dist/wall/parametrics.js +14 -1
  489. package/dist/wall/railing-wall-adapter.d.ts +7 -0
  490. package/dist/wall/railing-wall-adapter.d.ts.map +1 -0
  491. package/dist/wall/railing-wall-adapter.js +38 -0
  492. package/dist/wall/railing-wall-floorplan.d.ts +8 -0
  493. package/dist/wall/railing-wall-floorplan.d.ts.map +1 -0
  494. package/dist/wall/railing-wall-floorplan.js +27 -0
  495. package/dist/wall/railing-wall-geometry.d.ts +12 -0
  496. package/dist/wall/railing-wall-geometry.d.ts.map +1 -0
  497. package/dist/wall/railing-wall-geometry.js +51 -0
  498. package/dist/wall/railing-wall-guard.d.ts +81 -0
  499. package/dist/wall/railing-wall-guard.d.ts.map +1 -0
  500. package/dist/wall/railing-wall-guard.js +435 -0
  501. package/dist/wall/railing-wall-materials.d.ts +11 -0
  502. package/dist/wall/railing-wall-materials.d.ts.map +1 -0
  503. package/dist/wall/railing-wall-materials.js +31 -0
  504. package/dist/wall/railing-wall-panel-model.d.ts +30 -0
  505. package/dist/wall/railing-wall-panel-model.d.ts.map +1 -0
  506. package/dist/wall/railing-wall-panel-model.js +117 -0
  507. package/dist/wall/railing-wall-panel.d.ts +17 -0
  508. package/dist/wall/railing-wall-panel.d.ts.map +1 -0
  509. package/dist/wall/railing-wall-panel.js +42 -0
  510. package/dist/wall/rectangle-command.d.ts +79 -1
  511. package/dist/wall/rectangle-command.d.ts.map +1 -1
  512. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  513. package/dist/wall/rectangle-tool.js +2 -0
  514. package/dist/wall/renderer.d.ts.map +1 -1
  515. package/dist/wall/renderer.js +3 -1
  516. package/dist/wall/skirting-floor-gaps.d.ts +8 -0
  517. package/dist/wall/skirting-floor-gaps.d.ts.map +1 -0
  518. package/dist/wall/skirting-floor-gaps.js +36 -0
  519. package/dist/wall/system.d.ts +0 -14
  520. package/dist/wall/system.d.ts.map +1 -1
  521. package/dist/wall/system.js +6 -1
  522. package/dist/wall/tool.d.ts +16 -0
  523. package/dist/wall/tool.d.ts.map +1 -1
  524. package/dist/wall/tool.js +160 -47
  525. package/dist/wall/treatments.d.ts +3 -0
  526. package/dist/wall/treatments.d.ts.map +1 -1
  527. package/dist/wall/treatments.js +30 -7
  528. package/dist/window/actions.d.ts +7 -0
  529. package/dist/window/actions.d.ts.map +1 -0
  530. package/dist/window/actions.js +29 -0
  531. package/dist/window/definition.d.ts.map +1 -1
  532. package/dist/window/definition.js +11 -2
  533. package/dist/window/floorplan-move.d.ts.map +1 -1
  534. package/dist/window/floorplan-move.js +5 -0
  535. package/dist/window/floorplan.d.ts +2 -0
  536. package/dist/window/floorplan.d.ts.map +1 -1
  537. package/dist/window/floorplan.js +58 -1
  538. package/dist/window/mechanism.d.ts.map +1 -1
  539. package/dist/window/mechanism.js +21 -1
  540. package/dist/window/move-tool.d.ts.map +1 -1
  541. package/dist/window/move-tool.js +10 -3
  542. package/dist/window/paint.d.ts +2 -7
  543. package/dist/window/paint.d.ts.map +1 -1
  544. package/dist/window/paint.js +31 -3
  545. package/dist/window/panel.d.ts.map +1 -1
  546. package/dist/window/panel.js +311 -69
  547. package/dist/window/placement.d.ts.map +1 -1
  548. package/dist/window/placement.js +5 -1
  549. package/dist/window/swing.d.ts +13 -0
  550. package/dist/window/swing.d.ts.map +1 -0
  551. package/dist/window/swing.js +16 -0
  552. package/dist/window/tool.d.ts.map +1 -1
  553. package/dist/window/tool.js +19 -14
  554. package/dist/zone/floorplan-affordances.d.ts +136 -0
  555. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  556. package/dist/zone/quantities-panel.d.ts.map +1 -1
  557. package/dist/zone/quantities-panel.js +34 -9
  558. package/dist/zone/renderer.d.ts.map +1 -1
  559. package/dist/zone/renderer.js +9 -5
  560. package/package.json +14 -14
  561. package/dist/site/generic-foundation-geometry.d.ts +0 -16
  562. package/dist/site/generic-foundation-geometry.d.ts.map +0 -1
  563. package/dist/site/generic-foundation-geometry.js +0 -75
  564. package/dist/site/generic-foundation.d.ts +0 -4
  565. package/dist/site/generic-foundation.d.ts.map +0 -1
  566. package/dist/site/generic-foundation.js +0 -91
@@ -40,6 +40,11 @@ export declare const ceilingMoveVertexAffordance: import("@pascal-app/core").Flo
40
40
  url: string;
41
41
  repeat?: [number, number] | undefined;
42
42
  scale?: number | undefined;
43
+ offset?: [number, number] | undefined;
44
+ normalMap?: string | undefined;
45
+ normalScale?: number | undefined;
46
+ bumpMap?: string | undefined;
47
+ bumpScale?: number | undefined;
43
48
  } | undefined;
44
49
  } | undefined;
45
50
  materialPreset?: string | undefined;
@@ -54,6 +59,29 @@ export declare const ceilingMoveVertexAffordance: import("@pascal-app/core").Flo
54
59
  }[];
55
60
  openingIds?: string[] | undefined;
56
61
  height?: number | undefined;
62
+ buildUp?: {
63
+ presetId?: string | undefined;
64
+ finish?: {
65
+ kind: "drywall" | "plaster" | "wood-plank";
66
+ thickness: number;
67
+ name?: string | undefined;
68
+ } | undefined;
69
+ framing?: {
70
+ system: "joists" | "truss-chords";
71
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
72
+ spacing: number;
73
+ } | undefined;
74
+ decking?: {
75
+ kind: "osb" | "plywood";
76
+ thickness: number;
77
+ name?: string | undefined;
78
+ } | undefined;
79
+ insulation?: {
80
+ kind: "batt" | "blown" | "rigid";
81
+ thickness: number;
82
+ name?: string | undefined;
83
+ } | undefined;
84
+ } | undefined;
57
85
  regions?: {
58
86
  id: string;
59
87
  polygon: [number, number][];
@@ -105,6 +133,11 @@ export declare const ceilingAddVertexAffordance: import("@pascal-app/core").Floo
105
133
  url: string;
106
134
  repeat?: [number, number] | undefined;
107
135
  scale?: number | undefined;
136
+ offset?: [number, number] | undefined;
137
+ normalMap?: string | undefined;
138
+ normalScale?: number | undefined;
139
+ bumpMap?: string | undefined;
140
+ bumpScale?: number | undefined;
108
141
  } | undefined;
109
142
  } | undefined;
110
143
  materialPreset?: string | undefined;
@@ -119,6 +152,29 @@ export declare const ceilingAddVertexAffordance: import("@pascal-app/core").Floo
119
152
  }[];
120
153
  openingIds?: string[] | undefined;
121
154
  height?: number | undefined;
155
+ buildUp?: {
156
+ presetId?: string | undefined;
157
+ finish?: {
158
+ kind: "drywall" | "plaster" | "wood-plank";
159
+ thickness: number;
160
+ name?: string | undefined;
161
+ } | undefined;
162
+ framing?: {
163
+ system: "joists" | "truss-chords";
164
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
165
+ spacing: number;
166
+ } | undefined;
167
+ decking?: {
168
+ kind: "osb" | "plywood";
169
+ thickness: number;
170
+ name?: string | undefined;
171
+ } | undefined;
172
+ insulation?: {
173
+ kind: "batt" | "blown" | "rigid";
174
+ thickness: number;
175
+ name?: string | undefined;
176
+ } | undefined;
177
+ } | undefined;
122
178
  regions?: {
123
179
  id: string;
124
180
  polygon: [number, number][];
@@ -170,6 +226,11 @@ export declare const ceilingMoveEdgeAffordance: import("@pascal-app/core").Floor
170
226
  url: string;
171
227
  repeat?: [number, number] | undefined;
172
228
  scale?: number | undefined;
229
+ offset?: [number, number] | undefined;
230
+ normalMap?: string | undefined;
231
+ normalScale?: number | undefined;
232
+ bumpMap?: string | undefined;
233
+ bumpScale?: number | undefined;
173
234
  } | undefined;
174
235
  } | undefined;
175
236
  materialPreset?: string | undefined;
@@ -184,6 +245,29 @@ export declare const ceilingMoveEdgeAffordance: import("@pascal-app/core").Floor
184
245
  }[];
185
246
  openingIds?: string[] | undefined;
186
247
  height?: number | undefined;
248
+ buildUp?: {
249
+ presetId?: string | undefined;
250
+ finish?: {
251
+ kind: "drywall" | "plaster" | "wood-plank";
252
+ thickness: number;
253
+ name?: string | undefined;
254
+ } | undefined;
255
+ framing?: {
256
+ system: "joists" | "truss-chords";
257
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
258
+ spacing: number;
259
+ } | undefined;
260
+ decking?: {
261
+ kind: "osb" | "plywood";
262
+ thickness: number;
263
+ name?: string | undefined;
264
+ } | undefined;
265
+ insulation?: {
266
+ kind: "batt" | "blown" | "rigid";
267
+ thickness: number;
268
+ name?: string | undefined;
269
+ } | undefined;
270
+ } | undefined;
187
271
  regions?: {
188
272
  id: string;
189
273
  polygon: [number, number][];
@@ -235,6 +319,11 @@ export declare const ceilingDeleteVertexAffordance: import("@pascal-app/core").F
235
319
  url: string;
236
320
  repeat?: [number, number] | undefined;
237
321
  scale?: number | undefined;
322
+ offset?: [number, number] | undefined;
323
+ normalMap?: string | undefined;
324
+ normalScale?: number | undefined;
325
+ bumpMap?: string | undefined;
326
+ bumpScale?: number | undefined;
238
327
  } | undefined;
239
328
  } | undefined;
240
329
  materialPreset?: string | undefined;
@@ -249,6 +338,29 @@ export declare const ceilingDeleteVertexAffordance: import("@pascal-app/core").F
249
338
  }[];
250
339
  openingIds?: string[] | undefined;
251
340
  height?: number | undefined;
341
+ buildUp?: {
342
+ presetId?: string | undefined;
343
+ finish?: {
344
+ kind: "drywall" | "plaster" | "wood-plank";
345
+ thickness: number;
346
+ name?: string | undefined;
347
+ } | undefined;
348
+ framing?: {
349
+ system: "joists" | "truss-chords";
350
+ size: "2x10" | "2x12" | "2x4" | "2x6" | "2x8";
351
+ spacing: number;
352
+ } | undefined;
353
+ decking?: {
354
+ kind: "osb" | "plywood";
355
+ thickness: number;
356
+ name?: string | undefined;
357
+ } | undefined;
358
+ insulation?: {
359
+ kind: "batt" | "blown" | "rigid";
360
+ thickness: number;
361
+ name?: string | undefined;
362
+ } | undefined;
363
+ } | undefined;
252
364
  regions?: {
253
365
  id: string;
254
366
  polygon: [number, number][];
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/ceiling/floorplan-affordances.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGvC,CAAA;AACD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGtC,CAAA;AACD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGrC,CAAA;AACD,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGzC,CAAA"}
1
+ {"version":3,"file":"floorplan-affordances.d.ts","sourceRoot":"","sources":["../../src/ceiling/floorplan-affordances.ts"],"names":[],"mappings":"AAoCA,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGvC,CAAA;AACD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGtC,CAAA;AACD,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGrC,CAAA;AACD,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGzC,CAAA"}
@@ -7,6 +7,11 @@ export type CeilingMaterials = {
7
7
  bottomMaterial: Material;
8
8
  };
9
9
  export declare function getCeilingMaterials(color?: string, shading?: RenderShading): CeilingMaterials;
10
+ /**
11
+ * The upper face, drawn while the viewer shows ceiling tops: the ceiling's colour, facing up, so
12
+ * the ceiling reads as solid from above.
13
+ */
14
+ export declare function getCeilingCapMaterial(color: string, shading: RenderShading): Material;
10
15
  /** Resolve through the shared caches, without mutating another surface's material. */
11
16
  export declare function resolveCeilingFinish(finish: MaterialSchema | string | undefined, sceneMaterials: Record<SceneMaterialId, SceneMaterial> | undefined, shading: RenderShading): Material | null;
12
17
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../src/ceiling/materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAInB,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAErC,OAAO,EAAuB,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAmBzE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,qBAAqB,CAAA;IAClC,cAAc,EAAE,QAAQ,CAAA;CACzB,CAAA;AAgBD,wBAAgB,mBAAmB,CACjC,KAAK,SAAY,EACjB,OAAO,GAAE,aAA0B,GAClC,gBAAgB,CAuBlB;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,EAC3C,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS,EAClE,OAAO,EAAE,aAAa,GACrB,QAAQ,GAAG,IAAI,CA6BjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS,GACjE,MAAM,GAAG,IAAI,CAiBf"}
1
+ {"version":3,"file":"materials.d.ts","sourceRoot":"","sources":["../../src/ceiling/materials.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EAInB,KAAK,aAAa,EAClB,KAAK,eAAe,EACrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAA4C,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAErC,OAAO,EAAuB,qBAAqB,EAAE,MAAM,cAAc,CAAA;AAmBzE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,WAAW,EAAE,qBAAqB,CAAA;IAClC,cAAc,EAAE,QAAQ,CAAA;CACzB,CAAA;AAgBD,wBAAgB,mBAAmB,CACjC,KAAK,SAAY,EACjB,OAAO,GAAE,aAA0B,GAClC,gBAAgB,CAuBlB;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,QAAQ,CAerF;AAED,sFAAsF;AACtF,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,cAAc,GAAG,MAAM,GAAG,SAAS,EAC3C,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS,EAClE,OAAO,EAAE,aAAa,GACrB,QAAQ,GAAG,IAAI,CA6BjB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,cAAc,EAAE,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,SAAS,GACjE,MAAM,GAAG,IAAI,CAiBf"}
@@ -49,6 +49,23 @@ export function getCeilingMaterials(color = '#999999', shading = 'rendered') {
49
49
  }, shading),
50
50
  };
51
51
  }
52
+ /**
53
+ * The upper face, drawn while the viewer shows ceiling tops: the ceiling's colour, facing up, so
54
+ * the ceiling reads as solid from above.
55
+ */
56
+ export function getCeilingCapMaterial(color, shading) {
57
+ return createMaterial({
58
+ preset: 'custom',
59
+ properties: {
60
+ color,
61
+ roughness: 0.9,
62
+ metalness: 0,
63
+ opacity: 1,
64
+ transparent: false,
65
+ side: 'front',
66
+ },
67
+ }, shading);
68
+ }
52
69
  /** Resolve through the shared caches, without mutating another surface's material. */
53
70
  export function resolveCeilingFinish(finish, sceneMaterials, shading) {
54
71
  if (!finish)
@@ -0,0 +1,13 @@
1
+ import { type CeilingBuildUp, type CeilingNode } from '@pascal-app/core';
2
+ import type { NodePanelModel } from '@pascal-app/editor';
3
+ /** The Preset choices for the `current` value: none, the presets, and Custom while it is. */
4
+ export declare function ceilingBuildUpPresetOptions(current: string | null): {
5
+ label: string;
6
+ value: string;
7
+ }[];
8
+ export declare function ceilingBuildUpPresetValue(buildUp: CeilingBuildUp | undefined): string;
9
+ /** The patch a Preset choice writes; `null` for Custom, which is no choice. */
10
+ export declare function ceilingBuildUpPresetPatch(id: string): Partial<CeilingNode> | null;
11
+ /** Multi-selected ceilings take one layers preset together, in one undo step. */
12
+ export declare const ceilingPanelModel: NodePanelModel<CeilingNode>;
13
+ //# sourceMappingURL=panel-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"panel-model.d.ts","sourceRoot":"","sources":["../../src/ceiling/panel-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,cAAc,EACnB,KAAK,WAAW,EAGjB,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAKxD,6FAA6F;AAC7F,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;;;IAMjE;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAErF;AAED,+EAA+E;AAC/E,wBAAgB,yBAAyB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI,CAIjF;AAED,iFAAiF;AACjF,eAAO,MAAM,iBAAiB,EAAE,cAAc,CAAC,WAAW,CA4BzD,CAAA"}
@@ -0,0 +1,49 @@
1
+ import { CEILING_BUILD_UP_PRESETS, runAsSingleSceneHistoryStep, useScene, } from '@pascal-app/core';
2
+ const NONE = 'none';
3
+ const CUSTOM = 'custom';
4
+ /** The Preset choices for the `current` value: none, the presets, and Custom while it is. */
5
+ export function ceilingBuildUpPresetOptions(current) {
6
+ return [
7
+ { label: 'None (a bare surface)', value: NONE },
8
+ ...(current === CUSTOM ? [{ label: 'Custom', value: CUSTOM }] : []),
9
+ ...CEILING_BUILD_UP_PRESETS.map((preset) => ({ label: preset.label, value: preset.id })),
10
+ ];
11
+ }
12
+ export function ceilingBuildUpPresetValue(buildUp) {
13
+ return buildUp ? (buildUp.presetId ?? CUSTOM) : NONE;
14
+ }
15
+ /** The patch a Preset choice writes; `null` for Custom, which is no choice. */
16
+ export function ceilingBuildUpPresetPatch(id) {
17
+ if (id === NONE)
18
+ return { buildUp: undefined };
19
+ const preset = CEILING_BUILD_UP_PRESETS.find((entry) => entry.id === id);
20
+ return preset ? { buildUp: preset.buildUp } : null;
21
+ }
22
+ /** Multi-selected ceilings take one layers preset together, in one undo step. */
23
+ export const ceilingPanelModel = {
24
+ rows: () => [],
25
+ multiControls: ({ selection }) => {
26
+ if (selection.length === 0)
27
+ return [];
28
+ const values = selection.map((ceiling) => ceilingBuildUpPresetValue(ceiling.buildUp));
29
+ const value = values.every((entry) => entry === values[0]) ? values[0] : null;
30
+ return [
31
+ {
32
+ id: 'ceiling-layers-preset',
33
+ kind: 'select',
34
+ section: 'Layers',
35
+ label: 'Preset',
36
+ options: ceilingBuildUpPresetOptions(value),
37
+ value,
38
+ onChange: (id) => {
39
+ const patch = ceilingBuildUpPresetPatch(id);
40
+ if (!patch)
41
+ return;
42
+ runAsSingleSceneHistoryStep(useScene, () => useScene
43
+ .getState()
44
+ .updateNodes(selection.map((ceiling) => ({ id: ceiling.id, data: patch }))));
45
+ },
46
+ },
47
+ ];
48
+ },
49
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/ceiling/panel.tsx"],"names":[],"mappings":"AA4BA;;;;;;;GAOG;AACH,wBAAgB,YAAY,uCA2Y3B;eAEc,YAAY"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/ceiling/panel.tsx"],"names":[],"mappings":"AAuCA;;;;;;;GAOG;AACH,wBAAgB,YAAY,uCA0d3B;eAEc,YAAY"}
@@ -1,10 +1,11 @@
1
1
  'use client';
2
2
  import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
- import { resolveCeilingHeight, useScene } from '@pascal-app/core';
4
- import { ActionButton, ActionGroup, exitCeilingEditToRoom, formatLinearMeasurement, holeEditScope, PanelSection, PanelWrapper, SegmentedControl, ShapeChoice, SliderControl, setCeilingHoles, startOpeningDraft, triggerSFX, useCeilingEditCeilingId, useCeilingEditSession, useEditingHole, useEditor, useInteractionScope, } from '@pascal-app/editor';
3
+ import { formatFixed, resolveCeilingHeight, usePascalI18n, useScene, } from '@pascal-app/core';
4
+ import { ActionButton, ActionGroup, exitCeilingEditToRoom, formatAreaLabel, formatLinearMeasurement, getAreaUnitLabel, holeEditScope, PanelSection, PanelWrapper, SegmentedControl, ShapeChoice, SliderControl, setCeilingHoles, squareMetersToAreaUnit, startOpeningDraft, triggerSFX, useCeilingEditCeilingId, useCeilingEditSession, useEditingHole, useEditor, useInteractionScope, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { Edit, Move, Plus, Trash2 } from 'lucide-react';
7
7
  import { useCallback, useEffect, useRef } from 'react';
8
+ import { CeilingBuildUpSection } from './build-up-section.js';
8
9
  import { CEILING_PANEL_MIN_HEIGHT, ceilingHeightRange, clampCeilingHeight } from './height-bounds.js';
9
10
  /**
10
11
  * Phase 5 Stage E — ceiling inspector (kind-owned).
@@ -15,6 +16,7 @@ import { CEILING_PANEL_MIN_HEIGHT, ceilingHeightRange, clampCeilingHeight } from
15
16
  * panel can collapse into auto-derived groups.
16
17
  */
17
18
  export function CeilingPanel() {
19
+ const i18n = usePascalI18n();
18
20
  const selectedId = useViewer((s) => s.selection.selectedIds[0]);
19
21
  const unit = useViewer((s) => s.unit);
20
22
  const metricNotation = useViewer((s) => s.metricNotation);
@@ -186,38 +188,100 @@ export function CeilingPanel() {
186
188
  // for 8'0" / 8'6" / 9'0" ceilings.
187
189
  const heightPresets = unit === 'imperial'
188
190
  ? [
189
- { label: 'Low (8\'0")', height: 2.4384 },
190
- { label: 'Standard (8\'6")', height: 2.5908 },
191
- { label: 'High (9\'0")', height: 2.7432 },
191
+ {
192
+ label: i18n._({ id: 'node.ceiling.panel.low80', message: 'Low (8\'0")' }),
193
+ height: 2.4384,
194
+ },
195
+ {
196
+ label: i18n._({ id: 'node.ceiling.panel.standard86', message: 'Standard (8\'6")' }),
197
+ height: 2.5908,
198
+ },
199
+ {
200
+ label: i18n._({ id: 'node.ceiling.panel.high90', message: 'High (9\'0")' }),
201
+ height: 2.7432,
202
+ },
192
203
  ]
193
204
  : [
194
- { label: 'Low (2.4m)', height: 2.4 },
195
- { label: 'Standard (2.5m)', height: 2.5 },
196
- { label: 'High (3.0m)', height: 3.0 },
205
+ {
206
+ label: i18n._({ id: 'node.ceiling.panel.low24m', message: 'Low (2.4m)' }),
207
+ height: 2.4,
208
+ },
209
+ {
210
+ label: i18n._({ id: 'node.ceiling.panel.standard25m', message: 'Standard (2.5m)' }),
211
+ height: 2.5,
212
+ },
213
+ {
214
+ label: i18n._({ id: 'node.ceiling.panel.high30m', message: 'High (3.0m)' }),
215
+ height: 3.0,
216
+ },
197
217
  ];
198
- return (_jsxs(PanelWrapper, { icon: "/icons/ceiling.webp", onClose: handleClose, title: node.name || 'Ceiling', width: 320, children: [_jsxs(PanelSection, { title: "Height", children: [_jsx(SegmentedControl, { onChange: handleTopModeChange, options: [
199
- { label: 'Follows level', value: 'storey' },
200
- { label: 'Custom height', value: 'custom' },
201
- ], value: isFollows ? 'storey' : 'custom' }), isFollows ? (_jsxs("div", { className: "px-1 text-[11px] text-muted-foreground", children: ["Currently ", formatLinearMeasurement(resolvedHeight, unit, metricNotation)] })) : (_jsx(SliderControl, { label: "Height", max: Math.min(1000, maxHeight), min: minHeight, onChange: handleHeightChange, precision: 3, step: 0.01, unit: "m", value: node.height ?? resolvedHeight })), _jsx("div", { className: "mt-2 grid grid-cols-3 gap-1.5 px-1 pb-1", children: heightPresets.map((preset) => {
218
+ return (_jsxs(PanelWrapper, { icon: "/icons/ceiling.webp", onClose: handleClose, title: node.name || i18n._({ id: 'node.ceiling.panel.ceiling', message: 'Ceiling' }), width: 320, children: [_jsxs(PanelSection, { title: i18n._({ id: 'node.ceiling.panel.height', message: 'Height' }), children: [_jsx(SegmentedControl, { onChange: handleTopModeChange, options: [
219
+ {
220
+ label: i18n._({ id: 'node.ceiling.panel.followsLevel', message: 'Follows level' }),
221
+ value: 'storey',
222
+ },
223
+ {
224
+ label: i18n._({ id: 'node.ceiling.panel.customHeight', message: 'Custom height' }),
225
+ value: 'custom',
226
+ },
227
+ ], value: isFollows ? 'storey' : 'custom' }), isFollows ? (_jsx("div", { className: "px-1 text-[11px] text-muted-foreground", children: i18n._({
228
+ id: 'node.panel.currently',
229
+ message: 'Currently {value}',
230
+ values: { value: formatLinearMeasurement(resolvedHeight, unit, metricNotation) },
231
+ }) })) : (_jsx(SliderControl, { label: i18n._({ id: 'node.ceiling.panel.height', message: 'Height' }), max: Math.min(1000, maxHeight), min: minHeight, onChange: handleHeightChange, precision: 3, step: 0.01, unit: "m", value: node.height ?? resolvedHeight })), _jsx("div", { className: "mt-2 grid grid-cols-3 gap-1.5 px-1 pb-1", children: heightPresets.map((preset) => {
202
232
  const fits = preset.height <= maxHeight;
203
233
  return (_jsx(ActionButton, { className: fits ? undefined : 'cursor-not-allowed opacity-40', disabled: !fits, label: preset.label, onClick: () => handleHeightChange(preset.height), title: fits
204
234
  ? undefined
205
- : `Taller than this level (${formatLinearMeasurement(maxHeight, unit, metricNotation)} available). Raise the level height first.` }, preset.label));
206
- }) }), Number.isFinite(maxHeight) && (_jsxs("div", { className: "px-1 pb-1 text-[11px] text-muted-foreground", children: ["Limited by the level to ", formatLinearMeasurement(maxHeight, unit, metricNotation), " \u2014 raise the level height for a taller ceiling."] }))] }), _jsx(PanelSection, { title: "Info", children: _jsxs("div", { className: "flex items-center justify-between px-2 py-1 text-muted-foreground text-sm", children: [_jsx("span", { children: "Area" }), _jsxs("span", { className: "font-mono text-foreground dark:text-white", children: [area.toFixed(2), " m\u00B2"] })] }) }), _jsxs(PanelSection, { title: "Holes", children: [node.holes && node.holes.length > 0 ? (_jsx("div", { className: "flex flex-col gap-1 pb-2", children: node.holes.map((hole, index) => {
235
+ : i18n._({
236
+ id: 'node.ceiling.panel.tallerThanLevel',
237
+ message: 'Taller than this level ({available} available). Raise the level height first.',
238
+ values: {
239
+ available: formatLinearMeasurement(maxHeight, unit, metricNotation),
240
+ },
241
+ }) }, preset.label));
242
+ }) }), Number.isFinite(maxHeight) && (_jsx("div", { className: "px-1 pb-1 text-[11px] text-muted-foreground", children: i18n._({
243
+ id: 'node.ceiling.panel.limitedByLevel',
244
+ message: 'Limited by the level to {height} — raise the level height for a taller ceiling.',
245
+ values: { height: formatLinearMeasurement(maxHeight, unit, metricNotation) },
246
+ }) }))] }), _jsx(CeilingBuildUpSection, { node: node, onUpdate: handleUpdate, unit: unit }), _jsx(PanelSection, { title: i18n._({ id: 'node.ceiling.panel.info', message: 'Info' }), children: _jsxs("div", { className: "flex items-center justify-between px-2 py-1 text-muted-foreground text-sm", children: [_jsx("span", { children: i18n._({ id: 'node.ceiling.panel.area', message: 'Area' }) }), _jsx("span", { className: "font-mono text-foreground dark:text-white", children: formatAreaLabel(area, unit, 2) })] }) }), _jsxs(PanelSection, { title: i18n._({ id: 'node.ceiling.panel.holes', message: 'Holes' }), children: [node.holes && node.holes.length > 0 ? (_jsx("div", { className: "flex flex-col gap-1 pb-2", children: node.holes.map((hole, index) => {
207
247
  const holeArea = calculateArea(hole);
208
248
  const isEditing = editingHole?.nodeId === selectedId && editingHole?.holeIndex === index;
209
249
  const source = node.holeMetadata?.[index]?.source ?? 'manual';
210
250
  const isAutoHole = source !== 'manual';
211
- const autoLabel = source === 'elevator' ? 'Auto elevator cutout' : 'Auto stair cutout';
251
+ const autoLabel = source === 'elevator'
252
+ ? i18n._({ id: 'node.cutout.autoElevator', message: 'Auto elevator cutout' })
253
+ : i18n._({ id: 'node.cutout.autoStair', message: 'Auto stair cutout' });
212
254
  return (_jsxs("div", { className: `flex items-center justify-between rounded-lg border p-2 transition-colors ${isEditing
213
255
  ? 'border-primary/50 bg-primary/10'
214
- : 'border-transparent hover:bg-accent/30'}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsxs("p", { className: `font-medium text-xs ${isEditing ? 'text-primary' : 'text-foreground dark:text-white'}`, children: ["Hole ", index + 1, " ", isEditing && '(Editing)'] }), _jsxs("p", { className: "text-[10px] text-muted-foreground", children: [holeArea.toFixed(2), " m\u00B2 \u00B7 ", hole.length, " pts \u00B7", ' ', isAutoHole ? autoLabel : 'Manual'] })] }), _jsx("div", { className: "flex items-center gap-1", children: isEditing ? (_jsx(ActionButton, { className: "h-7 bg-primary text-primary-foreground hover:bg-primary/90", label: "Done", onClick: () => {
256
+ : 'border-transparent hover:bg-accent/30'}`, children: [_jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("p", { className: `font-medium text-xs ${isEditing ? 'text-primary' : 'text-foreground dark:text-white'}`, children: isEditing
257
+ ? i18n._({
258
+ id: 'node.holeEditing',
259
+ message: 'Hole {number} (Editing)',
260
+ values: { number: index + 1 },
261
+ })
262
+ : i18n._({
263
+ id: 'node.holeNumber',
264
+ message: 'Hole {number}',
265
+ values: { number: index + 1 },
266
+ }) }), _jsx("p", { className: "text-[10px] text-muted-foreground", children: i18n._({
267
+ id: 'node.holeSummary',
268
+ message: '{area} {unit} · {count, plural, one {{points} pt} other {{points} pts}} · {source}',
269
+ values: {
270
+ area: formatFixed(squareMetersToAreaUnit(holeArea, unit), 2, i18n.getLocale()),
271
+ unit: getAreaUnitLabel(unit),
272
+ count: hole.length,
273
+ points: String(hole.length),
274
+ source: isAutoHole
275
+ ? autoLabel
276
+ : i18n._({ id: 'node.hole.manual', message: 'Manual' }),
277
+ },
278
+ }) })] }), _jsx("div", { className: "flex items-center gap-1", children: isEditing ? (_jsx(ActionButton, { className: "h-7 bg-primary text-primary-foreground hover:bg-primary/90", label: i18n._({ id: 'node.ceiling.panel.done', message: 'Done' }), onClick: () => {
215
279
  useInteractionScope
216
280
  .getState()
217
281
  .endIf((scope) => scope.kind === 'reshaping' && scope.reshape === 'hole');
218
282
  // A finished opening is a completed action: back to the room.
219
283
  exitCeilingEditToRoom();
220
- } })) : isAutoHole ? (_jsx("div", { className: "rounded-md bg-black/4 dark:bg-[#2C2C2E] px-2 py-1 text-[10px] text-muted-foreground", children: "Auto" })) : canEditHoles ? (_jsxs(_Fragment, { children: [_jsx("button", { className: "flex h-7 w-7 items-center justify-center rounded-md bg-black/4 dark:bg-[#2C2C2E] text-muted-foreground hover:bg-black/8 dark:hover:bg-[#3e3e3e] hover:text-foreground", onClick: () => handleEditHole(index), type: "button", children: _jsx(Edit, { className: "h-3.5 w-3.5" }) }), _jsx("button", { className: "flex h-7 w-7 items-center justify-center rounded-md bg-red-500/10 text-red-600 dark:text-red-400 hover:bg-red-500/20 hover:text-red-700 dark:hover:text-red-300", onClick: () => handleDeleteHole(index), type: "button", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })] })) : null })] }, index));
221
- }) })) : (_jsx("div", { className: "px-2 py-3 text-center text-muted-foreground text-xs", children: "No holes" })), _jsx("div", { className: "px-1 pt-1 pb-1", children: roomZoneId ? (_jsx(ShapeChoice, { className: "px-1 text-muted-foreground text-xs", disabled: !canEditHoles, label: "Cut opening", onPick: (shape) => startOpeningDraft(roomZoneId, 'ceiling', shape) })) : (_jsx(ActionButton, { className: "w-full", disabled: !canEditHoles || editingHole?.nodeId === selectedId, icon: _jsx(Plus, { className: "h-3.5 w-3.5" }), label: "Add Hole", onClick: handleAddHole })) })] }), _jsx(ActionGroup, { children: _jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: "Move", onClick: handleMove }) })] }));
284
+ } })) : isAutoHole ? (_jsx("div", { className: "rounded-md bg-black/4 dark:bg-[#2C2C2E] px-2 py-1 text-[10px] text-muted-foreground", children: i18n._({ id: 'node.ceiling.panel.auto', message: 'Auto' }) })) : canEditHoles ? (_jsxs(_Fragment, { children: [_jsx("button", { className: "flex h-7 w-7 items-center justify-center rounded-md bg-black/4 dark:bg-[#2C2C2E] text-muted-foreground hover:bg-black/8 dark:hover:bg-[#3e3e3e] hover:text-foreground", onClick: () => handleEditHole(index), type: "button", children: _jsx(Edit, { className: "h-3.5 w-3.5" }) }), _jsx("button", { className: "flex h-7 w-7 items-center justify-center rounded-md bg-red-500/10 text-red-600 dark:text-red-400 hover:bg-red-500/20 hover:text-red-700 dark:hover:text-red-300", onClick: () => handleDeleteHole(index), type: "button", children: _jsx(Trash2, { className: "h-3.5 w-3.5" }) })] })) : null })] }, index));
285
+ }) })) : (_jsx("div", { className: "px-2 py-3 text-center text-muted-foreground text-xs", children: i18n._({ id: 'node.ceiling.panel.noHoles', message: 'No holes' }) })), _jsx("div", { className: "px-1 pt-1 pb-1", children: roomZoneId ? (_jsx(ShapeChoice, { className: "px-1 text-muted-foreground text-xs", disabled: !canEditHoles, label: i18n._({ id: 'node.ceiling.panel.cutOpening', message: 'Cut opening' }), onPick: (shape) => startOpeningDraft(roomZoneId, 'ceiling', shape) })) : (_jsx(ActionButton, { className: "w-full", disabled: !canEditHoles || editingHole?.nodeId === selectedId, icon: _jsx(Plus, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.ceiling.panel.addHole', message: 'Add Hole' }), onClick: handleAddHole })) })] }), _jsx(ActionGroup, { children: _jsx(ActionButton, { icon: _jsx(Move, { className: "h-3.5 w-3.5" }), label: i18n._({ id: 'node.ceiling.panel.move', message: 'Move' }), onClick: handleMove }) })] }));
222
286
  }
223
287
  export default CeilingPanel;
@@ -1 +1 @@
1
- {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ceiling/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EAOjB,MAAM,kBAAkB,CAAA;AAoBzB,eAAO,MAAM,eAAe,aAAc;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,gCAiJ9D,CAAA;eAEc,eAAe"}
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../src/ceiling/renderer.tsx"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,WAAW,EAOjB,MAAM,kBAAkB,CAAA;AA6BzB,eAAO,MAAM,eAAe,aAAc;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,gCA6J9D,CAAA;eAEc,eAAe"}
@@ -1,14 +1,16 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { CEILING_DRAW_OFFSET, CEILING_SLOT_DEFAULT_COLOR, ceilingPaintRegions, resolveCeilingHeight, resolveMaterial, useLiveTransforms, useRegistry, useScene, } from '@pascal-app/core';
4
- import { CEILING_REGION_MESH, createSurfaceRoleMaterial, NodeRenderer, resolveSurfaceColor, useLibraryMaterialsVersion, useNodeEvents, useViewer, } from '@pascal-app/viewer';
4
+ import { CEILING_CAP_MESH, CEILING_REGION_MESH, createSurfaceRoleMaterial, NodeRenderer, resolveSurfaceColor, useLibraryMaterialsVersion, useNodeEvents, useViewer, } from '@pascal-app/viewer';
5
5
  import { useCallback, useEffect, useLayoutEffect, useMemo, useRef } from 'react';
6
- import { BackSide } from 'three/webgpu';
6
+ import { BackSide, FrontSide } from 'three/webgpu';
7
7
  import { createPlaceholderGeometry } from '../shared/placeholder-geometry.js';
8
- import { ceilingColorFromRef, getCeilingMaterials, resolveCeilingFinish } from './materials.js';
8
+ import { ceilingColorFromRef, getCeilingCapMaterial, getCeilingMaterials, resolveCeilingFinish, } from './materials.js';
9
9
  function createEmptyGeometry() {
10
10
  return createPlaceholderGeometry();
11
11
  }
12
+ // The cap is only seen: a click from above still reaches what it reached without it.
13
+ const noopRaycast = () => { };
12
14
  export const CeilingRenderer = ({ node }) => {
13
15
  const ref = useRef(null);
14
16
  const handlers = useNodeEvents(node, 'ceiling');
@@ -29,6 +31,7 @@ export const CeilingRenderer = ({ node }) => {
29
31
  const libraryMaterialsVersion = useLibraryMaterialsVersion();
30
32
  const colorPreset = useViewer((s) => s.colorPreset);
31
33
  const sceneTheme = useViewer((s) => s.sceneTheme);
34
+ const showTop = useViewer((s) => s.showCeilingTops);
32
35
  // Subscribe to the scene-material library so editing a `scene:` material the
33
36
  // ceiling slot references re-tints it live.
34
37
  const sceneMaterials = useScene((s) => s.materials);
@@ -57,11 +60,13 @@ export const CeilingRenderer = ({ node }) => {
57
60
  // revealed (placing a ceiling-hosted item, or selecting one of its
58
61
  // children). Without that the top mesh would ship an opaque surface-role
59
62
  // material and a top-down camera would lose everything under the ceiling.
63
+ // The opaque top is the cap's, drawn only while the viewer shows ceiling tops.
60
64
  if (!textures) {
61
65
  const ceilingColor = resolveSurfaceColor('ceiling', colorPreset, sceneTheme);
62
66
  return {
63
67
  topMaterial: getCeilingMaterials(ceilingColor).topMaterial,
64
68
  bottomMaterial: createSurfaceRoleMaterial('ceiling', colorPreset, BackSide, sceneTheme),
69
+ capMaterial: createSurfaceRoleMaterial('ceiling', colorPreset, FrontSide, sceneTheme),
65
70
  };
66
71
  }
67
72
  // The grid remains transparent from above; only the room-facing material
@@ -72,6 +77,7 @@ export const CeilingRenderer = ({ node }) => {
72
77
  const fallback = getCeilingMaterials(gridColor, shading);
73
78
  return {
74
79
  topMaterial: fallback.topMaterial,
80
+ capMaterial: getCeilingCapMaterial(gridColor, shading),
75
81
  bottomMaterial: resolveCeilingFinish(node.slots?.surface, sceneMaterials, shading) ??
76
82
  resolveCeilingFinish(node.materialPreset, sceneMaterials, shading) ??
77
83
  resolveCeilingFinish(node.material, sceneMaterials, shading) ??
@@ -122,6 +128,6 @@ export const CeilingRenderer = ({ node }) => {
122
128
  builtRegionsKey.current = regionsKey;
123
129
  useScene.getState().markDirty(node.id);
124
130
  }, [node.id, regionsKey]);
125
- return (_jsxs("mesh", { castShadow: true, receiveShadow: true, geometry: placeholderGeometry, material: materials.bottomMaterial, position: position, ref: ref, visible: node.visible !== false, ...handlers, children: [_jsx("mesh", { geometry: gridPlaceholderGeometry, material: materials.topMaterial, name: "ceiling-grid", scale: 0, visible: false }), (node.children ?? []).map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId)))] }));
131
+ return (_jsxs("mesh", { castShadow: true, receiveShadow: true, geometry: placeholderGeometry, material: materials.bottomMaterial, position: position, ref: ref, visible: node.visible !== false, ...handlers, children: [_jsx("mesh", { geometry: gridPlaceholderGeometry, material: materials.topMaterial, name: "ceiling-grid", scale: 0, visible: false }), _jsx("mesh", { geometry: gridPlaceholderGeometry, material: materials.capMaterial, name: CEILING_CAP_MESH, raycast: noopRaycast, receiveShadow: true, visible: showTop }), (node.children ?? []).map((childId) => (_jsx(NodeRenderer, { nodeId: childId }, childId)))] }));
126
132
  };
127
133
  export default CeilingRenderer;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/ceiling/tool.tsx"],"names":[],"mappings":"AAqDA,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAuW/B,CAAA;eAEc,WAAW"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../src/ceiling/tool.tsx"],"names":[],"mappings":"AAsDA,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EA2X/B,CAAA;eAEc,WAAW"}
@@ -1,7 +1,7 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { DEFAULT_ANGLE_STEP, emitter, snapPointAlongAngleRay, snapPointToGrid, useScene, } from '@pascal-app/core';
4
- import { CursorSphere, clearCeilingSnapFeedback, EDITOR_LAYER, isAngleSnapActive, isGridSnapActive, markToolCancelConsumed, resolveCeilingPlanPointSnap, triggerSFX, useEditor, useFloorplanDraftPreview, } from '@pascal-app/editor';
4
+ import { CursorSphere, clearCeilingSnapFeedback, EDITOR_LAYER, isAngleSnapActive, isGridSnapActive, markToolCancelConsumed, resolveCeilingPlanPointSnap, triggerSFX, useEditor, useFloorplanDraftPreview, visibleScene, } from '@pascal-app/editor';
5
5
  import { useViewer } from '@pascal-app/viewer';
6
6
  import { useEffect, useMemo, useRef, useState } from 'react';
7
7
  import { BufferGeometry, DoubleSide, Shape, Vector3 } from 'three';
@@ -62,6 +62,22 @@ export const CeilingTool = () => {
62
62
  }
63
63
  draftPreview.setCursorPoint(null);
64
64
  }, []);
65
+ // The plan keeps its own copy of the corners, started empty on every view change, and finishes a
66
+ // polygon in 2D-only view without this tool. Corners kept here once the plan shows (from split
67
+ // or 3D-only view) would close a different polygon than the one the plan draws.
68
+ useEffect(() => {
69
+ let shownScene = visibleScene(useEditor.getState());
70
+ return useEditor.subscribe((state) => {
71
+ const nextScene = visibleScene(state);
72
+ if (nextScene === shownScene)
73
+ return;
74
+ shownScene = nextScene;
75
+ if (nextScene === '3d')
76
+ return;
77
+ setPoints([]);
78
+ clearCeilingSnapFeedback();
79
+ });
80
+ }, []);
65
81
  const verticalGeo = useMemo(() => new BufferGeometry().setFromPoints([
66
82
  new Vector3(0, 0, 0),
67
83
  new Vector3(0, CEILING_HEIGHT - GRID_OFFSET, 0),
@@ -70,8 +86,12 @@ export const CeilingTool = () => {
70
86
  useEffect(() => {
71
87
  if (!currentLevelId)
72
88
  return;
89
+ // In 2D-only view the plan drafts and commits the ceiling; this tool, mounted behind the
90
+ // hidden canvas from an earlier visit, still hears the plan's grid events, so it stands aside
91
+ // (it made every ceiling twice).
92
+ const planOwnsInput = () => visibleScene(useEditor.getState()) === '2d';
73
93
  const onGridMove = (event) => {
74
- if (!(cursorRef.current && gridCursorRef.current))
94
+ if (!(cursorRef.current && gridCursorRef.current) || planOwnsInput())
75
95
  return;
76
96
  const rawPoint = [event.localPosition[0], event.localPosition[2]];
77
97
  // Honour the active snapping mode: grid lattice + 15° angle lock are each
@@ -107,7 +127,7 @@ export const CeilingTool = () => {
107
127
  }
108
128
  };
109
129
  const onGridClick = (_event) => {
110
- if (!currentLevelId)
130
+ if (!currentLevelId || planOwnsInput())
111
131
  return;
112
132
  const clickPoint = previousSnappedPointRef.current ?? cursorPosition;
113
133
  const firstPoint = points[0];
@@ -128,7 +148,7 @@ export const CeilingTool = () => {
128
148
  }
129
149
  };
130
150
  const onGridDoubleClick = (_event) => {
131
- if (!currentLevelId)
151
+ if (!currentLevelId || planOwnsInput())
132
152
  return;
133
153
  if (points.length >= 3) {
134
154
  const ceilingId = commitCeilingDrawing(currentLevelId, points);
@@ -1 +1 @@
1
- {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chimney/panel.tsx"],"names":[],"mappings":"AAkDA,MAAM,CAAC,OAAO,UAAU,YAAY,uCAs1BnC"}
1
+ {"version":3,"file":"panel.d.ts","sourceRoot":"","sources":["../../src/chimney/panel.tsx"],"names":[],"mappings":"AA6DA,MAAM,CAAC,OAAO,UAAU,YAAY,uCAy5BnC"}