@pascal-app/nodes 1.0.1 → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (867) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +22 -4
  3. package/dist/block/face-host.d.ts.map +1 -1
  4. package/dist/block/face-host.js +19 -2
  5. package/dist/block/floorplan.d.ts +11 -1
  6. package/dist/block/floorplan.d.ts.map +1 -1
  7. package/dist/block/floorplan.js +81 -13
  8. package/dist/block/geometry.d.ts +2 -2
  9. package/dist/block/geometry.d.ts.map +1 -1
  10. package/dist/block/geometry.js +39 -24
  11. package/dist/block/hosted-edit.d.ts +13 -0
  12. package/dist/block/hosted-edit.d.ts.map +1 -0
  13. package/dist/block/hosted-edit.js +230 -0
  14. package/dist/block/last-operation.d.ts +1 -1
  15. package/dist/block/last-operation.d.ts.map +1 -1
  16. package/dist/block/last-operation.js +6 -4
  17. package/dist/block/material-slots.d.ts +1 -3
  18. package/dist/block/material-slots.d.ts.map +1 -1
  19. package/dist/block/material-slots.js +1 -11
  20. package/dist/block/modal-session.d.ts +2 -1
  21. package/dist/block/modal-session.d.ts.map +1 -1
  22. package/dist/block/modal-session.js +2 -2
  23. package/dist/block/paint.d.ts.map +1 -1
  24. package/dist/block/paint.js +4 -10
  25. package/dist/block/panel.d.ts.map +1 -1
  26. package/dist/block/panel.js +8 -3
  27. package/dist/block/selection.d.ts.map +1 -1
  28. package/dist/block/selection.js +83 -25
  29. package/dist/block/surface.d.ts +4 -0
  30. package/dist/block/surface.d.ts.map +1 -0
  31. package/dist/block/surface.js +54 -0
  32. package/dist/block/use-block-face-operation.d.ts +2 -2
  33. package/dist/block/use-block-face-operation.d.ts.map +1 -1
  34. package/dist/block/use-block-face-operation.js +25 -11
  35. package/dist/box-vent/definition.d.ts.map +1 -1
  36. package/dist/box-vent/definition.js +3 -5
  37. package/dist/box-vent/panel.d.ts.map +1 -1
  38. package/dist/box-vent/panel.js +5 -28
  39. package/dist/building/renderer.d.ts.map +1 -1
  40. package/dist/building/renderer.js +1 -1
  41. package/dist/cabinet/countertop-layout.d.ts +13 -2
  42. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  43. package/dist/cabinet/definition.d.ts.map +1 -1
  44. package/dist/cabinet/definition.js +4 -3
  45. package/dist/cabinet/floorplan.d.ts.map +1 -1
  46. package/dist/cabinet/floorplan.js +125 -28
  47. package/dist/cabinet/geometry/shared.d.ts +1 -2
  48. package/dist/cabinet/geometry/shared.d.ts.map +1 -1
  49. package/dist/cabinet/geometry/shared.js +1 -2
  50. package/dist/cabinet/hosted-resize.d.ts +3 -6
  51. package/dist/cabinet/hosted-resize.d.ts.map +1 -1
  52. package/dist/cabinet/hosted-resize.js +9 -153
  53. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  54. package/dist/cabinet/placement-snap.js +4 -2
  55. package/dist/cabinet/run-layout.d.ts.map +1 -1
  56. package/dist/cabinet/run-layout.js +8 -5
  57. package/dist/cabinet/run-ops.d.ts +13 -2
  58. package/dist/cabinet/run-ops.d.ts.map +1 -1
  59. package/dist/cabinet/surfaces.d.ts +1 -0
  60. package/dist/cabinet/surfaces.d.ts.map +1 -1
  61. package/dist/cabinet/surfaces.js +13 -1
  62. package/dist/cabinet/tool.d.ts.map +1 -1
  63. package/dist/cabinet/tool.js +30 -28
  64. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  65. package/dist/cabinet/wall-snap.js +8 -8
  66. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  67. package/dist/ceiling/boundary-editor.js +5 -3
  68. package/dist/ceiling/definition.d.ts +4 -4
  69. package/dist/ceiling/definition.d.ts.map +1 -1
  70. package/dist/ceiling/definition.js +20 -15
  71. package/dist/ceiling/floorplan-affordances.d.ts +84 -4
  72. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  73. package/dist/ceiling/floorplan-affordances.js +0 -1
  74. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  75. package/dist/ceiling/floorplan-move.js +0 -1
  76. package/dist/ceiling/floorplan.d.ts +1 -1
  77. package/dist/ceiling/floorplan.d.ts.map +1 -1
  78. package/dist/ceiling/floorplan.js +2 -1
  79. package/dist/ceiling/height-bounds.d.ts +19 -0
  80. package/dist/ceiling/height-bounds.d.ts.map +1 -0
  81. package/dist/ceiling/height-bounds.js +24 -0
  82. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  83. package/dist/ceiling/hole-editor.js +3 -4
  84. package/dist/ceiling/materials.d.ts +1 -1
  85. package/dist/ceiling/materials.d.ts.map +1 -1
  86. package/dist/ceiling/materials.js +10 -3
  87. package/dist/ceiling/paint.d.ts +2 -8
  88. package/dist/ceiling/paint.d.ts.map +1 -1
  89. package/dist/ceiling/paint.js +121 -24
  90. package/dist/ceiling/panel.d.ts.map +1 -1
  91. package/dist/ceiling/panel.js +40 -23
  92. package/dist/ceiling/renderer.d.ts.map +1 -1
  93. package/dist/ceiling/renderer.js +43 -6
  94. package/dist/chimney/definition.d.ts.map +1 -1
  95. package/dist/chimney/definition.js +1 -0
  96. package/dist/chimney/move-tool.d.ts.map +1 -1
  97. package/dist/chimney/move-tool.js +8 -2
  98. package/dist/chimney/paint.d.ts.map +1 -1
  99. package/dist/chimney/paint.js +3 -10
  100. package/dist/column/definition.d.ts.map +1 -1
  101. package/dist/column/definition.js +34 -5
  102. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  103. package/dist/column/floorplan-affordances.js +11 -1
  104. package/dist/column/floorplan.d.ts +1 -1
  105. package/dist/column/floorplan.d.ts.map +1 -1
  106. package/dist/column/floorplan.js +69 -12
  107. package/dist/column/hosted-resize.d.ts +215 -0
  108. package/dist/column/hosted-resize.d.ts.map +1 -0
  109. package/dist/column/hosted-resize.js +9 -0
  110. package/dist/column/panel.d.ts.map +1 -1
  111. package/dist/column/panel.js +153 -149
  112. package/dist/column/renderer.d.ts.map +1 -1
  113. package/dist/column/renderer.js +29 -105
  114. package/dist/column/shape.d.ts +22 -0
  115. package/dist/column/shape.d.ts.map +1 -0
  116. package/dist/column/shape.js +120 -0
  117. package/dist/column/surface.d.ts +4 -0
  118. package/dist/column/surface.d.ts.map +1 -0
  119. package/dist/column/surface.js +73 -0
  120. package/dist/construction-dimension/floorplan.js +7 -3
  121. package/dist/cupola/definition.d.ts.map +1 -1
  122. package/dist/cupola/definition.js +3 -8
  123. package/dist/cupola/panel.d.ts.map +1 -1
  124. package/dist/cupola/panel.js +5 -23
  125. package/dist/door/definition.d.ts.map +1 -1
  126. package/dist/door/definition.js +52 -4
  127. package/dist/door/door-math.d.ts +6 -11
  128. package/dist/door/door-math.d.ts.map +1 -1
  129. package/dist/door/door-math.js +13 -17
  130. package/dist/door/floorplan-affordances.d.ts.map +1 -1
  131. package/dist/door/floorplan-affordances.js +8 -12
  132. package/dist/door/floorplan-move.d.ts.map +1 -1
  133. package/dist/door/floorplan-move.js +3 -1
  134. package/dist/door/floorplan.d.ts.map +1 -1
  135. package/dist/door/floorplan.js +55 -21
  136. package/dist/door/mechanism.d.ts +4 -0
  137. package/dist/door/mechanism.d.ts.map +1 -0
  138. package/dist/door/mechanism.js +24 -0
  139. package/dist/door/move-tool.d.ts.map +1 -1
  140. package/dist/door/move-tool.js +75 -52
  141. package/dist/door/paint.d.ts.map +1 -1
  142. package/dist/door/paint.js +3 -0
  143. package/dist/door/panel.d.ts.map +1 -1
  144. package/dist/door/panel.js +54 -308
  145. package/dist/door/placement.d.ts +45 -0
  146. package/dist/door/placement.d.ts.map +1 -0
  147. package/dist/door/placement.js +51 -0
  148. package/dist/door/preview.d.ts.map +1 -1
  149. package/dist/door/preview.js +2 -0
  150. package/dist/door/renderer.d.ts.map +1 -1
  151. package/dist/door/renderer.js +3 -2
  152. package/dist/door/tool.d.ts.map +1 -1
  153. package/dist/door/tool.js +112 -23
  154. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  155. package/dist/dormer/csg-geometry.js +2 -0
  156. package/dist/dormer/definition.d.ts.map +1 -1
  157. package/dist/dormer/definition.js +1 -0
  158. package/dist/dormer/paint.d.ts.map +1 -1
  159. package/dist/dormer/paint.js +2 -5
  160. package/dist/dormer/panel.d.ts.map +1 -1
  161. package/dist/dormer/panel.js +4 -14
  162. package/dist/downspout/definition.d.ts.map +1 -1
  163. package/dist/downspout/definition.js +3 -2
  164. package/dist/duct-fitting/definition.d.ts.map +1 -1
  165. package/dist/duct-fitting/definition.js +2 -1
  166. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  167. package/dist/duct-fitting/geometry.js +1 -1
  168. package/dist/duct-fitting/move-tool.d.ts.map +1 -1
  169. package/dist/duct-fitting/move-tool.js +8 -2
  170. package/dist/duct-segment/definition.d.ts.map +1 -1
  171. package/dist/duct-segment/definition.js +2 -2
  172. package/dist/duct-segment/geometry.d.ts.map +1 -1
  173. package/dist/duct-segment/geometry.js +1 -1
  174. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  175. package/dist/duct-segment/move-tool.js +8 -2
  176. package/dist/duct-segment/tool.d.ts.map +1 -1
  177. package/dist/duct-segment/tool.js +11 -0
  178. package/dist/duct-terminal/tool.d.ts.map +1 -1
  179. package/dist/duct-terminal/tool.js +77 -8
  180. package/dist/elevator/definition.d.ts.map +1 -1
  181. package/dist/elevator/definition.js +3 -2
  182. package/dist/elevator/panel.d.ts.map +1 -1
  183. package/dist/elevator/panel.js +5 -27
  184. package/dist/elevator/parametrics.d.ts.map +1 -1
  185. package/dist/elevator/parametrics.js +98 -1
  186. package/dist/elevator/renderer.d.ts.map +1 -1
  187. package/dist/elevator/renderer.js +3 -4
  188. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  189. package/dist/eyebrow-vent/definition.js +3 -5
  190. package/dist/eyebrow-vent/paint.d.ts.map +1 -1
  191. package/dist/eyebrow-vent/paint.js +3 -6
  192. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  193. package/dist/eyebrow-vent/panel.js +5 -23
  194. package/dist/fence/actions/move-endpoint.d.ts +1 -1
  195. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  196. package/dist/fence/actions/move-endpoint.js +2 -1
  197. package/dist/fence/definition.d.ts +2 -1
  198. package/dist/fence/definition.d.ts.map +1 -1
  199. package/dist/fence/definition.js +84 -28
  200. package/dist/fence/drafting.d.ts +36 -0
  201. package/dist/fence/drafting.d.ts.map +1 -0
  202. package/dist/fence/drafting.js +210 -0
  203. package/dist/fence/feature-tool.d.ts +4 -0
  204. package/dist/fence/feature-tool.d.ts.map +1 -0
  205. package/dist/fence/feature-tool.js +140 -0
  206. package/dist/fence/features.d.ts +2 -0
  207. package/dist/fence/features.d.ts.map +1 -0
  208. package/dist/fence/features.js +12 -0
  209. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  210. package/dist/fence/floorplan-affordances.js +2 -1
  211. package/dist/fence/floorplan.d.ts +2 -3
  212. package/dist/fence/floorplan.d.ts.map +1 -1
  213. package/dist/fence/floorplan.js +131 -71
  214. package/dist/fence/geometry-parts.d.ts +50 -0
  215. package/dist/fence/geometry-parts.d.ts.map +1 -0
  216. package/dist/fence/geometry-parts.js +1144 -0
  217. package/dist/fence/geometry.d.ts +2 -3
  218. package/dist/fence/geometry.d.ts.map +1 -1
  219. package/dist/fence/geometry.js +84 -7
  220. package/dist/fence/index.d.ts +1 -0
  221. package/dist/fence/index.d.ts.map +1 -1
  222. package/dist/fence/index.js +1 -0
  223. package/dist/fence/inspector-editors.d.ts +15 -0
  224. package/dist/fence/inspector-editors.d.ts.map +1 -1
  225. package/dist/fence/inspector-editors.js +128 -3
  226. package/dist/fence/lift.d.ts.map +1 -1
  227. package/dist/fence/lift.js +5 -2
  228. package/dist/fence/move-tool.js +2 -1
  229. package/dist/fence/panel-model.d.ts +4 -0
  230. package/dist/fence/panel-model.d.ts.map +1 -0
  231. package/dist/fence/panel-model.js +12 -0
  232. package/dist/fence/parametrics.d.ts +0 -12
  233. package/dist/fence/parametrics.d.ts.map +1 -1
  234. package/dist/fence/parametrics.js +185 -18
  235. package/dist/fence/system.d.ts.map +1 -1
  236. package/dist/fence/system.js +141 -31
  237. package/dist/fence/tool.d.ts.map +1 -1
  238. package/dist/fence/tool.js +257 -48
  239. package/dist/fence-feature/actions.d.ts +7 -0
  240. package/dist/fence-feature/actions.d.ts.map +1 -0
  241. package/dist/fence-feature/actions.js +26 -0
  242. package/dist/fence-feature/definition.d.ts +4 -0
  243. package/dist/fence-feature/definition.d.ts.map +1 -0
  244. package/dist/fence-feature/definition.js +112 -0
  245. package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
  246. package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
  247. package/dist/fence-feature/floorplan-affordances.js +37 -0
  248. package/dist/fence-feature/floorplan.d.ts +4 -0
  249. package/dist/fence-feature/floorplan.d.ts.map +1 -0
  250. package/dist/fence-feature/floorplan.js +120 -0
  251. package/dist/fence-feature/geometry.d.ts +5 -0
  252. package/dist/fence-feature/geometry.d.ts.map +1 -0
  253. package/dist/fence-feature/geometry.js +43 -0
  254. package/dist/fence-feature/handles.d.ts +5 -0
  255. package/dist/fence-feature/handles.d.ts.map +1 -0
  256. package/dist/fence-feature/handles.js +84 -0
  257. package/dist/fence-feature/inspector.d.ts +6 -0
  258. package/dist/fence-feature/inspector.d.ts.map +1 -0
  259. package/dist/fence-feature/inspector.js +214 -0
  260. package/dist/fence-feature/interaction.d.ts +3 -0
  261. package/dist/fence-feature/interaction.d.ts.map +1 -0
  262. package/dist/fence-feature/interaction.js +41 -0
  263. package/dist/fence-feature/move-session.d.ts +9 -0
  264. package/dist/fence-feature/move-session.d.ts.map +1 -0
  265. package/dist/fence-feature/move-session.js +48 -0
  266. package/dist/fence-feature/move-tool.d.ts +5 -0
  267. package/dist/fence-feature/move-tool.d.ts.map +1 -0
  268. package/dist/fence-feature/move-tool.js +58 -0
  269. package/dist/fence-feature/pick-target.d.ts +7 -0
  270. package/dist/fence-feature/pick-target.d.ts.map +1 -0
  271. package/dist/fence-feature/pick-target.js +52 -0
  272. package/dist/floor-opening/definition.d.ts +3 -0
  273. package/dist/floor-opening/definition.d.ts.map +1 -0
  274. package/dist/floor-opening/definition.js +41 -0
  275. package/dist/floor-opening/floorplan.d.ts +156 -0
  276. package/dist/floor-opening/floorplan.d.ts.map +1 -0
  277. package/dist/floor-opening/floorplan.js +63 -0
  278. package/dist/guide/definition.d.ts.map +1 -1
  279. package/dist/guide/definition.js +1 -0
  280. package/dist/gutter/definition.d.ts.map +1 -1
  281. package/dist/gutter/definition.js +3 -2
  282. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  283. package/dist/hvac-equipment/tool.js +8 -2
  284. package/dist/imported-mesh/definition.d.ts.map +1 -1
  285. package/dist/imported-mesh/definition.js +2 -0
  286. package/dist/imported-mesh/geometry.d.ts +1 -1
  287. package/dist/imported-mesh/geometry.d.ts.map +1 -1
  288. package/dist/imported-mesh/geometry.js +40 -12
  289. package/dist/index.d.ts +13 -2
  290. package/dist/index.d.ts.map +1 -1
  291. package/dist/index.js +20 -2
  292. package/dist/item/authored-face-host.d.ts +10 -0
  293. package/dist/item/authored-face-host.d.ts.map +1 -0
  294. package/dist/item/authored-face-host.js +87 -0
  295. package/dist/item/authored-params.d.ts +15 -0
  296. package/dist/item/authored-params.d.ts.map +1 -0
  297. package/dist/item/authored-params.js +72 -0
  298. package/dist/item/definition.d.ts +2 -2
  299. package/dist/item/definition.d.ts.map +1 -1
  300. package/dist/item/definition.js +35 -4
  301. package/dist/item/floorplan-move.d.ts.map +1 -1
  302. package/dist/item/floorplan-move.js +209 -130
  303. package/dist/item/floorplan.d.ts +22 -0
  304. package/dist/item/floorplan.d.ts.map +1 -1
  305. package/dist/item/floorplan.js +95 -6
  306. package/dist/item/index.d.ts +1 -0
  307. package/dist/item/index.d.ts.map +1 -1
  308. package/dist/item/index.js +1 -0
  309. package/dist/item/model-loader.d.ts +2 -0
  310. package/dist/item/model-loader.d.ts.map +1 -1
  311. package/dist/item/model-loader.js +55 -23
  312. package/dist/item/move-tool.d.ts +1 -1
  313. package/dist/item/move-tool.d.ts.map +1 -1
  314. package/dist/item/move-tool.js +19 -11
  315. package/dist/item/paint.d.ts.map +1 -1
  316. package/dist/item/paint.js +5 -24
  317. package/dist/item/panel.d.ts +1 -3
  318. package/dist/item/panel.d.ts.map +1 -1
  319. package/dist/item/panel.js +20 -24
  320. package/dist/item/placement-notice.d.ts +14 -0
  321. package/dist/item/placement-notice.d.ts.map +1 -0
  322. package/dist/item/placement-notice.js +38 -0
  323. package/dist/item/plan-symbols.d.ts +67 -0
  324. package/dist/item/plan-symbols.d.ts.map +1 -0
  325. package/dist/item/plan-symbols.js +407 -0
  326. package/dist/item/renderer.d.ts +10 -0
  327. package/dist/item/renderer.d.ts.map +1 -1
  328. package/dist/item/renderer.js +72 -40
  329. package/dist/item/script-param-defaults.d.ts +12 -0
  330. package/dist/item/script-param-defaults.d.ts.map +1 -0
  331. package/dist/item/script-param-defaults.js +34 -0
  332. package/dist/lean-to-extension/definition.d.ts.map +1 -1
  333. package/dist/lean-to-extension/definition.js +1 -2
  334. package/dist/lean-to-extension/geometry.d.ts.map +1 -1
  335. package/dist/lean-to-extension/geometry.js +1 -1
  336. package/dist/lean-to-extension/layout.d.ts.map +1 -1
  337. package/dist/lean-to-extension/layout.js +2 -3
  338. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
  339. package/dist/lean-to-extension/placement-validation.js +5 -5
  340. package/dist/lean-to-extension/tool.d.ts.map +1 -1
  341. package/dist/lean-to-extension/tool.js +5 -5
  342. package/dist/level/renderer.js +1 -1
  343. package/dist/lineset/move-tool.d.ts.map +1 -1
  344. package/dist/lineset/move-tool.js +8 -2
  345. package/dist/lineset/tool.d.ts.map +1 -1
  346. package/dist/lineset/tool.js +1 -0
  347. package/dist/liquid-line/move-tool.d.ts.map +1 -1
  348. package/dist/liquid-line/move-tool.js +8 -2
  349. package/dist/liquid-line/tool.d.ts.map +1 -1
  350. package/dist/liquid-line/tool.js +5 -1
  351. package/dist/measurement/definition.d.ts.map +1 -1
  352. package/dist/measurement/definition.js +2 -1
  353. package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
  354. package/dist/pipe-fitting/move-tool.js +8 -2
  355. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  356. package/dist/pipe-segment/move-tool.js +8 -2
  357. package/dist/pipe-segment/tool.d.ts.map +1 -1
  358. package/dist/pipe-segment/tool.js +14 -3
  359. package/dist/pipe-trap/tool.d.ts.map +1 -1
  360. package/dist/pipe-trap/tool.js +7 -8
  361. package/dist/procedural-item/animation.d.ts +8 -0
  362. package/dist/procedural-item/animation.d.ts.map +1 -0
  363. package/dist/procedural-item/animation.js +116 -0
  364. package/dist/procedural-item/definition.d.ts.map +1 -1
  365. package/dist/procedural-item/definition.js +77 -8
  366. package/dist/procedural-item/geometry.d.ts +5 -1
  367. package/dist/procedural-item/geometry.d.ts.map +1 -1
  368. package/dist/procedural-item/geometry.js +239 -15
  369. package/dist/procedural-item/renderer.d.ts.map +1 -1
  370. package/dist/procedural-item/renderer.js +272 -23
  371. package/dist/ridge-vent/definition.d.ts.map +1 -1
  372. package/dist/ridge-vent/definition.js +1 -0
  373. package/dist/ridge-vent/panel.d.ts.map +1 -1
  374. package/dist/ridge-vent/panel.js +5 -23
  375. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  376. package/dist/ridge-vent/renderer.js +9 -8
  377. package/dist/roof/definition.d.ts.map +1 -1
  378. package/dist/roof/definition.js +8 -2
  379. package/dist/roof/floorplan.d.ts +8 -0
  380. package/dist/roof/floorplan.d.ts.map +1 -1
  381. package/dist/roof/floorplan.js +194 -18
  382. package/dist/roof/panel-model.d.ts +4 -0
  383. package/dist/roof/panel-model.d.ts.map +1 -0
  384. package/dist/roof/panel-model.js +155 -0
  385. package/dist/roof/panel.d.ts.map +1 -1
  386. package/dist/roof/panel.js +5 -13
  387. package/dist/roof/parametrics.d.ts.map +1 -1
  388. package/dist/roof/parametrics.js +16 -1
  389. package/dist/roof/renderer.d.ts.map +1 -1
  390. package/dist/roof/renderer.js +5 -2
  391. package/dist/roof-segment/definition.d.ts.map +1 -1
  392. package/dist/roof-segment/definition.js +1 -0
  393. package/dist/roof-segment/panel.d.ts.map +1 -1
  394. package/dist/roof-segment/panel.js +5 -24
  395. package/dist/roof-segment/parametrics.d.ts.map +1 -1
  396. package/dist/roof-segment/parametrics.js +176 -1
  397. package/dist/roof-segment/renderer.d.ts.map +1 -1
  398. package/dist/roof-segment/renderer.js +17 -8
  399. package/dist/scan/definition.d.ts.map +1 -1
  400. package/dist/scan/definition.js +1 -0
  401. package/dist/separator/definition.d.ts +3 -0
  402. package/dist/separator/definition.d.ts.map +1 -0
  403. package/dist/separator/definition.js +39 -0
  404. package/dist/separator/renderer.d.ts +5 -0
  405. package/dist/separator/renderer.d.ts.map +1 -0
  406. package/dist/separator/renderer.js +36 -0
  407. package/dist/shared/commit-opening-move.d.ts +4 -0
  408. package/dist/shared/commit-opening-move.d.ts.map +1 -0
  409. package/dist/shared/commit-opening-move.js +9 -0
  410. package/dist/shared/curtain-opening-limits.d.ts +14 -0
  411. package/dist/shared/curtain-opening-limits.d.ts.map +1 -0
  412. package/dist/shared/curtain-opening-limits.js +53 -0
  413. package/dist/shared/draft-axis-guides.d.ts +0 -6
  414. package/dist/shared/draft-axis-guides.d.ts.map +1 -1
  415. package/dist/shared/draft-axis-guides.js +1 -8
  416. package/dist/shared/duct-body-paint.d.ts +0 -4
  417. package/dist/shared/duct-body-paint.d.ts.map +1 -1
  418. package/dist/shared/duct-body-paint.js +1 -5
  419. package/dist/shared/hosted-resize.d.ts +12 -0
  420. package/dist/shared/hosted-resize.d.ts.map +1 -0
  421. package/dist/shared/hosted-resize.js +166 -0
  422. package/dist/shared/item-interaction-actions.d.ts +6 -0
  423. package/dist/shared/item-interaction-actions.d.ts.map +1 -0
  424. package/dist/shared/item-interaction-actions.js +27 -0
  425. package/dist/shared/item-interactions.d.ts +9 -0
  426. package/dist/shared/item-interactions.d.ts.map +1 -0
  427. package/dist/shared/item-interactions.js +74 -0
  428. package/dist/shared/item-light-placement.d.ts +2 -0
  429. package/dist/shared/item-light-placement.d.ts.map +1 -0
  430. package/dist/shared/item-light-placement.js +3 -0
  431. package/dist/shared/move-roof-tool.js +2 -1
  432. package/dist/shared/node-batch/batchable.d.ts +12 -0
  433. package/dist/shared/node-batch/batchable.d.ts.map +1 -0
  434. package/dist/shared/node-batch/batchable.js +41 -0
  435. package/dist/shared/node-batch/candidates.d.ts +7 -5
  436. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  437. package/dist/shared/node-batch/candidates.js +43 -59
  438. package/dist/shared/node-batch/release.d.ts +8 -0
  439. package/dist/shared/node-batch/release.d.ts.map +1 -0
  440. package/dist/shared/node-batch/release.js +16 -0
  441. package/dist/shared/node-batch/system.d.ts.map +1 -1
  442. package/dist/shared/node-batch/system.js +17 -12
  443. package/dist/shared/node-batch/types.d.ts +4 -1
  444. package/dist/shared/node-batch/types.d.ts.map +1 -1
  445. package/dist/shared/opening-documentation.d.ts +13 -1
  446. package/dist/shared/opening-documentation.d.ts.map +1 -1
  447. package/dist/shared/opening-documentation.js +245 -59
  448. package/dist/shared/opening-grid-follow.d.ts +8 -0
  449. package/dist/shared/opening-grid-follow.d.ts.map +1 -0
  450. package/dist/shared/opening-grid-follow.js +12 -0
  451. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  452. package/dist/shared/opening-guides-runtime.js +17 -14
  453. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  454. package/dist/shared/opening-placement-dimensions.js +3 -3
  455. package/dist/shared/opening-plane-offset.d.ts +23 -0
  456. package/dist/shared/opening-plane-offset.d.ts.map +1 -0
  457. package/dist/shared/opening-plane-offset.js +24 -0
  458. package/dist/shared/opening-property-preview-host.d.ts +3 -0
  459. package/dist/shared/opening-property-preview-host.d.ts.map +1 -0
  460. package/dist/shared/opening-property-preview-host.js +21 -0
  461. package/dist/shared/opening-property-preview.d.ts +19 -0
  462. package/dist/shared/opening-property-preview.d.ts.map +1 -0
  463. package/dist/shared/opening-property-preview.js +99 -0
  464. package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
  465. package/dist/shared/polygon-centroid-move.js +4 -1
  466. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  467. package/dist/shared/polygon-vertex-affordance.js +19 -15
  468. package/dist/shared/resting-surface-plan.d.ts +2 -1
  469. package/dist/shared/resting-surface-plan.d.ts.map +1 -1
  470. package/dist/shared/resting-surface-plan.js +29 -4
  471. package/dist/shared/run-hangers.d.ts.map +1 -1
  472. package/dist/shared/run-hangers.js +5 -4
  473. package/dist/shared/scripted-opening-handles.d.ts +18 -0
  474. package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
  475. package/dist/shared/scripted-opening-handles.js +53 -0
  476. package/dist/shared/scripted-opening.d.ts +25 -0
  477. package/dist/shared/scripted-opening.d.ts.map +1 -0
  478. package/dist/shared/scripted-opening.js +72 -0
  479. package/dist/shared/slot-paint.d.ts +14 -2
  480. package/dist/shared/slot-paint.d.ts.map +1 -1
  481. package/dist/shared/slot-paint.js +29 -29
  482. package/dist/shared/surface-counterparts.d.ts +12 -0
  483. package/dist/shared/surface-counterparts.d.ts.map +1 -0
  484. package/dist/shared/surface-counterparts.js +27 -0
  485. package/dist/shared/surface-paint.d.ts.map +1 -1
  486. package/dist/shared/surface-paint.js +2 -5
  487. package/dist/shared/swap-preview-material.d.ts +11 -0
  488. package/dist/shared/swap-preview-material.d.ts.map +1 -0
  489. package/dist/shared/swap-preview-material.js +16 -0
  490. package/dist/shared/system-checks.d.ts.map +1 -1
  491. package/dist/shared/system-checks.js +5 -3
  492. package/dist/shared/wall-attach-target.d.ts +4 -10
  493. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  494. package/dist/shared/wall-attach-target.js +6 -63
  495. package/dist/shared/wall-event-from-grid.d.ts +5 -0
  496. package/dist/shared/wall-event-from-grid.d.ts.map +1 -0
  497. package/dist/shared/wall-event-from-grid.js +36 -0
  498. package/dist/shared/wall-opening-ceiling.d.ts +5 -15
  499. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
  500. package/dist/shared/wall-opening-ceiling.js +10 -18
  501. package/dist/shelf/definition.d.ts.map +1 -1
  502. package/dist/shelf/definition.js +4 -2
  503. package/dist/shelf/floorplan.d.ts.map +1 -1
  504. package/dist/shelf/floorplan.js +9 -2
  505. package/dist/shelf/geometry.d.ts.map +1 -1
  506. package/dist/shelf/geometry.js +1 -2
  507. package/dist/shelf/paint.d.ts.map +1 -1
  508. package/dist/shelf/paint.js +4 -10
  509. package/dist/site/line-ribbon.d.ts +31 -0
  510. package/dist/site/line-ribbon.d.ts.map +1 -0
  511. package/dist/site/line-ribbon.js +117 -0
  512. package/dist/site/lot-mask.d.ts +18 -0
  513. package/dist/site/lot-mask.d.ts.map +1 -0
  514. package/dist/site/lot-mask.js +35 -0
  515. package/dist/site/panel.d.ts +10 -0
  516. package/dist/site/panel.d.ts.map +1 -0
  517. package/dist/site/panel.js +155 -0
  518. package/dist/site/parametrics.d.ts +7 -0
  519. package/dist/site/parametrics.d.ts.map +1 -1
  520. package/dist/site/parametrics.js +8 -0
  521. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  522. package/dist/site/recessed-slab-ground-holes.js +5 -2
  523. package/dist/site/renderer.d.ts.map +1 -1
  524. package/dist/site/renderer.js +158 -20
  525. package/dist/site/setbacks.d.ts +33 -0
  526. package/dist/site/setbacks.d.ts.map +1 -0
  527. package/dist/site/setbacks.js +204 -0
  528. package/dist/site/terrain-geometry.d.ts +28 -1
  529. package/dist/site/terrain-geometry.d.ts.map +1 -1
  530. package/dist/site/terrain-geometry.js +78 -4
  531. package/dist/site/terrain-holes.d.ts +15 -0
  532. package/dist/site/terrain-holes.d.ts.map +1 -0
  533. package/dist/site/terrain-holes.js +74 -0
  534. package/dist/site/terrain-mesh.d.ts +9 -2
  535. package/dist/site/terrain-mesh.d.ts.map +1 -1
  536. package/dist/site/terrain-mesh.js +36 -9
  537. package/dist/site/terrain-renderer.d.ts +9 -2
  538. package/dist/site/terrain-renderer.d.ts.map +1 -1
  539. package/dist/site/terrain-renderer.js +14 -4
  540. package/dist/skylight/definition.d.ts.map +1 -1
  541. package/dist/skylight/definition.js +1 -0
  542. package/dist/slab/boundary-editor.d.ts +1 -1
  543. package/dist/slab/boundary-editor.d.ts.map +1 -1
  544. package/dist/slab/boundary-editor.js +13 -13
  545. package/dist/slab/definition.d.ts.map +1 -1
  546. package/dist/slab/definition.js +23 -3
  547. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  548. package/dist/slab/dependency-tracker.js +67 -7
  549. package/dist/slab/elevation-limit.d.ts.map +1 -1
  550. package/dist/slab/elevation-limit.js +2 -2
  551. package/dist/slab/floorplan-affordances.d.ts +176 -4
  552. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  553. package/dist/slab/floorplan-affordances.js +0 -1
  554. package/dist/slab/floorplan-move.d.ts.map +1 -1
  555. package/dist/slab/floorplan-move.js +3 -4
  556. package/dist/slab/floorplan.d.ts +7 -0
  557. package/dist/slab/floorplan.d.ts.map +1 -1
  558. package/dist/slab/floorplan.js +22 -5
  559. package/dist/slab/geometry.d.ts.map +1 -1
  560. package/dist/slab/geometry.js +186 -76
  561. package/dist/slab/move-tool.js +7 -6
  562. package/dist/slab/paint.d.ts +18 -5
  563. package/dist/slab/paint.d.ts.map +1 -1
  564. package/dist/slab/paint.js +458 -9
  565. package/dist/slab/panel.d.ts.map +1 -1
  566. package/dist/slab/panel.js +28 -9
  567. package/dist/slab/placement-ownership.d.ts +2 -1
  568. package/dist/slab/placement-ownership.d.ts.map +1 -1
  569. package/dist/slab/placement-ownership.js +2 -2
  570. package/dist/slab/surface-split.d.ts +24 -0
  571. package/dist/slab/surface-split.d.ts.map +1 -0
  572. package/dist/slab/surface-split.js +389 -0
  573. package/dist/slab/tool.d.ts.map +1 -1
  574. package/dist/slab/tool.js +3 -3
  575. package/dist/solar-panel/definition.d.ts.map +1 -1
  576. package/dist/solar-panel/definition.js +1 -0
  577. package/dist/spawn/definition.d.ts.map +1 -1
  578. package/dist/spawn/definition.js +1 -0
  579. package/dist/stair/baluster-geometry.d.ts +21 -0
  580. package/dist/stair/baluster-geometry.d.ts.map +1 -0
  581. package/dist/stair/baluster-geometry.js +74 -0
  582. package/dist/stair/baluster-guard.d.ts +50 -0
  583. package/dist/stair/baluster-guard.d.ts.map +1 -0
  584. package/dist/stair/baluster-guard.js +71 -0
  585. package/dist/stair/boards-guard.d.ts +37 -0
  586. package/dist/stair/boards-guard.d.ts.map +1 -0
  587. package/dist/stair/boards-guard.js +61 -0
  588. package/dist/stair/cable-guard.d.ts +39 -0
  589. package/dist/stair/cable-guard.d.ts.map +1 -0
  590. package/dist/stair/cable-guard.js +105 -0
  591. package/dist/stair/construction-controls.d.ts +15 -0
  592. package/dist/stair/construction-controls.d.ts.map +1 -0
  593. package/dist/stair/construction-controls.js +29 -0
  594. package/dist/stair/continuous-railings.d.ts +10 -0
  595. package/dist/stair/continuous-railings.d.ts.map +1 -0
  596. package/dist/stair/continuous-railings.js +159 -0
  597. package/dist/stair/definition.d.ts.map +1 -1
  598. package/dist/stair/definition.js +18 -37
  599. package/dist/stair/documentation.d.ts +1 -1
  600. package/dist/stair/documentation.d.ts.map +1 -1
  601. package/dist/stair/documentation.js +10 -17
  602. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  603. package/dist/stair/floorplan-affordances.js +9 -25
  604. package/dist/stair/floorplan.d.ts +1 -23
  605. package/dist/stair/floorplan.d.ts.map +1 -1
  606. package/dist/stair/floorplan.js +102 -86
  607. package/dist/stair/glass-guard.d.ts +72 -0
  608. package/dist/stair/glass-guard.d.ts.map +1 -0
  609. package/dist/stair/glass-guard.js +167 -0
  610. package/dist/stair/guard-path.d.ts +119 -0
  611. package/dist/stair/guard-path.d.ts.map +1 -0
  612. package/dist/stair/guard-path.js +208 -0
  613. package/dist/stair/materials.d.ts +11 -0
  614. package/dist/stair/materials.d.ts.map +1 -0
  615. package/dist/stair/materials.js +51 -0
  616. package/dist/stair/metal-guard.d.ts +38 -0
  617. package/dist/stair/metal-guard.d.ts.map +1 -0
  618. package/dist/stair/metal-guard.js +79 -0
  619. package/dist/stair/paint.d.ts +32 -0
  620. package/dist/stair/paint.d.ts.map +1 -1
  621. package/dist/stair/paint.js +75 -36
  622. package/dist/stair/panel.d.ts.map +1 -1
  623. package/dist/stair/panel.js +154 -17
  624. package/dist/stair/parametrics.d.ts +1 -1
  625. package/dist/stair/parametrics.d.ts.map +1 -1
  626. package/dist/stair/parametrics.js +181 -1
  627. package/dist/stair/plan-entry.d.ts +31 -0
  628. package/dist/stair/plan-entry.d.ts.map +1 -0
  629. package/dist/stair/plan-entry.js +325 -0
  630. package/dist/stair/post-and-rail-guard.d.ts +31 -0
  631. package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
  632. package/dist/stair/post-and-rail-guard.js +63 -0
  633. package/dist/stair/railing-controls.d.ts +9 -0
  634. package/dist/stair/railing-controls.d.ts.map +1 -0
  635. package/dist/stair/railing-controls.js +49 -0
  636. package/dist/stair/renderer.d.ts.map +1 -1
  637. package/dist/stair/renderer.js +259 -259
  638. package/dist/stair/use-stair-render-data.d.ts +317 -0
  639. package/dist/stair/use-stair-render-data.d.ts.map +1 -0
  640. package/dist/stair/use-stair-render-data.js +73 -0
  641. package/dist/stair-segment/definition.d.ts.map +1 -1
  642. package/dist/stair-segment/definition.js +52 -10
  643. package/dist/stair-segment/panel.d.ts.map +1 -1
  644. package/dist/stair-segment/panel.js +36 -42
  645. package/dist/stair-segment/parametrics.d.ts +1 -1
  646. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  647. package/dist/stair-segment/parametrics.js +94 -1
  648. package/dist/stair-segment/renderer.d.ts.map +1 -1
  649. package/dist/stair-segment/renderer.js +16 -28
  650. package/dist/turbine-vent/definition.d.ts.map +1 -1
  651. package/dist/turbine-vent/definition.js +3 -5
  652. package/dist/turbine-vent/paint.d.ts.map +1 -1
  653. package/dist/turbine-vent/paint.js +2 -5
  654. package/dist/turbine-vent/panel.d.ts.map +1 -1
  655. package/dist/turbine-vent/panel.js +5 -23
  656. package/dist/unit/unit-panel.d.ts.map +1 -1
  657. package/dist/unit/unit-panel.js +6 -1
  658. package/dist/wall/actions.d.ts +3 -0
  659. package/dist/wall/actions.d.ts.map +1 -0
  660. package/dist/wall/actions.js +61 -0
  661. package/dist/wall/construction-dimensions.js +8 -5
  662. package/dist/wall/contextual-dimensions.js +4 -4
  663. package/dist/wall/curtain-opening-frame.d.ts +14 -0
  664. package/dist/wall/curtain-opening-frame.d.ts.map +1 -0
  665. package/dist/wall/curtain-opening-frame.js +111 -0
  666. package/dist/wall/curtain-panel-highlight.d.ts +3 -0
  667. package/dist/wall/curtain-panel-highlight.d.ts.map +1 -0
  668. package/dist/wall/curtain-panel-highlight.js +113 -0
  669. package/dist/wall/curtain-wall-adapter.d.ts +3 -0
  670. package/dist/wall/curtain-wall-adapter.d.ts.map +1 -0
  671. package/dist/wall/curtain-wall-adapter.js +55 -0
  672. package/dist/wall/curtain-wall-floorplan.d.ts +3 -0
  673. package/dist/wall/curtain-wall-floorplan.d.ts.map +1 -0
  674. package/dist/wall/curtain-wall-floorplan.js +91 -0
  675. package/dist/wall/curtain-wall-geometry.d.ts +4 -0
  676. package/dist/wall/curtain-wall-geometry.d.ts.map +1 -0
  677. package/dist/wall/curtain-wall-geometry.js +226 -0
  678. package/dist/wall/curtain-wall-layout.d.ts +16 -0
  679. package/dist/wall/curtain-wall-layout.d.ts.map +1 -0
  680. package/dist/wall/curtain-wall-layout.js +176 -0
  681. package/dist/wall/curtain-wall-materials.d.ts +5 -0
  682. package/dist/wall/curtain-wall-materials.d.ts.map +1 -0
  683. package/dist/wall/curtain-wall-materials.js +55 -0
  684. package/dist/wall/curtain-wall-panel.d.ts +14 -0
  685. package/dist/wall/curtain-wall-panel.d.ts.map +1 -0
  686. package/dist/wall/curtain-wall-panel.js +167 -0
  687. package/dist/wall/curtain-wall-piece-geometry.d.ts +5 -0
  688. package/dist/wall/curtain-wall-piece-geometry.d.ts.map +1 -0
  689. package/dist/wall/curtain-wall-piece-geometry.js +220 -0
  690. package/dist/wall/curtain-wall-shadow.d.ts +4 -0
  691. package/dist/wall/curtain-wall-shadow.d.ts.map +1 -0
  692. package/dist/wall/curtain-wall-shadow.js +15 -0
  693. package/dist/wall/curve-tool.d.ts.map +1 -1
  694. package/dist/wall/curve-tool.js +4 -0
  695. package/dist/wall/definition.d.ts +0 -15
  696. package/dist/wall/definition.d.ts.map +1 -1
  697. package/dist/wall/definition.js +92 -7
  698. package/dist/wall/floorplan-move.d.ts +1 -1
  699. package/dist/wall/floorplan-move.d.ts.map +1 -1
  700. package/dist/wall/floorplan-move.js +20 -83
  701. package/dist/wall/floorplan-tool.d.ts +4 -0
  702. package/dist/wall/floorplan-tool.d.ts.map +1 -0
  703. package/dist/wall/floorplan-tool.js +106 -0
  704. package/dist/wall/floorplan.d.ts +3 -1
  705. package/dist/wall/floorplan.d.ts.map +1 -1
  706. package/dist/wall/floorplan.js +189 -22
  707. package/dist/wall/length-patch.d.ts +3 -0
  708. package/dist/wall/length-patch.d.ts.map +1 -0
  709. package/dist/wall/length-patch.js +14 -0
  710. package/dist/wall/measurement.d.ts.map +1 -1
  711. package/dist/wall/measurement.js +5 -5
  712. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  713. package/dist/wall/move-endpoint-tool.js +20 -7
  714. package/dist/wall/move-shared.d.ts.map +1 -1
  715. package/dist/wall/move-shared.js +11 -7
  716. package/dist/wall/move-tool.d.ts.map +1 -1
  717. package/dist/wall/move-tool.js +140 -148
  718. package/dist/wall/paint.d.ts +26 -15
  719. package/dist/wall/paint.d.ts.map +1 -1
  720. package/dist/wall/paint.js +339 -115
  721. package/dist/wall/panel-model.d.ts +22 -0
  722. package/dist/wall/panel-model.d.ts.map +1 -0
  723. package/dist/wall/panel-model.js +175 -0
  724. package/dist/wall/panel.d.ts.map +1 -1
  725. package/dist/wall/panel.js +233 -61
  726. package/dist/wall/parametrics.d.ts.map +1 -1
  727. package/dist/wall/parametrics.js +3 -0
  728. package/dist/wall/property-preview.d.ts +7 -0
  729. package/dist/wall/property-preview.d.ts.map +1 -0
  730. package/dist/wall/property-preview.js +31 -0
  731. package/dist/wall/rectangle-command.d.ts +248 -0
  732. package/dist/wall/rectangle-command.d.ts.map +1 -0
  733. package/dist/wall/rectangle-command.js +22 -0
  734. package/dist/wall/rectangle-tool.d.ts +2 -0
  735. package/dist/wall/rectangle-tool.d.ts.map +1 -0
  736. package/dist/wall/rectangle-tool.js +165 -0
  737. package/dist/wall/renderer.d.ts.map +1 -1
  738. package/dist/wall/renderer.js +9 -4
  739. package/dist/wall/split-floorplan-layer.d.ts +4 -0
  740. package/dist/wall/split-floorplan-layer.d.ts.map +1 -0
  741. package/dist/wall/split-floorplan-layer.js +71 -0
  742. package/dist/wall/split-pointer.d.ts +3 -0
  743. package/dist/wall/split-pointer.d.ts.map +1 -0
  744. package/dist/wall/split-pointer.js +95 -0
  745. package/dist/wall/split-preview.d.ts +55 -0
  746. package/dist/wall/split-preview.d.ts.map +1 -0
  747. package/dist/wall/split-preview.js +106 -0
  748. package/dist/wall/split-session.d.ts +16 -0
  749. package/dist/wall/split-session.d.ts.map +1 -0
  750. package/dist/wall/split-session.js +144 -0
  751. package/dist/wall/split-store.d.ts +16 -0
  752. package/dist/wall/split-store.d.ts.map +1 -0
  753. package/dist/wall/split-store.js +6 -0
  754. package/dist/wall/split-tool.d.ts +10 -0
  755. package/dist/wall/split-tool.d.ts.map +1 -0
  756. package/dist/wall/split-tool.js +95 -0
  757. package/dist/wall/system.d.ts.map +1 -1
  758. package/dist/wall/system.js +39 -5
  759. package/dist/wall/tool.d.ts.map +1 -1
  760. package/dist/wall/tool.js +114 -50
  761. package/dist/wall/treatment-level-data.d.ts +3 -2
  762. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  763. package/dist/wall/treatment-level-data.js +17 -13
  764. package/dist/wall/treatments.d.ts +10 -10
  765. package/dist/wall/treatments.d.ts.map +1 -1
  766. package/dist/wall/treatments.js +67 -54
  767. package/dist/wall/wall-batch-system.d.ts +7 -0
  768. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  769. package/dist/wall/wall-batch-system.js +38 -3
  770. package/dist/wall/wall-batch.d.ts +6 -0
  771. package/dist/wall/wall-batch.d.ts.map +1 -1
  772. package/dist/wall/wall-batch.js +7 -1
  773. package/dist/window/definition.d.ts.map +1 -1
  774. package/dist/window/definition.js +60 -5
  775. package/dist/window/floorplan-affordances.d.ts.map +1 -1
  776. package/dist/window/floorplan-affordances.js +8 -10
  777. package/dist/window/floorplan-move.d.ts.map +1 -1
  778. package/dist/window/floorplan-move.js +3 -1
  779. package/dist/window/floorplan.d.ts.map +1 -1
  780. package/dist/window/floorplan.js +145 -60
  781. package/dist/window/mechanism.d.ts +4 -0
  782. package/dist/window/mechanism.d.ts.map +1 -0
  783. package/dist/window/mechanism.js +20 -0
  784. package/dist/window/move-tool.d.ts.map +1 -1
  785. package/dist/window/move-tool.js +83 -54
  786. package/dist/window/paint.d.ts.map +1 -1
  787. package/dist/window/paint.js +3 -0
  788. package/dist/window/panel.d.ts.map +1 -1
  789. package/dist/window/panel.js +50 -144
  790. package/dist/window/placement.d.ts +23 -0
  791. package/dist/window/placement.d.ts.map +1 -0
  792. package/dist/window/placement.js +66 -0
  793. package/dist/window/preview.d.ts.map +1 -1
  794. package/dist/window/preview.js +2 -0
  795. package/dist/window/renderer.d.ts.map +1 -1
  796. package/dist/window/renderer.js +3 -2
  797. package/dist/window/tool.d.ts.map +1 -1
  798. package/dist/window/tool.js +130 -26
  799. package/dist/window/window-math.d.ts +6 -14
  800. package/dist/window/window-math.d.ts.map +1 -1
  801. package/dist/window/window-math.js +13 -22
  802. package/dist/zone/contextual-dimensions.d.ts.map +1 -1
  803. package/dist/zone/contextual-dimensions.js +6 -28
  804. package/dist/zone/definition.d.ts.map +1 -1
  805. package/dist/zone/definition.js +4 -3
  806. package/dist/zone/floorplan-affordances.d.ts +200 -0
  807. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  808. package/dist/zone/floorplan.d.ts +1 -1
  809. package/dist/zone/floorplan.d.ts.map +1 -1
  810. package/dist/zone/floorplan.js +93 -53
  811. package/dist/zone/quantities-panel.d.ts.map +1 -1
  812. package/dist/zone/quantities-panel.js +6 -33
  813. package/dist/zone/quick-measurement.d.ts +2 -2
  814. package/dist/zone/quick-measurement.d.ts.map +1 -1
  815. package/dist/zone/quick-measurement.js +6 -5
  816. package/dist/zone/renderer.d.ts +1 -1
  817. package/dist/zone/renderer.d.ts.map +1 -1
  818. package/dist/zone/renderer.js +58 -146
  819. package/dist/zone/room-clear-dimensions.js +3 -3
  820. package/dist/zone/room-documentation.d.ts.map +1 -1
  821. package/dist/zone/room-documentation.js +2 -6
  822. package/package.json +12 -12
  823. package/dist/block/slots.d.ts +0 -4
  824. package/dist/block/slots.d.ts.map +0 -1
  825. package/dist/block/slots.js +0 -17
  826. package/dist/cabinet/slots.d.ts +0 -4
  827. package/dist/cabinet/slots.d.ts.map +0 -1
  828. package/dist/cabinet/slots.js +0 -24
  829. package/dist/ceiling/slots.d.ts +0 -6
  830. package/dist/ceiling/slots.d.ts.map +0 -1
  831. package/dist/ceiling/slots.js +0 -7
  832. package/dist/column/slots.d.ts +0 -9
  833. package/dist/column/slots.d.ts.map +0 -1
  834. package/dist/column/slots.js +0 -19
  835. package/dist/door/slots.d.ts +0 -9
  836. package/dist/door/slots.d.ts.map +0 -1
  837. package/dist/door/slots.js +0 -20
  838. package/dist/elevator/slots.d.ts +0 -8
  839. package/dist/elevator/slots.d.ts.map +0 -1
  840. package/dist/elevator/slots.js +0 -17
  841. package/dist/fence/slots.d.ts +0 -10
  842. package/dist/fence/slots.d.ts.map +0 -1
  843. package/dist/fence/slots.js +0 -23
  844. package/dist/lean-to-extension/slots.d.ts +0 -5
  845. package/dist/lean-to-extension/slots.d.ts.map +0 -1
  846. package/dist/lean-to-extension/slots.js +0 -15
  847. package/dist/shared/opening-documentation-fields.d.ts +0 -16
  848. package/dist/shared/opening-documentation-fields.d.ts.map +0 -1
  849. package/dist/shared/opening-documentation-fields.js +0 -54
  850. package/dist/shelf/slots.d.ts +0 -9
  851. package/dist/shelf/slots.d.ts.map +0 -1
  852. package/dist/shelf/slots.js +0 -30
  853. package/dist/slab/slots.d.ts +0 -10
  854. package/dist/slab/slots.d.ts.map +0 -1
  855. package/dist/slab/slots.js +0 -20
  856. package/dist/stair/floor-stack.d.ts +0 -10
  857. package/dist/stair/floor-stack.d.ts.map +0 -1
  858. package/dist/stair/floor-stack.js +0 -115
  859. package/dist/stair/slots.d.ts +0 -7
  860. package/dist/stair/slots.d.ts.map +0 -1
  861. package/dist/stair/slots.js +0 -13
  862. package/dist/wall/slots.d.ts +0 -10
  863. package/dist/wall/slots.d.ts.map +0 -1
  864. package/dist/wall/slots.js +0 -84
  865. package/dist/window/slots.d.ts +0 -5
  866. package/dist/window/slots.d.ts.map +0 -1
  867. package/dist/window/slots.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/block/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,IAAI,aAAa,EAE/B,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AAQzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAGpC,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa;UAMtB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YACtB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;EAalD;AAYD,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,SAAS,CA2F5D,CAAA"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/block/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,IAAI,aAAa,EAG/B,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAA;AASzB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAmBpC,wBAAgB,WAAW,CAAC,IAAI,EAAE,aAAa;UAMtB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;YACtB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC;EAalD;AAYD,eAAO,MAAM,eAAe,EAAE,cAAc,CAAC,OAAO,SAAS,CA8F5D,CAAA"}
@@ -1,4 +1,5 @@
1
- import { createBoxBlockTopology, } from '@pascal-app/core';
1
+ import { blockSlots, createBoxBlockTopology, } from '@pascal-app/core';
2
+ import { perNodeGeometryBatchable } from '../shared/node-batch/batchable';
2
3
  import { blockContextualHelp } from './contextual-help';
3
4
  import { blockFaceHost } from './face-host';
4
5
  import { buildBlockFloorplan } from './floorplan';
@@ -6,7 +7,21 @@ import { buildBlockGeometry } from './geometry';
6
7
  import { blockPaint } from './paint';
7
8
  import { blockParametrics } from './parametrics';
8
9
  import { BlockNode } from './schema';
9
- import { blockSlots } from './slots';
10
+ import { blockSurfaceProvider } from './surface';
11
+ /** Bottom within this of the floor (and top above it): the block stands on the floor. */
12
+ const BLOCK_ON_FLOOR_MAX_BOTTOM = 0.1;
13
+ const BLOCK_ON_FLOOR_MIN_TOP = 0.01;
14
+ /**
15
+ * Floor collision is for blocks standing on the floor. Soffits, vaults,
16
+ * gutters and mantels hang above floor placements, and foundation pads sit
17
+ * under the floor, so neither blocks furniture nor gets refused when moved.
18
+ */
19
+ function blockRestsOnFloor(node) {
20
+ const { size, center } = blockBounds(node);
21
+ const bottom = node.position[1] + center[1] - size[1] / 2;
22
+ const top = node.position[1] + center[1] + size[1] / 2;
23
+ return bottom <= BLOCK_ON_FLOOR_MAX_BOTTOM && top > BLOCK_ON_FLOOR_MIN_TOP;
24
+ }
10
25
  export function blockBounds(node) {
11
26
  const xs = node.topology.vertices.map((vertex) => vertex.position[0]);
12
27
  const ys = node.topology.vertices.map((vertex) => vertex.position[1]);
@@ -64,8 +79,10 @@ export const blockDefinition = {
64
79
  slotNames: { body: 'Body' },
65
80
  }),
66
81
  capabilities: {
82
+ batchable: perNodeGeometryBatchable,
67
83
  selectable: { hitVolume: 'bbox' },
68
84
  surfaces: {
85
+ hosting: blockSurfaceProvider,
69
86
  top: {
70
87
  height: (rawNode) => {
71
88
  const node = rawNode;
@@ -76,7 +93,7 @@ export const blockDefinition = {
76
93
  sides: { faces: 'all' },
77
94
  },
78
95
  movable: { axes: ['x', 'z'], gridSnap: true },
79
- duplicable: true,
96
+ duplicable: { subtree: true },
80
97
  deletable: true,
81
98
  dragBounds: (rawNode) => blockBounds(rawNode),
82
99
  floorPlaced: {
@@ -89,7 +106,7 @@ export const blockDefinition = {
89
106
  rotation: [0, node.rotation, 0],
90
107
  };
91
108
  },
92
- collides: true,
109
+ collides: (rawNode) => blockRestsOnFloor(rawNode),
93
110
  },
94
111
  paint: blockPaint,
95
112
  slots: (rawNode) => blockSlots(rawNode),
@@ -100,6 +117,7 @@ export const blockDefinition = {
100
117
  cascadeDelete: 'descendants',
101
118
  },
102
119
  geometry: buildBlockGeometry,
120
+ geometryChildTypes: [],
103
121
  geometryKey: (node) => JSON.stringify([node.topology, node.slots]),
104
122
  floorplan: buildBlockFloorplan,
105
123
  parametrics: blockParametrics,
@@ -1 +1 @@
1
- {"version":3,"file":"face-host.d.ts","sourceRoot":"","sources":["../../src/block/face-host.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAGxB,MAAM,kBAAkB,CAAA;AAqLzB,eAAO,MAAM,aAAa,EAAE,kBAAkB,CAAC,SAAS,CA+BvD,CAAA"}
1
+ {"version":3,"file":"face-host.d.ts","sourceRoot":"","sources":["../../src/block/face-host.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EACd,KAAK,kBAAkB,EAIxB,MAAM,kBAAkB,CAAA;AAgMzB,eAAO,MAAM,aAAa,EAAE,kBAAkB,CAAC,SAAS,CAqCvD,CAAA"}
@@ -1,5 +1,6 @@
1
- import { getBlockFaceFrame, } from '@pascal-app/core';
1
+ import { getBlockFaceFrame, surfaceRegionContainsPoint, } from '@pascal-app/core';
2
2
  import { Euler, Matrix4, Quaternion, Vector3 } from 'three';
3
+ import { blockTopSurfaces } from './surface';
3
4
  const BLOCK_HORIZONTAL_NORMAL_MIN_Y = 0.95;
4
5
  const BLOCK_VERTICAL_NORMAL_MAX_Y = 0.05;
5
6
  const BLOCK_FLOOR_ROTATION_X = Math.PI / 2;
@@ -73,6 +74,7 @@ function resolveBlockFaceTargetForFace(args, faceId, options = {}) {
73
74
  if (!face)
74
75
  return null;
75
76
  const vertices = new Map(args.host.topology.vertices.map((vertex) => [vertex.id, vertex.position]));
77
+ const polygon = [];
76
78
  let minU = Number.POSITIVE_INFINITY;
77
79
  let maxU = Number.NEGATIVE_INFINITY;
78
80
  let minV = Number.POSITIVE_INFINITY;
@@ -86,6 +88,7 @@ function resolveBlockFaceTargetForFace(args, faceId, options = {}) {
86
88
  const dz = point[2] - frame.origin[2];
87
89
  const pointU = dx * xAxis.x + dy * xAxis.y + dz * xAxis.z;
88
90
  const pointV = dx * yAxis.x + dy * yAxis.y + dz * yAxis.z;
91
+ polygon.push([pointU, pointV]);
89
92
  minU = Math.min(minU, pointU);
90
93
  maxU = Math.max(maxU, pointU);
91
94
  minV = Math.min(minV, pointV);
@@ -103,6 +106,12 @@ function resolveBlockFaceTargetForFace(args, faceId, options = {}) {
103
106
  : clampBlockFacePosition(snappedPosition, faceBounds, [width, height]);
104
107
  if (!facePosition)
105
108
  return null;
109
+ if (!attachTo &&
110
+ !surfaceRegionContainsPoint({ kind: 'polygon', points: polygon }, [
111
+ facePosition[0],
112
+ facePosition[1],
113
+ ]))
114
+ return null;
106
115
  const [u, v] = facePosition;
107
116
  const normalOffset = attachTo === 'ceiling' && !args.asset.recessed ? args.rawDimensions[1] : 0;
108
117
  const position = [u, v, normalOffset];
@@ -173,6 +182,14 @@ export const blockFaceHost = {
173
182
  if (!item.blockFaceId)
174
183
  return false;
175
184
  const frame = getBlockFaceFrame(host.topology, item.blockFaceId);
176
- return !!(frame && blockFaceAcceptsAttachment(frame.normal[1], asset.attachTo));
185
+ if (!frame || !blockFaceAcceptsAttachment(frame.normal[1], asset.attachTo))
186
+ return false;
187
+ if (asset.attachTo)
188
+ return true;
189
+ const surface = blockTopSurfaces(host).find((surface) => surface.id === item.blockFaceId);
190
+ const point = new Vector3(...frame.origin)
191
+ .addScaledVector(new Vector3(...frame.xAxis), item.position[0])
192
+ .addScaledVector(new Vector3(...frame.yAxis), item.position[1]);
193
+ return !!surface && surfaceRegionContainsPoint(surface.region, [point.x, point.z]);
177
194
  },
178
195
  };
@@ -1,3 +1,13 @@
1
- import type { BlockNode, FloorplanGeometry, GeometryContext } from '@pascal-app/core';
1
+ import { type BlockNode, type FloorplanGeometry, type GeometryContext } from '@pascal-app/core';
2
+ /**
3
+ * The plan cut: a floor plan is the storey sliced 4 ft above the floor and
4
+ * looked at from above. A block standing wholly ABOVE that line — fascia and
5
+ * rake boards, a gable ornament, a dormer, a ceiling fan — is overhead trim a
6
+ * drafted sheet leaves off (otherwise blocks modelled as roof trim filled the
7
+ * roof footprint plus its overhang over every room). Level-local metres.
8
+ */
9
+ export declare const PLAN_CUT_HEIGHT = 1.2;
10
+ /** True when the block's lowest vertex stands above the plan cut. */
11
+ export declare function isOverheadBlock(node: Pick<BlockNode, 'position' | 'topology'>): boolean;
2
12
  export declare function buildBlockFloorplan(node: BlockNode, ctx?: GeometryContext): FloorplanGeometry | null;
3
13
  //# sourceMappingURL=floorplan.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/block/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,iBAAiB,EAEjB,eAAe,EAChB,MAAM,kBAAkB,CAAA;AAuBzB,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,GAAG,CAAC,EAAE,eAAe,GACpB,iBAAiB,GAAG,IAAI,CAqB1B"}
1
+ {"version":3,"file":"floorplan.d.ts","sourceRoot":"","sources":["../../src/block/floorplan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,SAAS,EAEd,KAAK,iBAAiB,EAEtB,KAAK,eAAe,EAIrB,MAAM,kBAAkB,CAAA;AAGzB;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,MAAM,CAAA;AAuElC,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,CAAC,GAAG,OAAO,CAKvF;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,SAAS,EACf,GAAG,CAAC,EAAE,eAAe,GACpB,iBAAiB,GAAG,IAAI,CA0B1B"}
@@ -1,3 +1,14 @@
1
+ import { getBlockFaceNormal, pointInPolygon2D, unionPolygons, } from '@pascal-app/core';
2
+ import { readFloorplanContext } from '@pascal-app/editor';
3
+ /**
4
+ * The plan cut: a floor plan is the storey sliced 4 ft above the floor and
5
+ * looked at from above. A block standing wholly ABOVE that line — fascia and
6
+ * rake boards, a gable ornament, a dormer, a ceiling fan — is overhead trim a
7
+ * drafted sheet leaves off (otherwise blocks modelled as roof trim filled the
8
+ * roof footprint plus its overhang over every room). Level-local metres.
9
+ */
10
+ export const PLAN_CUT_HEIGHT = 1.2;
11
+ const VERTICAL_FACE_MAX_NORMAL_Y = 1e-3;
1
12
  function cross(origin, a, b) {
2
13
  return (a[0] - origin[0]) * (b[1] - origin[1]) - (a[1] - origin[1]) * (b[0] - origin[0]);
3
14
  }
@@ -20,24 +31,81 @@ function convexHull(points) {
20
31
  }
21
32
  return [...lower.slice(0, -1), ...upper.slice(0, -1)];
22
33
  }
34
+ const planRingsByTopology = new WeakMap();
35
+ /**
36
+ * The block's plan footprint: the union of every non-vertical face projected
37
+ * onto the level, so L-shapes keep their notch, rings keep their opening and
38
+ * separate parts stay apart. A topology with no such faces falls back to the
39
+ * convex hull of its vertices. Cached per topology: selection and hover
40
+ * rebuild the plan without re-running the union.
41
+ */
42
+ function blockPlanRings(topology) {
43
+ const cached = planRingsByTopology.get(topology);
44
+ if (cached)
45
+ return cached;
46
+ const vertexById = new Map(topology.vertices.map((vertex) => [vertex.id, vertex.position]));
47
+ const projected = [];
48
+ for (const face of topology.faces) {
49
+ const normal = getBlockFaceNormal(topology, face, vertexById);
50
+ if (!normal || Math.abs(normal[1]) <= VERTICAL_FACE_MAX_NORMAL_Y)
51
+ continue;
52
+ const ring = face.vertexIds.flatMap((id) => {
53
+ const position = vertexById.get(id);
54
+ return position ? [[position[0], position[2]]] : [];
55
+ });
56
+ if (ring.length === face.vertexIds.length)
57
+ projected.push(ring);
58
+ }
59
+ let rings = unionPolygons(projected);
60
+ if (rings.length === 0) {
61
+ const hull = convexHull(topology.vertices.map((v) => [v.position[0], v.position[2]]));
62
+ rings = hull.length >= 3 ? [hull] : [];
63
+ }
64
+ planRingsByTopology.set(topology, rings);
65
+ return rings;
66
+ }
67
+ /** A ring inside another is a hole (or an island in one): draw all rings as one evenodd path. */
68
+ function hasNestedRing(rings) {
69
+ return rings.some((ring, index) => rings.some((other, otherIndex) => otherIndex !== index && pointInPolygon2D(ring[0], other, { includeBoundary: false })));
70
+ }
71
+ function ringPath(rings) {
72
+ return rings.map((ring) => `M${ring.map(([x, y]) => `${x} ${y}`).join('L')}Z`).join('');
73
+ }
74
+ /** True when the block's lowest vertex stands above the plan cut. */
75
+ export function isOverheadBlock(node) {
76
+ let minY = Number.POSITIVE_INFINITY;
77
+ for (const vertex of node.topology.vertices)
78
+ minY = Math.min(minY, vertex.position[1]);
79
+ if (!Number.isFinite(minY))
80
+ return false;
81
+ return node.position[1] + minY > PLAN_CUT_HEIGHT;
82
+ }
23
83
  export function buildBlockFloorplan(node, ctx) {
24
- const points = convexHull(node.topology.vertices.map((vertex) => [vertex.position[0], vertex.position[2]]));
25
- if (points.length < 3)
84
+ const rings = blockPlanRings(node.topology);
85
+ if (rings.length === 0)
26
86
  return null;
27
87
  const selected = ctx?.viewState?.selected ?? false;
88
+ const drafting = ctx ? readFloorplanContext(ctx).drafting : false;
89
+ // Overhead trim is not on a drafted sheet at all.
90
+ if (drafting && isOverheadBlock(node))
91
+ return null;
92
+ const style = {
93
+ // on a sheet a floor-standing block is an outline in plan ink, like a wall
94
+ fill: drafting ? 'none' : selected ? '#fed7aa' : '#cbd5e1',
95
+ fillOpacity: drafting ? 1 : selected ? 0.55 : 0.72,
96
+ stroke: drafting
97
+ ? '#111827'
98
+ : selected
99
+ ? (ctx?.viewState?.palette?.selectedStroke ?? '#f97316')
100
+ : '#475569',
101
+ strokeWidth: selected ? 0.03 : 0.018,
102
+ pointerEvents: 'all',
103
+ };
28
104
  return {
29
105
  kind: 'group',
30
106
  transform: { translate: [node.position[0], node.position[2]], rotate: -node.rotation },
31
- children: [
32
- {
33
- kind: 'polygon',
34
- points,
35
- fill: selected ? '#fed7aa' : '#cbd5e1',
36
- fillOpacity: selected ? 0.55 : 0.72,
37
- stroke: selected ? (ctx?.viewState?.palette?.selectedStroke ?? '#f97316') : '#475569',
38
- strokeWidth: selected ? 0.03 : 0.018,
39
- pointerEvents: 'all',
40
- },
41
- ],
107
+ children: hasNestedRing(rings)
108
+ ? [{ kind: 'path', d: ringPath(rings), fillRule: 'evenodd', ...style }]
109
+ : rings.map((points) => ({ kind: 'polygon', points, ...style })),
42
110
  };
43
111
  }
@@ -1,8 +1,8 @@
1
- import type { BlockFace, BlockNode, BlockTopology, GeometryContext } from '@pascal-app/core';
1
+ import { type BlockFace, type BlockNode, type BlockTopology, type GeometryContext } from '@pascal-app/core';
2
2
  import { type ColorPreset, type RenderShading } from '@pascal-app/viewer';
3
3
  import { Group } from 'three';
4
4
  type Point = [number, number, number];
5
- export declare function triangulateBlockFace(topology: BlockTopology, face: BlockFace): {
5
+ export declare function triangulateBlockFace(topology: BlockTopology, face: BlockFace, vertexById?: Map<string, Point>): {
6
6
  triangles: [Point, Point, Point][];
7
7
  normal: Point;
8
8
  } | null;
@@ -1 +1 @@
1
- {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/block/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAC5F,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAEnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAIL,KAAK,EAKN,MAAM,OAAO,CAAA;AAId,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAYrC,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,SAAS,GACd;IAAE,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CA8B9D;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,GAAG,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EACxC,OAAO,GAAE,aAA0B,EACnC,QAAQ,UAAO,EACf,WAAW,GAAE,WAAoB,EACjC,UAAU,CAAC,EAAE,MAAM,GAClB,KAAK,CAwGP"}
1
+ {"version":3,"file":"geometry.d.ts","sourceRoot":"","sources":["../../src/block/geometry.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EACd,KAAK,SAAS,EACd,KAAK,aAAa,EAElB,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,WAAW,EAEhB,KAAK,aAAa,EAEnB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAIL,KAAK,EAKN,MAAM,OAAO,CAAA;AAEd,KAAK,KAAK,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;AAYrC,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,SAAS,EACf,UAAU,GAAE,GAAG,CAAC,MAAM,EAAE,KAAK,CAE5B,GACA;IAAE,SAAS,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,GAAG,IAAI,CA6B9D;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,GAAG,CAAC,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,EACxC,OAAO,GAAE,aAA0B,EACnC,QAAQ,UAAO,EACf,WAAW,GAAE,WAAoB,EACjC,UAAU,CAAC,EAAE,MAAM,GAClB,KAAK,CA4HP"}
@@ -1,7 +1,6 @@
1
+ import { BLOCK_BODY_SLOT_ID, blockMaterialSlotIds, getBlockFaceFrame, getBlockFaceNormal, } from '@pascal-app/core';
1
2
  import { createSurfaceRoleMaterial, resolveMaterialRef, } from '@pascal-app/viewer';
2
3
  import { BufferGeometry, Float32BufferAttribute, FrontSide, Group, Mesh, ShapeUtils, Vector2, Vector3, } from 'three';
3
- import { blockFaceNormal } from './commands';
4
- import { BLOCK_BODY_SLOT_ID, blockMaterialSlotIds } from './material-slots';
5
4
  const SMOOTH_NORMAL_ANGLE_COSINE = Math.cos(Math.PI / 6);
6
5
  function projectedPoint(point, normal) {
7
6
  const ax = Math.abs(normal[0]);
@@ -13,12 +12,11 @@ function projectedPoint(point, normal) {
13
12
  return new Vector2(point[0], point[2]);
14
13
  return new Vector2(point[0], point[1]);
15
14
  }
16
- export function triangulateBlockFace(topology, face) {
17
- const vertexById = new Map(topology.vertices.map((vertex) => [vertex.id, vertex.position]));
15
+ export function triangulateBlockFace(topology, face, vertexById = new Map(topology.vertices.map((vertex) => [vertex.id, vertex.position]))) {
18
16
  const contour = face.vertexIds
19
17
  .map((id) => vertexById.get(id))
20
18
  .filter((point) => !!point);
21
- const normal = blockFaceNormal(topology, face);
19
+ const normal = getBlockFaceNormal(topology, face, vertexById);
22
20
  if (!normal || contour.length !== face.vertexIds.length)
23
21
  return null;
24
22
  const triangleIndices = ShapeUtils.triangulateShape(contour.map((point) => projectedPoint(point, normal)), []);
@@ -53,9 +51,10 @@ export function buildBlockGeometry(node, ctx, shading = 'rendered', textures = t
53
51
  const uvs = [];
54
52
  const faceRanges = [];
55
53
  const slotIds = blockMaterialSlotIds(node.topology, node.slots, node.slotNames);
56
- const materialIndexBySlotId = new Map(slotIds.map((slotId, index) => [slotId, index]));
54
+ // One id map for the whole build: a per-face map made every rebuild O(faces × vertices).
55
+ const vertexById = new Map(node.topology.vertices.map((vertex) => [vertex.id, vertex.position]));
57
56
  const faceNormals = new Map(node.topology.faces.flatMap((face) => {
58
- const normal = blockFaceNormal(node.topology, face);
57
+ const normal = getBlockFaceNormal(node.topology, face, vertexById);
59
58
  return normal ? [[face.id, normal]] : [];
60
59
  }));
61
60
  const adjacentFaceNormals = new Map();
@@ -88,25 +87,40 @@ export function buildBlockGeometry(node, ctx, shading = 'rendered', textures = t
88
87
  }
89
88
  }
90
89
  const vertexIdByPosition = new Map(node.topology.vertices.map((vertex) => [vertex.position, vertex.id]));
90
+ // Faces are laid out slot by slot so each material slot is one draw group; the
91
+ // per-face ranges stay contiguous for picking and paint.
92
+ const facesBySlot = new Map(slotIds.map((slotId) => [slotId, []]));
91
93
  for (const face of node.topology.faces) {
92
- const triangulated = triangulateBlockFace(node.topology, face);
93
- if (!triangulated)
94
- continue;
95
- const start = positions.length / 3;
96
- for (const triangle of triangulated.triangles) {
97
- for (const point of triangle) {
98
- positions.push(...point);
99
- const vertexId = vertexIdByPosition.get(point);
100
- normals.push(...(vertexId
101
- ? (cornerNormals.get(`${face.id}\u0000${vertexId}`) ?? triangulated.normal)
102
- : triangulated.normal));
103
- const uv = projectedPoint(point, triangulated.normal);
104
- uvs.push(uv.x, uv.y);
94
+ ;
95
+ (facesBySlot.get(face.materialSlot) ?? facesBySlot.get(slotIds[0]))?.push(face);
96
+ }
97
+ for (const [materialIndex, slotId] of slotIds.entries()) {
98
+ const slotStart = positions.length / 3;
99
+ for (const face of facesBySlot.get(slotId) ?? []) {
100
+ const triangulated = triangulateBlockFace(node.topology, face, vertexById);
101
+ // UVs in metres along the face's own frame (level U, up-slope V), the frame
102
+ // face hosting uses; a dominant-axis projection turned X-facing sides 90°,
103
+ // mirrored some faces and stretched slopes.
104
+ const frame = getBlockFaceFrame(node.topology, face.id);
105
+ if (!(triangulated && frame))
106
+ continue;
107
+ const { xAxis, yAxis } = frame;
108
+ const start = positions.length / 3;
109
+ for (const triangle of triangulated.triangles) {
110
+ for (const point of triangle) {
111
+ positions.push(...point);
112
+ const vertexId = vertexIdByPosition.get(point);
113
+ normals.push(...(vertexId
114
+ ? (cornerNormals.get(`${face.id}\u0000${vertexId}`) ?? triangulated.normal)
115
+ : triangulated.normal));
116
+ uvs.push(point[0] * xAxis[0] + point[1] * xAxis[1] + point[2] * xAxis[2], point[0] * yAxis[0] + point[1] * yAxis[1] + point[2] * yAxis[2]);
117
+ }
105
118
  }
119
+ faceRanges.push({ faceId: face.id, start, count: positions.length / 3 - start });
106
120
  }
107
- const count = positions.length / 3 - start;
108
- geometry.addGroup(start, count, materialIndexBySlotId.get(face.materialSlot) ?? 0);
109
- faceRanges.push({ faceId: face.id, start, count });
121
+ const slotCount = positions.length / 3 - slotStart;
122
+ if (slotCount > 0)
123
+ geometry.addGroup(slotStart, slotCount, materialIndex);
110
124
  }
111
125
  geometry.setAttribute('position', new Float32BufferAttribute(positions, 3));
112
126
  geometry.setAttribute('normal', new Float32BufferAttribute(normals, 3));
@@ -134,7 +148,8 @@ export function buildBlockGeometry(node, ctx, shading = 'rendered', textures = t
134
148
  bodyFallbackSlotIds.push(slotId);
135
149
  return bodyMaterial;
136
150
  });
137
- const mesh = new Mesh(geometry, materials);
151
+ // A single-slot block draws with one material, so node batching can pack it.
152
+ const mesh = new Mesh(geometry, materials.length === 1 ? materials[0] : materials);
138
153
  mesh.name = 'block-body';
139
154
  mesh.castShadow = true;
140
155
  mesh.receiveShadow = true;
@@ -0,0 +1,13 @@
1
+ import { type AnyNodeId, type BlockTopology, type SceneApi } from '@pascal-app/core';
2
+ import { type HostedUpdate } from '../shared/hosted-resize';
3
+ export declare const BLOCK_SUPPORT_REFUSAL = "This edit would remove support for an item on the block";
4
+ type EditScene = Pick<SceneApi, 'get' | 'update' | 'applyChanges'>;
5
+ export declare function planBlockTopologyEdit(scene: Pick<SceneApi, 'get'>, id: AnyNodeId, topology: BlockTopology): HostedUpdate[] | null;
6
+ export declare function commitBlockTopologyEdit(scene: EditScene, id: AnyNodeId, topology: BlockTopology): boolean;
7
+ export declare function createBlockTopologyPreview(id: AnyNodeId, scene: Pick<SceneApi, 'get' | 'markDirty'>): {
8
+ clear: () => void;
9
+ readonly valid: boolean;
10
+ set(topology: BlockTopology): boolean;
11
+ };
12
+ export {};
13
+ //# sourceMappingURL=hosted-edit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hosted-edit.d.ts","sourceRoot":"","sources":["../../src/block/hosted-edit.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,SAAS,EAEd,KAAK,aAAa,EAGlB,KAAK,QAAQ,EAGd,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EAAE,KAAK,YAAY,EAAsB,MAAM,yBAAyB,CAAA;AAI/E,eAAO,MAAM,qBAAqB,4DAA4D,CAAA;AAC9F,KAAK,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,cAAc,CAAC,CAAA;AAoBlE,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAC5B,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,aAAa,GACtB,YAAY,EAAE,GAAG,IAAI,CA+KvB;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,SAAS,EAChB,EAAE,EAAE,SAAS,EACb,QAAQ,EAAE,aAAa,GACtB,OAAO,CAST;AAED,wBAAgB,0BAA0B,CACxC,EAAE,EAAE,SAAS,EACb,KAAK,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,GAAG,WAAW,CAAC;;;kBAiB1B,aAAa;EAiB9B"}
@@ -0,0 +1,230 @@
1
+ import { getBlockFaceFrame, surfaceRegionContainsPoint, useLiveNodeOverrides, } from '@pascal-app/core';
2
+ import { attachmentBounds } from '@pascal-app/core/procedural-items';
3
+ import { Euler, Matrix4, Quaternion, Vector3 } from 'three';
4
+ import { hostedChildUpdates } from '../shared/hosted-resize';
5
+ import { blockFaceHost } from './face-host';
6
+ import { blockSurfaceProvider, blockTopSurfaces } from './surface';
7
+ export const BLOCK_SUPPORT_REFUSAL = 'This edit would remove support for an item on the block';
8
+ function faceMatrix(host, faceId) {
9
+ const face = getBlockFaceFrame(host.topology, faceId);
10
+ if (!face)
11
+ return null;
12
+ return new Matrix4()
13
+ .makeBasis(new Vector3(...face.xAxis), new Vector3(...face.yAxis), new Vector3(...face.normal))
14
+ .setPosition(...face.origin);
15
+ }
16
+ function convertPose(child, matrix) {
17
+ const position = new Vector3(...child.position).applyMatrix4(matrix).toArray();
18
+ const rotation = new Euler().setFromQuaternion(new Quaternion()
19
+ .setFromRotationMatrix(matrix)
20
+ .multiply(new Quaternion().setFromEuler(new Euler(...child.rotation))));
21
+ return { position, rotation: [rotation.x, rotation.y, rotation.z] };
22
+ }
23
+ export function planBlockTopologyEdit(scene, id, topology) {
24
+ const host = scene.get(id);
25
+ if (host?.type !== 'block')
26
+ return null;
27
+ const children = host.children
28
+ .map((childId) => scene.get(childId))
29
+ .filter((child) => !!child && child.parentId === id);
30
+ if (!children.length)
31
+ return [[id, { topology }]];
32
+ const nextHost = { ...host, topology };
33
+ const before = Object.fromEntries([host, ...children].map((node) => [node.id, node]));
34
+ const after = { ...before, [id]: nextHost };
35
+ const updates = [];
36
+ const reconciled = new Set();
37
+ const nextSurfaces = blockTopSurfaces(nextHost);
38
+ const previousFaces = new Map(host.topology.faces.map((face) => [face.id, face]));
39
+ const nextFaces = new Map(topology.faces.map((face) => [face.id, face]));
40
+ const vertices = new Map(topology.vertices.map((v) => [v.id, v.position]));
41
+ const previousVertices = new Map(host.topology.vertices.map((v) => [v.id, v.position]));
42
+ const horizontal = new Map();
43
+ const translations = new Map();
44
+ const isHorizontal = (faceId) => {
45
+ if (!horizontal.has(faceId)) {
46
+ const frame = getBlockFaceFrame(topology, faceId);
47
+ horizontal.set(faceId, Math.abs(frame.normal[1] - 1) <= 1e-6 &&
48
+ nextFaces
49
+ .get(faceId)
50
+ .vertexIds.every((id) => Math.abs(vertices.get(id)[1] - frame.origin[1]) <= 1e-5));
51
+ }
52
+ return horizontal.get(faceId);
53
+ };
54
+ const translation = (faceId) => {
55
+ if (!translations.has(faceId)) {
56
+ const previous = previousFaces.get(faceId);
57
+ const next = nextFaces.get(faceId);
58
+ const delta = getBlockFaceFrame(topology, faceId).origin.map((v, i) => v - getBlockFaceFrame(host.topology, faceId).origin[i]);
59
+ const translated = previous.vertexIds.length === next.vertexIds.length &&
60
+ previous.vertexIds.every((id, i) => previousVertices
61
+ .get(id)
62
+ .every((v, axis) => Math.abs(v + delta[axis] - vertices.get(next.vertexIds[i])[axis]) <= 1e-5));
63
+ translations.set(faceId, translated ? delta : null);
64
+ }
65
+ return translations.get(faceId);
66
+ };
67
+ const replacementAt = (faceId, point) => {
68
+ const previous = previousFaces.get(faceId);
69
+ const next = nextFaces.get(faceId);
70
+ // A split both retains and adds boundary vertices; translations and insets must not rehome.
71
+ if (next &&
72
+ (!next.vertexIds.some((id) => previous?.vertexIds.includes(id)) ||
73
+ !next.vertexIds.some((id) => !previous?.vertexIds.includes(id))))
74
+ return undefined;
75
+ return nextSurfaces.find((surface) => {
76
+ if (surface.id === faceId)
77
+ return false;
78
+ const f = getBlockFaceFrame(topology, surface.id);
79
+ const distance = point.reduce((sum, v, i) => sum + (v - f.origin[i]) * f.normal[i], 0);
80
+ return (Math.abs(distance) < 1e-5 &&
81
+ surfaceRegionContainsPoint(surface.region, [point[0], point[2]]));
82
+ });
83
+ };
84
+ for (const child of children) {
85
+ if (child.type === 'item' && child.blockFaceId && child.asset.attachTo) {
86
+ const faceId = child.blockFaceId;
87
+ // A face stretched, trimmed or re-shaped in its own plane moves its centroid, the
88
+ // origin of the item's face frame: keep the item's pose instead of dragging it along.
89
+ // A face moved as a whole still carries it.
90
+ const previous = getBlockFaceFrame(host.topology, faceId);
91
+ const next = getBlockFaceFrame(topology, faceId);
92
+ if (!(previous && next && previousFaces.has(faceId) && nextFaces.has(faceId)))
93
+ continue;
94
+ if (translation(faceId))
95
+ continue;
96
+ if (previous.normal.some((value, axis) => Math.abs(value - next.normal[axis]) > 1e-6))
97
+ continue;
98
+ const shift = previous.origin.map((value, axis) => value - next.origin[axis]);
99
+ const along = (direction) => shift.reduce((sum, value, axis) => sum + value * direction[axis], 0);
100
+ // In-plane only: the item stays on the face if the face also moved along its normal.
101
+ const position = [
102
+ child.position[0] + along(next.xAxis),
103
+ child.position[1] + along(next.yAxis),
104
+ child.position[2],
105
+ ];
106
+ if (position.some((value, axis) => Math.abs(value - child.position[axis]) > 1e-9))
107
+ updates.push([child.id, { position }]);
108
+ continue;
109
+ }
110
+ if (child.type === 'item' && child.blockFaceId && !child.asset.attachTo) {
111
+ reconciled.add(child.id);
112
+ const matrix = faceMatrix(host, child.blockFaceId);
113
+ if (!matrix)
114
+ continue;
115
+ const oldPose = convertPose(child, matrix);
116
+ const oldRegion = nextSurfaces.find((surface) => surface.id === child.blockFaceId);
117
+ const replacement = !oldRegion ||
118
+ !surfaceRegionContainsPoint(oldRegion.region, [oldPose.position[0], oldPose.position[2]])
119
+ ? replacementAt(child.blockFaceId, oldPose.position)
120
+ : undefined;
121
+ if (replacement) {
122
+ const pose = convertPose({ ...child, ...oldPose }, faceMatrix(nextHost, replacement.id).invert());
123
+ const candidate = { ...child, ...pose, blockFaceId: replacement.id };
124
+ if (!blockFaceHost.isStoredPlacementValid({
125
+ host: nextHost,
126
+ item: candidate,
127
+ asset: child.asset,
128
+ }))
129
+ return null;
130
+ updates.push([child.id, { ...pose, blockFaceId: replacement.id }]);
131
+ }
132
+ else if (!blockFaceHost.isStoredPlacementValid({ host: nextHost, item: child, asset: child.asset }))
133
+ return null;
134
+ continue;
135
+ }
136
+ if (child.type !== 'procedural-item' || child.recipe.mounting)
137
+ continue;
138
+ const projected = attachmentBounds(child);
139
+ const point = [
140
+ (projected.min[0] + projected.max[0]) / 2,
141
+ projected.min[1],
142
+ (projected.min[2] + projected.max[2]) / 2,
143
+ ];
144
+ const previous = blockSurfaceProvider.resolveHit(host, { point, normalWorldY: 1 }, { scene: { nodes: () => before, get: scene.get } });
145
+ if (!previous || Math.abs(previous.position[1] - point[1]) > 1e-5 || previous.id === null)
146
+ continue;
147
+ const next = nextSurfaces.find((surface) => surface.id === previous.id);
148
+ if (next && isHorizontal(next.id)) {
149
+ const delta = translation(next.id);
150
+ if (delta && (Math.abs(delta[0]) > 1e-8 || Math.abs(delta[2]) > 1e-8)) {
151
+ if (!surfaceRegionContainsPoint(next.region, [point[0] + delta[0], point[2] + delta[2]]))
152
+ return null;
153
+ updates.push([
154
+ child.id,
155
+ { position: child.position.map((v, i) => v + delta[i]) },
156
+ ]);
157
+ reconciled.add(child.id);
158
+ continue;
159
+ }
160
+ }
161
+ if (!next || !surfaceRegionContainsPoint(next.region, [point[0], point[2]])) {
162
+ const replacement = replacementAt(previous.id, point);
163
+ if (!replacement || !isHorizontal(replacement.id))
164
+ return null;
165
+ reconciled.add(child.id);
166
+ continue;
167
+ }
168
+ const previousFrame = getBlockFaceFrame(host.topology, previous.id);
169
+ // Host-local upright designs can follow a horizontal plane, not a tilted or warped support.
170
+ if (Math.abs(previousFrame.normal[1] - 1) > 1e-6 || !isHorizontal(next.id))
171
+ return null;
172
+ }
173
+ const changes = hostedChildUpdates(before, after, {
174
+ host: (node) => node.id === id,
175
+ child: (node) => !reconciled.has(node.id) && (node.type !== 'item' || !node.asset.attachTo),
176
+ });
177
+ return changes ? [[id, { topology }], ...updates, ...changes] : null;
178
+ }
179
+ export function commitBlockTopologyEdit(scene, id, topology) {
180
+ const updates = planBlockTopologyEdit(scene, id, topology);
181
+ if (!updates)
182
+ return false;
183
+ if (updates.length === 1)
184
+ scene.update(id, { topology });
185
+ else {
186
+ if (!scene.applyChanges)
187
+ return false;
188
+ scene.applyChanges({ update: updates.map(([id, data]) => ({ id, data })) });
189
+ }
190
+ return true;
191
+ }
192
+ export function createBlockTopologyPreview(id, scene) {
193
+ let owned = [];
194
+ let valid = true;
195
+ const clear = () => {
196
+ for (const [nodeId, patch] of owned) {
197
+ useLiveNodeOverrides.getState().clearFields(nodeId, Object.keys(patch));
198
+ if (nodeId !== id)
199
+ scene.markDirty(nodeId);
200
+ }
201
+ owned = [];
202
+ valid = true;
203
+ };
204
+ return {
205
+ clear,
206
+ get valid() {
207
+ return valid;
208
+ },
209
+ set(topology) {
210
+ const updates = planBlockTopologyEdit(scene, id, topology);
211
+ valid = updates !== null;
212
+ if (!updates)
213
+ return false;
214
+ const nextIds = new Set(updates.map(([nodeId]) => nodeId));
215
+ for (const [nodeId, patch] of owned) {
216
+ if (!nextIds.has(nodeId)) {
217
+ useLiveNodeOverrides.getState().clearFields(nodeId, Object.keys(patch));
218
+ if (nodeId !== id)
219
+ scene.markDirty(nodeId);
220
+ }
221
+ }
222
+ owned = updates;
223
+ useLiveNodeOverrides.getState().setMany(updates);
224
+ for (const [nodeId] of updates)
225
+ if (nodeId !== id)
226
+ scene.markDirty(nodeId);
227
+ return true;
228
+ },
229
+ };
230
+ }
@@ -7,7 +7,7 @@ type SuccessfulBlockCommandResult = Extract<BlockCommandResult, {
7
7
  export type BlockOperationServices = {
8
8
  historyApi: SelectionAffordanceHistoryApi;
9
9
  readOnly: boolean;
10
- sceneApi: Pick<SceneApi, 'get' | 'update'>;
10
+ sceneApi: Pick<SceneApi, 'get' | 'update' | 'applyChanges'>;
11
11
  };
12
12
  export type BlockLastOperation = {
13
13
  baseTopology: BlockTopology;