@pascal-app/nodes 1.0.0-beta.5 → 1.0.1

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 (929) hide show
  1. package/LICENSE +21 -0
  2. package/dist/block/commands.d.ts +68 -0
  3. package/dist/block/commands.d.ts.map +1 -0
  4. package/dist/block/commands.js +1144 -0
  5. package/dist/block/contextual-help.d.ts +3 -0
  6. package/dist/block/contextual-help.d.ts.map +1 -0
  7. package/dist/block/contextual-help.js +38 -0
  8. package/dist/block/definition.d.ts +8 -0
  9. package/dist/block/definition.d.ts.map +1 -0
  10. package/dist/block/definition.js +126 -0
  11. package/dist/block/edit-session.d.ts +16 -0
  12. package/dist/block/edit-session.d.ts.map +1 -0
  13. package/dist/block/edit-session.js +32 -0
  14. package/dist/block/face-host.d.ts +3 -0
  15. package/dist/block/face-host.d.ts.map +1 -0
  16. package/dist/block/face-host.js +178 -0
  17. package/dist/block/floorplan.d.ts +3 -0
  18. package/dist/block/floorplan.d.ts.map +1 -0
  19. package/dist/block/floorplan.js +43 -0
  20. package/dist/block/geometry-snap.d.ts +18 -0
  21. package/dist/block/geometry-snap.d.ts.map +1 -0
  22. package/dist/block/geometry-snap.js +137 -0
  23. package/dist/block/geometry.d.ts +11 -0
  24. package/dist/block/geometry.d.ts.map +1 -0
  25. package/dist/block/geometry.js +146 -0
  26. package/dist/block/gesture-wheel.d.ts +8 -0
  27. package/dist/block/gesture-wheel.d.ts.map +1 -0
  28. package/dist/block/gesture-wheel.js +7 -0
  29. package/dist/block/interaction-sfx.d.ts +3 -0
  30. package/dist/block/interaction-sfx.d.ts.map +1 -0
  31. package/dist/block/interaction-sfx.js +16 -0
  32. package/dist/block/last-operation.d.ts +48 -0
  33. package/dist/block/last-operation.d.ts.map +1 -0
  34. package/dist/block/last-operation.js +120 -0
  35. package/dist/block/loop-cut-interaction.d.ts +5 -0
  36. package/dist/block/loop-cut-interaction.d.ts.map +1 -0
  37. package/dist/block/loop-cut-interaction.js +13 -0
  38. package/dist/block/material-slots.d.ts +61 -0
  39. package/dist/block/material-slots.d.ts.map +1 -0
  40. package/dist/block/material-slots.js +131 -0
  41. package/dist/block/modal-face-operation.d.ts +13 -0
  42. package/dist/block/modal-face-operation.d.ts.map +1 -0
  43. package/dist/block/modal-face-operation.js +40 -0
  44. package/dist/block/modal-session.d.ts +15 -0
  45. package/dist/block/modal-session.d.ts.map +1 -0
  46. package/dist/block/modal-session.js +40 -0
  47. package/dist/block/modal-transform.d.ts +30 -0
  48. package/dist/block/modal-transform.d.ts.map +1 -0
  49. package/dist/block/modal-transform.js +144 -0
  50. package/dist/block/paint.d.ts +3 -0
  51. package/dist/block/paint.d.ts.map +1 -0
  52. package/dist/block/paint.js +136 -0
  53. package/dist/block/panel.d.ts +2 -0
  54. package/dist/block/panel.d.ts.map +1 -0
  55. package/dist/block/panel.js +234 -0
  56. package/dist/block/parametrics.d.ts +4 -0
  57. package/dist/block/parametrics.d.ts.map +1 -0
  58. package/dist/block/parametrics.js +9 -0
  59. package/dist/block/preview.d.ts +6 -0
  60. package/dist/block/preview.d.ts.map +1 -0
  61. package/dist/block/preview.js +46 -0
  62. package/dist/block/rotation-drag.d.ts +5 -0
  63. package/dist/block/rotation-drag.d.ts.map +1 -0
  64. package/dist/block/rotation-drag.js +18 -0
  65. package/dist/block/schema.d.ts +2 -0
  66. package/dist/block/schema.d.ts.map +1 -0
  67. package/dist/block/schema.js +1 -0
  68. package/dist/block/selection-geometry.d.ts +9 -0
  69. package/dist/block/selection-geometry.d.ts.map +1 -0
  70. package/dist/block/selection-geometry.js +31 -0
  71. package/dist/block/selection-model.d.ts +17 -0
  72. package/dist/block/selection-model.d.ts.map +1 -0
  73. package/dist/block/selection-model.js +84 -0
  74. package/dist/block/selection.d.ts +4 -0
  75. package/dist/block/selection.d.ts.map +1 -0
  76. package/dist/block/selection.js +2570 -0
  77. package/dist/block/slots.d.ts +4 -0
  78. package/dist/block/slots.d.ts.map +1 -0
  79. package/dist/block/slots.js +17 -0
  80. package/dist/block/tool.d.ts +3 -0
  81. package/dist/block/tool.d.ts.map +1 -0
  82. package/dist/block/tool.js +174 -0
  83. package/dist/block/toolbar-state.d.ts +46 -0
  84. package/dist/block/toolbar-state.d.ts.map +1 -0
  85. package/dist/block/toolbar-state.js +67 -0
  86. package/dist/block/use-block-face-operation.d.ts +39 -0
  87. package/dist/block/use-block-face-operation.d.ts.map +1 -0
  88. package/dist/block/use-block-face-operation.js +218 -0
  89. package/dist/box-vent/definition.d.ts.map +1 -1
  90. package/dist/box-vent/definition.js +8 -5
  91. package/dist/box-vent/geometry.d.ts +4 -0
  92. package/dist/box-vent/geometry.d.ts.map +1 -1
  93. package/dist/box-vent/geometry.js +76 -44
  94. package/dist/box-vent/paint.d.ts +4 -0
  95. package/dist/box-vent/paint.d.ts.map +1 -0
  96. package/dist/box-vent/paint.js +40 -0
  97. package/dist/box-vent/panel.js +4 -4
  98. package/dist/box-vent/parametrics.js +3 -3
  99. package/dist/box-vent/renderer.d.ts.map +1 -1
  100. package/dist/box-vent/renderer.js +29 -10
  101. package/dist/cabinet/appliance-layout.d.ts +26 -0
  102. package/dist/cabinet/appliance-layout.d.ts.map +1 -0
  103. package/dist/cabinet/appliance-layout.js +52 -0
  104. package/dist/cabinet/compartment-card.d.ts.map +1 -1
  105. package/dist/cabinet/compartment-card.js +11 -3
  106. package/dist/cabinet/continuous-placement.d.ts +3 -0
  107. package/dist/cabinet/continuous-placement.d.ts.map +1 -1
  108. package/dist/cabinet/continuous-placement.js +6 -0
  109. package/dist/cabinet/countertop-layout.d.ts +173 -0
  110. package/dist/cabinet/countertop-layout.d.ts.map +1 -0
  111. package/dist/cabinet/countertop-layout.js +80 -0
  112. package/dist/cabinet/definition.d.ts.map +1 -1
  113. package/dist/cabinet/definition.js +414 -61
  114. package/dist/cabinet/floorplan-move.d.ts.map +1 -1
  115. package/dist/cabinet/floorplan-move.js +91 -22
  116. package/dist/cabinet/geometry/cooktop.d.ts.map +1 -1
  117. package/dist/cabinet/geometry/cooktop.js +2 -2
  118. package/dist/cabinet/geometry/fridge.d.ts.map +1 -1
  119. package/dist/cabinet/geometry/fridge.js +25 -1
  120. package/dist/cabinet/geometry/fronts.d.ts +4 -0
  121. package/dist/cabinet/geometry/fronts.d.ts.map +1 -1
  122. package/dist/cabinet/geometry/fronts.js +1 -1
  123. package/dist/cabinet/geometry/run.d.ts.map +1 -1
  124. package/dist/cabinet/geometry/run.js +28 -71
  125. package/dist/cabinet/geometry/sink.d.ts +2 -12
  126. package/dist/cabinet/geometry/sink.d.ts.map +1 -1
  127. package/dist/cabinet/geometry/sink.js +8 -39
  128. package/dist/cabinet/geometry.d.ts.map +1 -1
  129. package/dist/cabinet/geometry.js +63 -1
  130. package/dist/cabinet/hosted-resize.d.ts +8 -0
  131. package/dist/cabinet/hosted-resize.d.ts.map +1 -0
  132. package/dist/cabinet/hosted-resize.js +158 -0
  133. package/dist/cabinet/index.d.ts +1 -0
  134. package/dist/cabinet/index.d.ts.map +1 -1
  135. package/dist/cabinet/index.js +1 -0
  136. package/dist/cabinet/insertion.d.ts +19 -0
  137. package/dist/cabinet/insertion.d.ts.map +1 -0
  138. package/dist/cabinet/insertion.js +49 -0
  139. package/dist/cabinet/move-frame.d.ts.map +1 -1
  140. package/dist/cabinet/move-frame.js +68 -2
  141. package/dist/cabinet/panel-context.d.ts +7 -0
  142. package/dist/cabinet/panel-context.d.ts.map +1 -0
  143. package/dist/cabinet/panel-context.js +16 -0
  144. package/dist/cabinet/panel-visibility.d.ts +9 -0
  145. package/dist/cabinet/panel-visibility.d.ts.map +1 -0
  146. package/dist/cabinet/panel-visibility.js +26 -0
  147. package/dist/cabinet/panel.d.ts.map +1 -1
  148. package/dist/cabinet/panel.js +221 -37
  149. package/dist/cabinet/placement-dimensions.d.ts +42 -0
  150. package/dist/cabinet/placement-dimensions.d.ts.map +1 -0
  151. package/dist/cabinet/placement-dimensions.js +227 -0
  152. package/dist/cabinet/placement-snap.d.ts +21 -1
  153. package/dist/cabinet/placement-snap.d.ts.map +1 -1
  154. package/dist/cabinet/placement-snap.js +48 -6
  155. package/dist/cabinet/preset-width-debt.d.ts +7 -0
  156. package/dist/cabinet/preset-width-debt.d.ts.map +1 -0
  157. package/dist/cabinet/preset-width-debt.js +45 -0
  158. package/dist/cabinet/presets.d.ts.map +1 -1
  159. package/dist/cabinet/presets.js +14 -13
  160. package/dist/cabinet/profiles.d.ts +14 -0
  161. package/dist/cabinet/profiles.d.ts.map +1 -0
  162. package/dist/cabinet/profiles.js +30 -0
  163. package/dist/cabinet/quick-actions.d.ts.map +1 -1
  164. package/dist/cabinet/quick-actions.js +8 -24
  165. package/dist/cabinet/reveals.d.ts +37 -0
  166. package/dist/cabinet/reveals.d.ts.map +1 -0
  167. package/dist/cabinet/reveals.js +13 -0
  168. package/dist/cabinet/run-layout.d.ts +98 -5
  169. package/dist/cabinet/run-layout.d.ts.map +1 -1
  170. package/dist/cabinet/run-layout.js +430 -37
  171. package/dist/cabinet/run-ops.d.ts +204 -12
  172. package/dist/cabinet/run-ops.d.ts.map +1 -1
  173. package/dist/cabinet/run-ops.js +523 -36
  174. package/dist/cabinet/run-panel.d.ts +6 -2
  175. package/dist/cabinet/run-panel.d.ts.map +1 -1
  176. package/dist/cabinet/run-panel.js +294 -108
  177. package/dist/cabinet/stack-transitions.d.ts.map +1 -1
  178. package/dist/cabinet/stack-transitions.js +35 -24
  179. package/dist/cabinet/stack.d.ts +169 -1
  180. package/dist/cabinet/stack.d.ts.map +1 -1
  181. package/dist/cabinet/stack.js +57 -18
  182. package/dist/cabinet/surfaces.d.ts +4 -0
  183. package/dist/cabinet/surfaces.d.ts.map +1 -0
  184. package/dist/cabinet/surfaces.js +101 -0
  185. package/dist/cabinet/tool.d.ts.map +1 -1
  186. package/dist/cabinet/tool.js +615 -91
  187. package/dist/cabinet/tree-structure.d.ts.map +1 -1
  188. package/dist/cabinet/tree-structure.js +10 -9
  189. package/dist/cabinet/validation.d.ts +27 -0
  190. package/dist/cabinet/validation.d.ts.map +1 -0
  191. package/dist/cabinet/validation.js +56 -0
  192. package/dist/cabinet/wall-height-presets.d.ts +12 -0
  193. package/dist/cabinet/wall-height-presets.d.ts.map +1 -0
  194. package/dist/cabinet/wall-height-presets.js +15 -0
  195. package/dist/cabinet/wall-snap.d.ts +27 -3
  196. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  197. package/dist/cabinet/wall-snap.js +278 -62
  198. package/dist/cabinet/widths.d.ts +10 -0
  199. package/dist/cabinet/widths.d.ts.map +1 -0
  200. package/dist/cabinet/widths.js +13 -0
  201. package/dist/ceiling/definition.d.ts.map +1 -1
  202. package/dist/ceiling/definition.js +8 -2
  203. package/dist/ceiling/floorplan-affordances.d.ts +12 -12
  204. package/dist/ceiling/materials.d.ts.map +1 -1
  205. package/dist/ceiling/materials.js +0 -1
  206. package/dist/ceiling/panel.js +1 -1
  207. package/dist/ceiling/parametrics.js +1 -1
  208. package/dist/chimney/definition.js +1 -1
  209. package/dist/chimney/panel.js +9 -9
  210. package/dist/chimney/parametrics.js +3 -3
  211. package/dist/column/definition.d.ts.map +1 -1
  212. package/dist/column/definition.js +22 -4
  213. package/dist/column/panel.d.ts.map +1 -1
  214. package/dist/column/panel.js +37 -7
  215. package/dist/column/parametrics.d.ts.map +1 -1
  216. package/dist/column/parametrics.js +5 -3
  217. package/dist/column/tool.d.ts.map +1 -1
  218. package/dist/column/tool.js +50 -14
  219. package/dist/cupola/definition.d.ts.map +1 -1
  220. package/dist/cupola/definition.js +15 -6
  221. package/dist/cupola/geometry.d.ts +6 -0
  222. package/dist/cupola/geometry.d.ts.map +1 -1
  223. package/dist/cupola/geometry.js +60 -13
  224. package/dist/cupola/paint.d.ts +4 -0
  225. package/dist/cupola/paint.d.ts.map +1 -0
  226. package/dist/cupola/paint.js +39 -0
  227. package/dist/cupola/panel.js +1 -1
  228. package/dist/cupola/parametrics.js +3 -3
  229. package/dist/cupola/renderer.d.ts.map +1 -1
  230. package/dist/cupola/renderer.js +27 -8
  231. package/dist/door/floorplan-move.d.ts.map +1 -1
  232. package/dist/door/floorplan-move.js +1 -1
  233. package/dist/door/move-tool.d.ts.map +1 -1
  234. package/dist/door/move-tool.js +86 -32
  235. package/dist/door/panel.d.ts.map +1 -1
  236. package/dist/door/panel.js +12 -12
  237. package/dist/door/parametrics.js +2 -2
  238. package/dist/door/tool.d.ts.map +1 -1
  239. package/dist/door/tool.js +16 -4
  240. package/dist/dormer/csg-geometry.d.ts +6 -42
  241. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  242. package/dist/dormer/csg-geometry.js +38 -209
  243. package/dist/dormer/definition.d.ts +4 -12
  244. package/dist/dormer/definition.d.ts.map +1 -1
  245. package/dist/dormer/definition.js +18 -193
  246. package/dist/dormer/floorplan.d.ts +3 -3
  247. package/dist/dormer/floorplan.d.ts.map +1 -1
  248. package/dist/dormer/floorplan.js +6 -17
  249. package/dist/dormer/geometry.d.ts +5 -24
  250. package/dist/dormer/geometry.d.ts.map +1 -1
  251. package/dist/dormer/geometry.js +64 -41
  252. package/dist/dormer/index.d.ts +1 -1
  253. package/dist/dormer/index.d.ts.map +1 -1
  254. package/dist/dormer/index.js +1 -1
  255. package/dist/dormer/move-tool.d.ts.map +1 -1
  256. package/dist/dormer/move-tool.js +31 -3
  257. package/dist/dormer/panel-position-section.js +2 -2
  258. package/dist/dormer/panel-windows-section.d.ts +9 -0
  259. package/dist/dormer/panel-windows-section.d.ts.map +1 -0
  260. package/dist/dormer/panel-windows-section.js +7 -0
  261. package/dist/dormer/panel.d.ts.map +1 -1
  262. package/dist/dormer/panel.js +100 -18
  263. package/dist/dormer/parametrics.d.ts.map +1 -1
  264. package/dist/dormer/parametrics.js +8 -77
  265. package/dist/dormer/preview.d.ts.map +1 -1
  266. package/dist/dormer/preview.js +9 -1
  267. package/dist/dormer/renderer.d.ts.map +1 -1
  268. package/dist/dormer/renderer.js +24 -26
  269. package/dist/dormer/tool.d.ts.map +1 -1
  270. package/dist/dormer/tool.js +3 -1
  271. package/dist/dormer/window-layout.d.ts +15 -0
  272. package/dist/dormer/window-layout.d.ts.map +1 -0
  273. package/dist/dormer/window-layout.js +59 -0
  274. package/dist/downspout/definition.d.ts.map +1 -1
  275. package/dist/downspout/definition.js +17 -4
  276. package/dist/downspout/geometry.d.ts.map +1 -1
  277. package/dist/downspout/geometry.js +10 -0
  278. package/dist/downspout/inspector-editors.d.ts.map +1 -1
  279. package/dist/downspout/inspector-editors.js +9 -1
  280. package/dist/downspout/parametrics.d.ts.map +1 -1
  281. package/dist/downspout/parametrics.js +2 -1
  282. package/dist/downspout/renderer.d.ts.map +1 -1
  283. package/dist/downspout/renderer.js +19 -3
  284. package/dist/downspout/system.d.ts +7 -0
  285. package/dist/downspout/system.d.ts.map +1 -0
  286. package/dist/downspout/system.js +114 -0
  287. package/dist/duct-fitting/accessory-geometry.d.ts +4 -0
  288. package/dist/duct-fitting/accessory-geometry.d.ts.map +1 -0
  289. package/dist/duct-fitting/accessory-geometry.js +47 -0
  290. package/dist/duct-fitting/definition.d.ts.map +1 -1
  291. package/dist/duct-fitting/definition.js +11 -1
  292. package/dist/duct-fitting/floorplan.d.ts.map +1 -1
  293. package/dist/duct-fitting/floorplan.js +8 -0
  294. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  295. package/dist/duct-fitting/geometry.js +52 -38
  296. package/dist/duct-fitting/parametrics.d.ts.map +1 -1
  297. package/dist/duct-fitting/parametrics.js +78 -15
  298. package/dist/duct-fitting/ports.d.ts +1 -0
  299. package/dist/duct-fitting/ports.d.ts.map +1 -1
  300. package/dist/duct-fitting/ports.js +46 -0
  301. package/dist/duct-fitting/tool.d.ts +19 -0
  302. package/dist/duct-fitting/tool.d.ts.map +1 -1
  303. package/dist/duct-fitting/tool.js +126 -34
  304. package/dist/duct-segment/continuation.d.ts +21 -0
  305. package/dist/duct-segment/continuation.d.ts.map +1 -0
  306. package/dist/duct-segment/continuation.js +167 -0
  307. package/dist/duct-segment/definition.d.ts.map +1 -1
  308. package/dist/duct-segment/definition.js +19 -18
  309. package/dist/duct-segment/floorplan.d.ts.map +1 -1
  310. package/dist/duct-segment/floorplan.js +43 -0
  311. package/dist/duct-segment/geometry.d.ts.map +1 -1
  312. package/dist/duct-segment/geometry.js +3 -0
  313. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  314. package/dist/duct-segment/move-tool.js +33 -6
  315. package/dist/duct-segment/parametrics.d.ts.map +1 -1
  316. package/dist/duct-segment/parametrics.js +49 -1
  317. package/dist/duct-segment/selection.d.ts +3 -4
  318. package/dist/duct-segment/selection.d.ts.map +1 -1
  319. package/dist/duct-segment/selection.js +186 -158
  320. package/dist/duct-segment/tool.d.ts +38 -0
  321. package/dist/duct-segment/tool.d.ts.map +1 -1
  322. package/dist/duct-segment/tool.js +306 -677
  323. package/dist/duct-terminal/parametrics.js +2 -2
  324. package/dist/duct-terminal/tool.d.ts.map +1 -1
  325. package/dist/duct-terminal/tool.js +37 -7
  326. package/dist/elevator/panel.d.ts.map +1 -1
  327. package/dist/elevator/panel.js +7 -7
  328. package/dist/elevator/system.d.ts.map +1 -1
  329. package/dist/elevator/system.js +10 -1
  330. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  331. package/dist/eyebrow-vent/definition.js +8 -5
  332. package/dist/eyebrow-vent/geometry.d.ts +4 -0
  333. package/dist/eyebrow-vent/geometry.d.ts.map +1 -1
  334. package/dist/eyebrow-vent/geometry.js +60 -15
  335. package/dist/eyebrow-vent/paint.d.ts +4 -0
  336. package/dist/eyebrow-vent/paint.d.ts.map +1 -0
  337. package/dist/eyebrow-vent/paint.js +33 -0
  338. package/dist/eyebrow-vent/panel.js +1 -1
  339. package/dist/eyebrow-vent/parametrics.js +3 -3
  340. package/dist/eyebrow-vent/renderer.d.ts.map +1 -1
  341. package/dist/eyebrow-vent/renderer.js +27 -8
  342. package/dist/fence/definition.d.ts.map +1 -1
  343. package/dist/fence/definition.js +2 -1
  344. package/dist/fence/floorplan-affordances.d.ts +1 -0
  345. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  346. package/dist/fence/floorplan-affordances.js +30 -1
  347. package/dist/fence/floorplan.d.ts.map +1 -1
  348. package/dist/fence/floorplan.js +14 -0
  349. package/dist/fence/inspector-editors.js +1 -1
  350. package/dist/fence/parametrics.js +3 -3
  351. package/dist/fence/tool.d.ts.map +1 -1
  352. package/dist/fence/tool.js +47 -20
  353. package/dist/gutter/corner-mitre.d.ts.map +1 -1
  354. package/dist/gutter/corner-mitre.js +47 -7
  355. package/dist/gutter/definition.d.ts.map +1 -1
  356. package/dist/gutter/definition.js +23 -13
  357. package/dist/gutter/eave-align.d.ts.map +1 -1
  358. package/dist/gutter/eave-align.js +10 -0
  359. package/dist/gutter/eave-snap.d.ts +1 -1
  360. package/dist/gutter/eave-snap.d.ts.map +1 -1
  361. package/dist/gutter/eave-snap.js +10 -23
  362. package/dist/gutter/geometry.d.ts.map +1 -1
  363. package/dist/gutter/geometry.js +126 -8
  364. package/dist/gutter/outlet-lookup.d.ts.map +1 -1
  365. package/dist/gutter/outlet-lookup.js +22 -1
  366. package/dist/gutter/paint.d.ts +3 -0
  367. package/dist/gutter/paint.d.ts.map +1 -0
  368. package/dist/gutter/paint.js +6 -0
  369. package/dist/gutter/parametrics.d.ts.map +1 -1
  370. package/dist/gutter/parametrics.js +4 -1
  371. package/dist/gutter/renderer.d.ts.map +1 -1
  372. package/dist/gutter/renderer.js +63 -7
  373. package/dist/gutter/trim-clip.d.ts +3 -0
  374. package/dist/gutter/trim-clip.d.ts.map +1 -0
  375. package/dist/gutter/trim-clip.js +5 -0
  376. package/dist/hvac-equipment/parametrics.js +3 -3
  377. package/dist/hvac-equipment/tool.d.ts.map +1 -1
  378. package/dist/hvac-equipment/tool.js +12 -2
  379. package/dist/imported-mesh/definition.d.ts +5 -0
  380. package/dist/imported-mesh/definition.d.ts.map +1 -0
  381. package/dist/imported-mesh/definition.js +38 -0
  382. package/dist/imported-mesh/floorplan.d.ts +4 -0
  383. package/dist/imported-mesh/floorplan.d.ts.map +1 -0
  384. package/dist/imported-mesh/floorplan.js +34 -0
  385. package/dist/imported-mesh/geometry.d.ts +5 -0
  386. package/dist/imported-mesh/geometry.d.ts.map +1 -0
  387. package/dist/imported-mesh/geometry.js +34 -0
  388. package/dist/imported-mesh/index.d.ts +4 -0
  389. package/dist/imported-mesh/index.d.ts.map +1 -0
  390. package/dist/imported-mesh/index.js +3 -0
  391. package/dist/imported-mesh/schema.d.ts +2 -0
  392. package/dist/imported-mesh/schema.d.ts.map +1 -0
  393. package/dist/imported-mesh/schema.js +1 -0
  394. package/dist/index.d.ts +7 -2
  395. package/dist/index.d.ts.map +1 -1
  396. package/dist/index.js +17 -2
  397. package/dist/item/definition.d.ts.map +1 -1
  398. package/dist/item/definition.js +10 -2
  399. package/dist/item/floorplan-move.d.ts +9 -1
  400. package/dist/item/floorplan-move.d.ts.map +1 -1
  401. package/dist/item/floorplan-move.js +74 -2
  402. package/dist/item/floorplan.d.ts.map +1 -1
  403. package/dist/item/floorplan.js +33 -1
  404. package/dist/item/move-tool.d.ts +28 -1
  405. package/dist/item/move-tool.d.ts.map +1 -1
  406. package/dist/item/move-tool.js +15 -3
  407. package/dist/item/panel.js +1 -1
  408. package/dist/item/renderer.d.ts.map +1 -1
  409. package/dist/item/renderer.js +16 -6
  410. package/dist/item/system.d.ts +5 -0
  411. package/dist/item/system.d.ts.map +1 -1
  412. package/dist/item/system.js +7 -1
  413. package/dist/lean-to-extension/arc.d.ts +14 -0
  414. package/dist/lean-to-extension/arc.d.ts.map +1 -0
  415. package/dist/lean-to-extension/arc.js +56 -0
  416. package/dist/lean-to-extension/assembly.d.ts +61 -0
  417. package/dist/lean-to-extension/assembly.d.ts.map +1 -0
  418. package/dist/lean-to-extension/assembly.js +761 -0
  419. package/dist/lean-to-extension/canopy-joint.d.ts +35 -0
  420. package/dist/lean-to-extension/canopy-joint.d.ts.map +1 -0
  421. package/dist/lean-to-extension/canopy-joint.js +234 -0
  422. package/dist/lean-to-extension/conical-host.d.ts +15 -0
  423. package/dist/lean-to-extension/conical-host.d.ts.map +1 -0
  424. package/dist/lean-to-extension/conical-host.js +113 -0
  425. package/dist/lean-to-extension/corner-joint.d.ts +29 -0
  426. package/dist/lean-to-extension/corner-joint.d.ts.map +1 -0
  427. package/dist/lean-to-extension/corner-joint.js +1202 -0
  428. package/dist/lean-to-extension/definition.d.ts +4 -0
  429. package/dist/lean-to-extension/definition.d.ts.map +1 -0
  430. package/dist/lean-to-extension/definition.js +433 -0
  431. package/dist/lean-to-extension/floorplan-affordances.d.ts +4 -0
  432. package/dist/lean-to-extension/floorplan-affordances.d.ts.map +1 -0
  433. package/dist/lean-to-extension/floorplan-affordances.js +144 -0
  434. package/dist/lean-to-extension/floorplan-move.d.ts +3 -0
  435. package/dist/lean-to-extension/floorplan-move.d.ts.map +1 -0
  436. package/dist/lean-to-extension/floorplan-move.js +157 -0
  437. package/dist/lean-to-extension/floorplan-tool.d.ts +4 -0
  438. package/dist/lean-to-extension/floorplan-tool.d.ts.map +1 -0
  439. package/dist/lean-to-extension/floorplan-tool.js +385 -0
  440. package/dist/lean-to-extension/floorplan.d.ts +3 -0
  441. package/dist/lean-to-extension/floorplan.d.ts.map +1 -0
  442. package/dist/lean-to-extension/floorplan.js +373 -0
  443. package/dist/lean-to-extension/geometry.d.ts +7 -0
  444. package/dist/lean-to-extension/geometry.d.ts.map +1 -0
  445. package/dist/lean-to-extension/geometry.js +662 -0
  446. package/dist/lean-to-extension/index.d.ts +8 -0
  447. package/dist/lean-to-extension/index.d.ts.map +1 -0
  448. package/dist/lean-to-extension/index.js +7 -0
  449. package/dist/lean-to-extension/layout.d.ts +108 -0
  450. package/dist/lean-to-extension/layout.d.ts.map +1 -0
  451. package/dist/lean-to-extension/layout.js +477 -0
  452. package/dist/lean-to-extension/managed-preview.d.ts +3 -0
  453. package/dist/lean-to-extension/managed-preview.d.ts.map +1 -0
  454. package/dist/lean-to-extension/managed-preview.js +93 -0
  455. package/dist/lean-to-extension/move-tool.d.ts +8 -0
  456. package/dist/lean-to-extension/move-tool.d.ts.map +1 -0
  457. package/dist/lean-to-extension/move-tool.js +202 -0
  458. package/dist/lean-to-extension/paint.d.ts +2 -0
  459. package/dist/lean-to-extension/paint.d.ts.map +1 -0
  460. package/dist/lean-to-extension/paint.js +16 -0
  461. package/dist/lean-to-extension/parametrics.d.ts +4 -0
  462. package/dist/lean-to-extension/parametrics.d.ts.map +1 -0
  463. package/dist/lean-to-extension/parametrics.js +570 -0
  464. package/dist/lean-to-extension/placement-scope.d.ts +3 -0
  465. package/dist/lean-to-extension/placement-scope.d.ts.map +1 -0
  466. package/dist/lean-to-extension/placement-scope.js +4 -0
  467. package/dist/lean-to-extension/placement-validation.d.ts +4 -0
  468. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -0
  469. package/dist/lean-to-extension/placement-validation.js +324 -0
  470. package/dist/lean-to-extension/placement.d.ts +59 -0
  471. package/dist/lean-to-extension/placement.d.ts.map +1 -0
  472. package/dist/lean-to-extension/placement.js +331 -0
  473. package/dist/lean-to-extension/plan-footprint.d.ts +10 -0
  474. package/dist/lean-to-extension/plan-footprint.d.ts.map +1 -0
  475. package/dist/lean-to-extension/plan-footprint.js +27 -0
  476. package/dist/lean-to-extension/preview-geometry.d.ts +7 -0
  477. package/dist/lean-to-extension/preview-geometry.d.ts.map +1 -0
  478. package/dist/lean-to-extension/preview-geometry.js +40 -0
  479. package/dist/lean-to-extension/preview.d.ts +7 -0
  480. package/dist/lean-to-extension/preview.d.ts.map +1 -0
  481. package/dist/lean-to-extension/preview.js +20 -0
  482. package/dist/lean-to-extension/renderer.d.ts +6 -0
  483. package/dist/lean-to-extension/renderer.d.ts.map +1 -0
  484. package/dist/lean-to-extension/renderer.js +34 -0
  485. package/dist/lean-to-extension/roof-attachment.d.ts +28 -0
  486. package/dist/lean-to-extension/roof-attachment.d.ts.map +1 -0
  487. package/dist/lean-to-extension/roof-attachment.js +376 -0
  488. package/dist/lean-to-extension/schema.d.ts +2 -0
  489. package/dist/lean-to-extension/schema.d.ts.map +1 -0
  490. package/dist/lean-to-extension/schema.js +1 -0
  491. package/dist/lean-to-extension/slots.d.ts +5 -0
  492. package/dist/lean-to-extension/slots.d.ts.map +1 -0
  493. package/dist/lean-to-extension/slots.js +15 -0
  494. package/dist/lean-to-extension/system.d.ts +7 -0
  495. package/dist/lean-to-extension/system.d.ts.map +1 -0
  496. package/dist/lean-to-extension/system.js +726 -0
  497. package/dist/lean-to-extension/tool.d.ts +3 -0
  498. package/dist/lean-to-extension/tool.d.ts.map +1 -0
  499. package/dist/lean-to-extension/tool.js +580 -0
  500. package/dist/lean-to-extension/wall-target.d.ts +10 -0
  501. package/dist/lean-to-extension/wall-target.d.ts.map +1 -0
  502. package/dist/lean-to-extension/wall-target.js +29 -0
  503. package/dist/lineset/definition.d.ts.map +1 -1
  504. package/dist/lineset/definition.js +1 -0
  505. package/dist/liquid-line/definition.d.ts.map +1 -1
  506. package/dist/liquid-line/definition.js +1 -0
  507. package/dist/pipe-fitting/definition.d.ts.map +1 -1
  508. package/dist/pipe-fitting/definition.js +16 -2
  509. package/dist/pipe-fitting/floorplan.d.ts.map +1 -1
  510. package/dist/pipe-fitting/floorplan.js +4 -0
  511. package/dist/pipe-fitting/geometry.d.ts +3 -5
  512. package/dist/pipe-fitting/geometry.d.ts.map +1 -1
  513. package/dist/pipe-fitting/geometry.js +154 -21
  514. package/dist/pipe-fitting/inline-insertion.d.ts +13 -0
  515. package/dist/pipe-fitting/inline-insertion.d.ts.map +1 -0
  516. package/dist/pipe-fitting/inline-insertion.js +96 -0
  517. package/dist/pipe-fitting/parametrics.d.ts.map +1 -1
  518. package/dist/pipe-fitting/parametrics.js +17 -3
  519. package/dist/pipe-fitting/ports.d.ts.map +1 -1
  520. package/dist/pipe-fitting/ports.js +8 -1
  521. package/dist/pipe-fitting/tool.d.ts +26 -0
  522. package/dist/pipe-fitting/tool.d.ts.map +1 -1
  523. package/dist/pipe-fitting/tool.js +182 -37
  524. package/dist/pipe-segment/continuation.d.ts +22 -0
  525. package/dist/pipe-segment/continuation.d.ts.map +1 -0
  526. package/dist/pipe-segment/continuation.js +146 -0
  527. package/dist/pipe-segment/definition.d.ts.map +1 -1
  528. package/dist/pipe-segment/definition.js +23 -7
  529. package/dist/pipe-segment/floorplan.d.ts.map +1 -1
  530. package/dist/pipe-segment/floorplan.js +42 -0
  531. package/dist/pipe-segment/geometry.d.ts +2 -1
  532. package/dist/pipe-segment/geometry.d.ts.map +1 -1
  533. package/dist/pipe-segment/geometry.js +4 -1
  534. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  535. package/dist/pipe-segment/move-tool.js +25 -5
  536. package/dist/pipe-segment/parametrics.d.ts.map +1 -1
  537. package/dist/pipe-segment/parametrics.js +49 -0
  538. package/dist/pipe-segment/selection.d.ts +3 -4
  539. package/dist/pipe-segment/selection.d.ts.map +1 -1
  540. package/dist/pipe-segment/selection.js +169 -105
  541. package/dist/pipe-segment/slope.d.ts +5 -0
  542. package/dist/pipe-segment/slope.d.ts.map +1 -0
  543. package/dist/pipe-segment/slope.js +10 -0
  544. package/dist/pipe-segment/tool.d.ts.map +1 -1
  545. package/dist/pipe-segment/tool.js +325 -545
  546. package/dist/pipe-trap/tool.d.ts.map +1 -1
  547. package/dist/pipe-trap/tool.js +15 -2
  548. package/dist/procedural-item/definition.d.ts +4 -0
  549. package/dist/procedural-item/definition.d.ts.map +1 -0
  550. package/dist/procedural-item/definition.js +254 -0
  551. package/dist/procedural-item/geometry.d.ts +31 -0
  552. package/dist/procedural-item/geometry.d.ts.map +1 -0
  553. package/dist/procedural-item/geometry.js +88 -0
  554. package/dist/procedural-item/index.d.ts +3 -0
  555. package/dist/procedural-item/index.d.ts.map +1 -0
  556. package/dist/procedural-item/index.js +2 -0
  557. package/dist/procedural-item/move-session.d.ts +15 -0
  558. package/dist/procedural-item/move-session.d.ts.map +1 -0
  559. package/dist/procedural-item/move-session.js +197 -0
  560. package/dist/procedural-item/move-tool.d.ts +5 -0
  561. package/dist/procedural-item/move-tool.d.ts.map +1 -0
  562. package/dist/procedural-item/move-tool.js +193 -0
  563. package/dist/procedural-item/renderer.d.ts +5 -0
  564. package/dist/procedural-item/renderer.d.ts.map +1 -0
  565. package/dist/procedural-item/renderer.js +66 -0
  566. package/dist/ridge-vent/definition.js +1 -1
  567. package/dist/ridge-vent/panel.d.ts.map +1 -1
  568. package/dist/ridge-vent/panel.js +4 -4
  569. package/dist/ridge-vent/parametrics.js +1 -1
  570. package/dist/roof/conical-roof-placement.d.ts +36 -0
  571. package/dist/roof/conical-roof-placement.d.ts.map +1 -0
  572. package/dist/roof/conical-roof-placement.js +134 -0
  573. package/dist/roof/conical-roof.d.ts +3 -0
  574. package/dist/roof/conical-roof.d.ts.map +1 -0
  575. package/dist/roof/conical-roof.js +53 -0
  576. package/dist/roof/definition.d.ts +3 -10
  577. package/dist/roof/definition.d.ts.map +1 -1
  578. package/dist/roof/definition.js +83 -13
  579. package/dist/roof/floorplan.d.ts +3 -10
  580. package/dist/roof/floorplan.d.ts.map +1 -1
  581. package/dist/roof/floorplan.js +139 -165
  582. package/dist/roof/index.d.ts +1 -0
  583. package/dist/roof/index.d.ts.map +1 -1
  584. package/dist/roof/index.js +1 -0
  585. package/dist/roof/panel.d.ts.map +1 -1
  586. package/dist/roof/panel.js +26 -25
  587. package/dist/roof/renderer.d.ts.map +1 -1
  588. package/dist/roof/roof-footprint-source.d.ts +16 -0
  589. package/dist/roof/roof-footprint-source.d.ts.map +1 -0
  590. package/dist/roof/roof-footprint-source.js +14 -0
  591. package/dist/roof/roof-footprint.d.ts +25 -0
  592. package/dist/roof/roof-footprint.d.ts.map +1 -0
  593. package/dist/roof/roof-footprint.js +94 -0
  594. package/dist/roof/roof-placement-mode.d.ts +18 -0
  595. package/dist/roof/roof-placement-mode.d.ts.map +1 -0
  596. package/dist/roof/roof-placement-mode.js +24 -0
  597. package/dist/roof/tool.d.ts +10 -0
  598. package/dist/roof/tool.d.ts.map +1 -0
  599. package/dist/roof/tool.js +922 -0
  600. package/dist/roof-segment/definition.d.ts.map +1 -1
  601. package/dist/roof-segment/definition.js +52 -8
  602. package/dist/roof-segment/floorplan-affordances.d.ts +5 -6
  603. package/dist/roof-segment/floorplan-affordances.d.ts.map +1 -1
  604. package/dist/roof-segment/floorplan-affordances.js +64 -18
  605. package/dist/roof-segment/floorplan.d.ts +3 -2
  606. package/dist/roof-segment/floorplan.d.ts.map +1 -1
  607. package/dist/roof-segment/floorplan.js +95 -46
  608. package/dist/roof-segment/panel.d.ts.map +1 -1
  609. package/dist/roof-segment/panel.js +122 -27
  610. package/dist/scan/definition.d.ts +2 -3
  611. package/dist/scan/definition.d.ts.map +1 -1
  612. package/dist/scan/definition.js +9 -7
  613. package/dist/scan/parametrics.d.ts.map +1 -1
  614. package/dist/scan/parametrics.js +13 -1
  615. package/dist/scan/renderer.d.ts.map +1 -1
  616. package/dist/scan/renderer.js +8 -2
  617. package/dist/shared/accessory-cursor.d.ts +7 -0
  618. package/dist/shared/accessory-cursor.d.ts.map +1 -0
  619. package/dist/shared/accessory-cursor.js +83 -0
  620. package/dist/shared/accessory-floorplan.d.ts +4 -0
  621. package/dist/shared/accessory-floorplan.d.ts.map +1 -0
  622. package/dist/shared/accessory-floorplan.js +51 -0
  623. package/dist/shared/accessory-geometry.d.ts +7 -0
  624. package/dist/shared/accessory-geometry.d.ts.map +1 -0
  625. package/dist/shared/accessory-geometry.js +79 -0
  626. package/dist/shared/accessory-placement.d.ts +10 -0
  627. package/dist/shared/accessory-placement.d.ts.map +1 -0
  628. package/dist/shared/accessory-placement.js +126 -0
  629. package/dist/shared/accessory-snapping.d.ts +5 -0
  630. package/dist/shared/accessory-snapping.d.ts.map +1 -0
  631. package/dist/shared/accessory-snapping.js +40 -0
  632. package/dist/shared/automatic-run-end-cap.d.ts +12 -0
  633. package/dist/shared/automatic-run-end-cap.d.ts.map +1 -0
  634. package/dist/shared/automatic-run-end-cap.js +169 -0
  635. package/dist/shared/block-face-host.d.ts +15 -0
  636. package/dist/shared/block-face-host.d.ts.map +1 -0
  637. package/dist/shared/block-face-host.js +36 -0
  638. package/dist/shared/connection-compatibility.d.ts +8 -0
  639. package/dist/shared/connection-compatibility.d.ts.map +1 -0
  640. package/dist/shared/connection-compatibility.js +28 -0
  641. package/dist/shared/connection-feedback.d.ts +10 -0
  642. package/dist/shared/connection-feedback.d.ts.map +1 -0
  643. package/dist/shared/connection-feedback.js +17 -0
  644. package/dist/shared/distribution-run-contract.d.ts +49 -0
  645. package/dist/shared/distribution-run-contract.d.ts.map +1 -0
  646. package/dist/shared/distribution-run-contract.js +30 -0
  647. package/dist/shared/distribution-run-tool.d.ts +117 -0
  648. package/dist/shared/distribution-run-tool.d.ts.map +1 -0
  649. package/dist/shared/distribution-run-tool.js +986 -0
  650. package/dist/shared/dormer-wall-opening-placement.d.ts +21 -0
  651. package/dist/shared/dormer-wall-opening-placement.d.ts.map +1 -0
  652. package/dist/shared/dormer-wall-opening-placement.js +101 -0
  653. package/dist/shared/duct-adapter.d.ts +10 -0
  654. package/dist/shared/duct-adapter.d.ts.map +1 -0
  655. package/dist/shared/duct-adapter.js +43 -0
  656. package/dist/shared/elbow-branch-continuation.d.ts +20 -0
  657. package/dist/shared/elbow-branch-continuation.d.ts.map +1 -0
  658. package/dist/shared/elbow-branch-continuation.js +200 -0
  659. package/dist/shared/fitting-clearance.d.ts +5 -0
  660. package/dist/shared/fitting-clearance.d.ts.map +1 -0
  661. package/dist/shared/fitting-clearance.js +11 -0
  662. package/dist/shared/fitting-deletion-cleanup.d.ts +14 -0
  663. package/dist/shared/fitting-deletion-cleanup.d.ts.map +1 -0
  664. package/dist/shared/fitting-deletion-cleanup.js +297 -0
  665. package/dist/shared/fitting-surface-support.d.ts +5 -0
  666. package/dist/shared/fitting-surface-support.d.ts.map +1 -0
  667. package/dist/shared/fitting-surface-support.js +42 -0
  668. package/dist/shared/fitting-tool-options.d.ts +4 -0
  669. package/dist/shared/fitting-tool-options.d.ts.map +1 -0
  670. package/dist/shared/fitting-tool-options.js +175 -0
  671. package/dist/shared/floor-placement.d.ts +1 -1
  672. package/dist/shared/floor-placement.d.ts.map +1 -1
  673. package/dist/shared/floor-placement.js +13 -33
  674. package/dist/shared/ghost-materials.d.ts.map +1 -1
  675. package/dist/shared/ghost-materials.js +2 -1
  676. package/dist/shared/lean-to-post-omissions.d.ts +8 -0
  677. package/dist/shared/lean-to-post-omissions.d.ts.map +1 -0
  678. package/dist/shared/lean-to-post-omissions.js +51 -0
  679. package/dist/shared/mep-fitting-actions.d.ts +5 -0
  680. package/dist/shared/mep-fitting-actions.d.ts.map +1 -0
  681. package/dist/shared/mep-fitting-actions.js +16 -0
  682. package/dist/shared/mep-presets.d.ts +11 -0
  683. package/dist/shared/mep-presets.d.ts.map +1 -0
  684. package/dist/shared/mep-presets.js +34 -0
  685. package/dist/shared/node-batch/candidates.d.ts +29 -0
  686. package/dist/shared/node-batch/candidates.d.ts.map +1 -0
  687. package/dist/shared/node-batch/candidates.js +260 -0
  688. package/dist/shared/node-batch/store.d.ts +26 -0
  689. package/dist/shared/node-batch/store.d.ts.map +1 -0
  690. package/dist/shared/node-batch/store.js +319 -0
  691. package/dist/shared/node-batch/system.d.ts +8 -0
  692. package/dist/shared/node-batch/system.d.ts.map +1 -0
  693. package/dist/shared/node-batch/system.js +569 -0
  694. package/dist/shared/node-batch/types.d.ts +99 -0
  695. package/dist/shared/node-batch/types.d.ts.map +1 -0
  696. package/dist/shared/node-batch/types.js +4 -0
  697. package/dist/shared/opening-move-history.d.ts +47 -0
  698. package/dist/shared/opening-move-history.d.ts.map +1 -0
  699. package/dist/shared/opening-move-history.js +18 -0
  700. package/dist/shared/opening-move-wall-gate.d.ts +55 -0
  701. package/dist/shared/opening-move-wall-gate.d.ts.map +1 -0
  702. package/dist/shared/opening-move-wall-gate.js +44 -0
  703. package/dist/shared/panel-fields.d.ts +15 -0
  704. package/dist/shared/panel-fields.d.ts.map +1 -0
  705. package/dist/shared/panel-fields.js +31 -0
  706. package/dist/shared/path-point-affordance.d.ts +2 -2
  707. package/dist/shared/path-point-affordance.d.ts.map +1 -1
  708. package/dist/shared/path-point-affordance.js +30 -6
  709. package/dist/shared/placeholder-geometry.d.ts.map +1 -1
  710. package/dist/shared/placeholder-geometry.js +4 -0
  711. package/dist/shared/ports.d.ts +20 -3
  712. package/dist/shared/ports.d.ts.map +1 -1
  713. package/dist/shared/ports.js +148 -7
  714. package/dist/shared/primitive-uv.d.ts +17 -0
  715. package/dist/shared/primitive-uv.d.ts.map +1 -0
  716. package/dist/shared/primitive-uv.js +107 -0
  717. package/dist/shared/reducer-size.d.ts +2 -0
  718. package/dist/shared/reducer-size.d.ts.map +1 -0
  719. package/dist/shared/reducer-size.js +12 -0
  720. package/dist/shared/resting-surface-plan.d.ts +3 -0
  721. package/dist/shared/resting-surface-plan.d.ts.map +1 -0
  722. package/dist/shared/resting-surface-plan.js +28 -0
  723. package/dist/shared/ridge-snap.js +1 -1
  724. package/dist/shared/roof-surface.d.ts.map +1 -1
  725. package/dist/shared/roof-surface.js +17 -2
  726. package/dist/shared/run-cursor.d.ts +22 -0
  727. package/dist/shared/run-cursor.d.ts.map +1 -0
  728. package/dist/shared/run-cursor.js +19 -0
  729. package/dist/shared/run-direction-feedback.d.ts +20 -0
  730. package/dist/shared/run-direction-feedback.d.ts.map +1 -0
  731. package/dist/shared/run-direction-feedback.js +139 -0
  732. package/dist/shared/run-hanger-controls.d.ts +7 -0
  733. package/dist/shared/run-hanger-controls.d.ts.map +1 -0
  734. package/dist/shared/run-hanger-controls.js +44 -0
  735. package/dist/shared/run-hanger-inspector.d.ts +5 -0
  736. package/dist/shared/run-hanger-inspector.d.ts.map +1 -0
  737. package/dist/shared/run-hanger-inspector.js +43 -0
  738. package/dist/shared/run-hanger-mode.d.ts +11 -0
  739. package/dist/shared/run-hanger-mode.d.ts.map +1 -0
  740. package/dist/shared/run-hanger-mode.js +32 -0
  741. package/dist/shared/run-hanger-system.d.ts +3 -0
  742. package/dist/shared/run-hanger-system.d.ts.map +1 -0
  743. package/dist/shared/run-hanger-system.js +39 -0
  744. package/dist/shared/run-hangers.d.ts +25 -0
  745. package/dist/shared/run-hangers.d.ts.map +1 -0
  746. package/dist/shared/run-hangers.js +261 -0
  747. package/dist/shared/run-port-snap.d.ts +11 -0
  748. package/dist/shared/run-port-snap.d.ts.map +1 -0
  749. package/dist/shared/run-port-snap.js +19 -0
  750. package/dist/shared/run-screen-direction.d.ts +5 -0
  751. package/dist/shared/run-screen-direction.d.ts.map +1 -0
  752. package/dist/shared/run-screen-direction.js +24 -0
  753. package/dist/shared/selection-handles.d.ts +4 -0
  754. package/dist/shared/selection-handles.d.ts.map +1 -1
  755. package/dist/shared/selection-handles.js +10 -0
  756. package/dist/shared/slot-paint.d.ts +8 -1
  757. package/dist/shared/slot-paint.d.ts.map +1 -1
  758. package/dist/shared/slot-paint.js +120 -27
  759. package/dist/shared/surface-paint.d.ts +1 -2
  760. package/dist/shared/surface-paint.d.ts.map +1 -1
  761. package/dist/shared/surface-paint.js +9 -20
  762. package/dist/shared/system-check-panel.d.ts +6 -0
  763. package/dist/shared/system-check-panel.d.ts.map +1 -0
  764. package/dist/shared/system-check-panel.js +62 -0
  765. package/dist/shared/system-checks.d.ts +9 -0
  766. package/dist/shared/system-checks.d.ts.map +1 -0
  767. package/dist/shared/system-checks.js +131 -0
  768. package/dist/shared/wall-attach-target.d.ts +14 -2
  769. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  770. package/dist/shared/wall-attach-target.js +108 -4
  771. package/dist/shared/wall-opening-clearance.d.ts +19 -0
  772. package/dist/shared/wall-opening-clearance.d.ts.map +1 -0
  773. package/dist/shared/wall-opening-clearance.js +28 -0
  774. package/dist/shared/wall-run-move.d.ts +17 -0
  775. package/dist/shared/wall-run-move.d.ts.map +1 -0
  776. package/dist/shared/wall-run-move.js +56 -0
  777. package/dist/shelf/definition.d.ts.map +1 -1
  778. package/dist/shelf/definition.js +2 -1
  779. package/dist/shelf/floorplan-affordances.d.ts.map +1 -1
  780. package/dist/shelf/floorplan-affordances.js +5 -3
  781. package/dist/shelf/floorplan-move.d.ts.map +1 -1
  782. package/dist/shelf/floorplan-move.js +3 -2
  783. package/dist/shelf/geometry.d.ts.map +1 -1
  784. package/dist/shelf/geometry.js +2 -10
  785. package/dist/shelf/parametrics.js +4 -4
  786. package/dist/site/renderer.d.ts.map +1 -1
  787. package/dist/site/renderer.js +40 -28
  788. package/dist/site/terrain-geometry.d.ts +1 -1
  789. package/dist/site/terrain-geometry.d.ts.map +1 -1
  790. package/dist/site/terrain-geometry.js +35 -9
  791. package/dist/site/terrain-mesh.d.ts +5 -0
  792. package/dist/site/terrain-mesh.d.ts.map +1 -1
  793. package/dist/site/terrain-mesh.js +63 -34
  794. package/dist/skylight/definition.js +1 -1
  795. package/dist/skylight/panel.js +6 -6
  796. package/dist/skylight/parametrics.js +2 -2
  797. package/dist/slab/definition.d.ts.map +1 -1
  798. package/dist/slab/definition.js +6 -1
  799. package/dist/slab/dependency-tracker.d.ts +3 -0
  800. package/dist/slab/dependency-tracker.d.ts.map +1 -0
  801. package/dist/slab/dependency-tracker.js +104 -0
  802. package/dist/slab/floorplan-affordances.d.ts +8 -8
  803. package/dist/slab/geometry.d.ts.map +1 -1
  804. package/dist/slab/geometry.js +16 -2
  805. package/dist/slab/panel.js +1 -1
  806. package/dist/slab/parametrics.js +1 -1
  807. package/dist/slab/system.d.ts.map +1 -1
  808. package/dist/slab/system.js +8 -64
  809. package/dist/solar-panel/definition.js +1 -1
  810. package/dist/solar-panel/panel.js +2 -2
  811. package/dist/solar-panel/parametrics.js +2 -2
  812. package/dist/spawn/panel.js +1 -1
  813. package/dist/stair/panel.d.ts.map +1 -1
  814. package/dist/stair/panel.js +23 -16
  815. package/dist/stair/stair-type.d.ts +18 -0
  816. package/dist/stair/stair-type.d.ts.map +1 -0
  817. package/dist/stair/stair-type.js +25 -0
  818. package/dist/stair-segment/panel.d.ts.map +1 -1
  819. package/dist/stair-segment/panel.js +45 -6
  820. package/dist/turbine-vent/definition.d.ts.map +1 -1
  821. package/dist/turbine-vent/definition.js +8 -5
  822. package/dist/turbine-vent/geometry.d.ts.map +1 -1
  823. package/dist/turbine-vent/geometry.js +48 -18
  824. package/dist/turbine-vent/paint.d.ts +4 -0
  825. package/dist/turbine-vent/paint.d.ts.map +1 -0
  826. package/dist/turbine-vent/paint.js +35 -0
  827. package/dist/turbine-vent/panel.js +1 -1
  828. package/dist/turbine-vent/parametrics.js +2 -2
  829. package/dist/turbine-vent/renderer.d.ts.map +1 -1
  830. package/dist/turbine-vent/renderer.js +31 -9
  831. package/dist/unit/definition.d.ts +10 -0
  832. package/dist/unit/definition.d.ts.map +1 -0
  833. package/dist/unit/definition.js +38 -0
  834. package/dist/unit/index.d.ts +2 -0
  835. package/dist/unit/index.d.ts.map +1 -0
  836. package/dist/unit/index.js +1 -0
  837. package/dist/unit/parametrics.d.ts +3 -0
  838. package/dist/unit/parametrics.d.ts.map +1 -0
  839. package/dist/unit/parametrics.js +4 -0
  840. package/dist/unit/schema.d.ts +2 -0
  841. package/dist/unit/schema.d.ts.map +1 -0
  842. package/dist/unit/schema.js +1 -0
  843. package/dist/unit/unit-panel.d.ts +5 -0
  844. package/dist/unit/unit-panel.d.ts.map +1 -0
  845. package/dist/unit/unit-panel.js +61 -0
  846. package/dist/wall/curve-eligibility.d.ts +3 -0
  847. package/dist/wall/curve-eligibility.d.ts.map +1 -0
  848. package/dist/wall/curve-eligibility.js +10 -0
  849. package/dist/wall/curve-tool.d.ts.map +1 -1
  850. package/dist/wall/curve-tool.js +8 -11
  851. package/dist/wall/definition.d.ts +1 -1
  852. package/dist/wall/definition.d.ts.map +1 -1
  853. package/dist/wall/definition.js +36 -13
  854. package/dist/wall/floorplan-affordances.d.ts +1 -0
  855. package/dist/wall/floorplan-affordances.d.ts.map +1 -1
  856. package/dist/wall/floorplan-affordances.js +46 -7
  857. package/dist/wall/floorplan-move.d.ts +3 -4
  858. package/dist/wall/floorplan-move.d.ts.map +1 -1
  859. package/dist/wall/floorplan-move.js +122 -9
  860. package/dist/wall/floorplan.d.ts.map +1 -1
  861. package/dist/wall/floorplan.js +19 -23
  862. package/dist/wall/move-shared.d.ts.map +1 -1
  863. package/dist/wall/move-shared.js +10 -7
  864. package/dist/wall/paint.d.ts.map +1 -1
  865. package/dist/wall/paint.js +2 -0
  866. package/dist/wall/panel.d.ts.map +1 -1
  867. package/dist/wall/panel.js +10 -17
  868. package/dist/wall/parametrics.js +2 -2
  869. package/dist/wall/pointer-transparency.d.ts +128 -0
  870. package/dist/wall/pointer-transparency.d.ts.map +1 -0
  871. package/dist/wall/pointer-transparency.js +147 -0
  872. package/dist/wall/renderer.d.ts.map +1 -1
  873. package/dist/wall/renderer.js +65 -8
  874. package/dist/wall/selection-hit-owner.d.ts +53 -0
  875. package/dist/wall/selection-hit-owner.d.ts.map +1 -0
  876. package/dist/wall/selection-hit-owner.js +79 -0
  877. package/dist/wall/system.d.ts +2 -0
  878. package/dist/wall/system.d.ts.map +1 -1
  879. package/dist/wall/system.js +66 -25
  880. package/dist/wall/tool.d.ts.map +1 -1
  881. package/dist/wall/tool.js +5 -0
  882. package/dist/wall/treatment-level-data.d.ts +6 -1
  883. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  884. package/dist/wall/treatment-level-data.js +82 -5
  885. package/dist/wall/treatments.d.ts +1 -0
  886. package/dist/wall/treatments.d.ts.map +1 -1
  887. package/dist/wall/treatments.js +5 -0
  888. package/dist/wall/wall-batch-system.d.ts +38 -6
  889. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  890. package/dist/wall/wall-batch-system.js +122 -25
  891. package/dist/wall/wall-batch.js +2 -2
  892. package/dist/window/definition.d.ts +2 -1
  893. package/dist/window/definition.d.ts.map +1 -1
  894. package/dist/window/definition.js +51 -24
  895. package/dist/window/floorplan-move.d.ts.map +1 -1
  896. package/dist/window/floorplan-move.js +1 -1
  897. package/dist/window/move-tool.d.ts +7 -5
  898. package/dist/window/move-tool.d.ts.map +1 -1
  899. package/dist/window/move-tool.js +344 -58
  900. package/dist/window/panel.d.ts.map +1 -1
  901. package/dist/window/panel.js +8 -6
  902. package/dist/window/parametrics.js +2 -2
  903. package/dist/window/renderer.d.ts.map +1 -1
  904. package/dist/window/renderer.js +5 -7
  905. package/dist/window/tool.d.ts.map +1 -1
  906. package/dist/window/tool.js +227 -13
  907. package/dist/zone/definition.d.ts.map +1 -1
  908. package/dist/zone/definition.js +7 -1
  909. package/dist/zone/floorplan-affordances.d.ts +12 -12
  910. package/dist/zone/floorplan.d.ts +1 -3
  911. package/dist/zone/floorplan.d.ts.map +1 -1
  912. package/dist/zone/floorplan.js +43 -28
  913. package/dist/zone/quantities-panel.d.ts.map +1 -1
  914. package/dist/zone/quantities-panel.js +33 -29
  915. package/dist/zone/renderer.d.ts.map +1 -1
  916. package/dist/zone/renderer.js +20 -6
  917. package/dist/zone/unit-membership.d.ts +12 -0
  918. package/dist/zone/unit-membership.d.ts.map +1 -0
  919. package/dist/zone/unit-membership.js +22 -0
  920. package/package.json +16 -8
  921. package/dist/dormer/panel-window-section.d.ts +0 -14
  922. package/dist/dormer/panel-window-section.d.ts.map +0 -1
  923. package/dist/dormer/panel-window-section.js +0 -59
  924. package/dist/dormer/window-assembly.d.ts +0 -22
  925. package/dist/dormer/window-assembly.d.ts.map +0 -1
  926. package/dist/dormer/window-assembly.js +0 -111
  927. package/dist/dormer/window-frame.d.ts +0 -24
  928. package/dist/dormer/window-frame.d.ts.map +0 -1
  929. package/dist/dormer/window-frame.js +0 -100
@@ -0,0 +1,569 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { emitter, sceneRegistry, useInteractive, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
4
+ import { getPendingWallRebuildCount, isIsolationActive, publishPerfBatchStats, registerMaterialCacheCleanup, useViewer, } from '@pascal-app/viewer';
5
+ import { useFrame, useThree } from '@react-three/fiber';
6
+ import { useEffect, useRef } from 'react';
7
+ import { isSlotPaintPreviewActive, subscribeSlotPaintPreviews } from '../slot-paint';
8
+ import { BATCH_KINDS, collectBatchCandidate, collectTintedNodes, getBatchableNodeIds, hideBatchedNode, revealAllBatchedHolds, revealBatchedNode, } from './candidates';
9
+ import { NodeBatchStore } from './store';
10
+ import { MIN_BATCH_ENTRIES, NODE_BATCH_SETTLE_MS } from './types';
11
+ /**
12
+ * Orchestrates node draw-call batching (charter backlog #3a/#3b). Same shape
13
+ * as `../../wall/wall-batch-system.tsx`: membership follows the scene dirty
14
+ * signal, lit nodes draw themselves, appearance switches re-sew everything,
15
+ * and joins wait for a quiet window. The container differs — `NodeBatchStore`
16
+ * holds BatchedMeshes, so membership changes are instance add/deletes, not
17
+ * resews.
18
+ */
19
+ const store = new NodeBatchStore((levelId) => sceneRegistry.nodes.get(levelId));
20
+ /**
21
+ * Marks captured before the consuming systems (priority 2+) clear them — the
22
+ * walls' `drainRebuiltWalls` ledger, done from the outside: a priority-1 pass
23
+ * snapshots which nodes this frame touched. A dirty WALL cascades to its
24
+ * hosted doors/windows: the wall edit moves them in level space without
25
+ * marking them.
26
+ */
27
+ const changedNodes = new Set();
28
+ const surfaceLevelReadyAt = new Map();
29
+ const staleNodes = new Set();
30
+ /**
31
+ * Members whose wave joined only part of their meshes (the rest fell under
32
+ * MIN_BATCH_ENTRIES). `store.has` locks them out of later waves, so a new
33
+ * placement releases them for a full re-collect — the new copy may be what
34
+ * makes their leftover buckets viable.
35
+ */
36
+ const partialNodes = new Set();
37
+ /**
38
+ * Candidates whose whole wave fell under MIN_BATCH_ENTRIES. When a NEW
39
+ * leftover appears (the missing bucket-mate arriving late — it was deferred
40
+ * as selected/dirty/loading when its peers' wave ran), the whole set is
41
+ * re-offered in one wave so the bucket finally tallies together. A stable
42
+ * leftover set re-offers nothing, so genuinely small scenes stay quiet.
43
+ */
44
+ const leftoverNodes = new Set();
45
+ /** Last frame's batchable ids, for the add/remove diff below. */
46
+ let knownNodeIds = null;
47
+ // Probe-only counters (?perf sessions read them via __itemBatch).
48
+ const waveDebug = { runs: 0, stale: 0, candidates: 0, joined: 0, nullCandidates: 0 };
49
+ let lastNodeChangeAtMs = 0;
50
+ let batchingSuspended = false;
51
+ let lastLevelMode;
52
+ let lastSelectedLevel;
53
+ const lastAppearance = {
54
+ shading: undefined,
55
+ textures: undefined,
56
+ colorPreset: undefined,
57
+ sceneTheme: undefined,
58
+ materials: null,
59
+ };
60
+ // Same inputs as the wall batch: these re-resolve every batched node's
61
+ // materials without marking a node (per-node paint goes through `node.slots`
62
+ // → a dirty mark).
63
+ function appearanceChanged() {
64
+ const viewer = useViewer.getState();
65
+ const materials = useScene.getState().materials;
66
+ if (lastAppearance.shading === viewer.shading &&
67
+ lastAppearance.textures === viewer.textures &&
68
+ lastAppearance.colorPreset === viewer.colorPreset &&
69
+ lastAppearance.sceneTheme === viewer.sceneTheme &&
70
+ lastAppearance.materials === materials) {
71
+ return false;
72
+ }
73
+ lastAppearance.shading = viewer.shading;
74
+ lastAppearance.textures = viewer.textures;
75
+ lastAppearance.colorPreset = viewer.colorPreset;
76
+ lastAppearance.sceneTheme = viewer.sceneTheme;
77
+ lastAppearance.materials = materials;
78
+ return true;
79
+ }
80
+ export function resetNodeBatchState() {
81
+ releaseAll();
82
+ changedNodes.clear();
83
+ surfaceLevelReadyAt.clear();
84
+ staleNodes.clear();
85
+ partialNodes.clear();
86
+ leftoverNodes.clear();
87
+ knownNodeIds = null;
88
+ lastNodeChangeAtMs = 0;
89
+ batchingSuspended = false;
90
+ lastLevelMode = undefined;
91
+ lastSelectedLevel = undefined;
92
+ lastAppearance.shading = undefined;
93
+ lastAppearance.textures = undefined;
94
+ lastAppearance.colorPreset = undefined;
95
+ lastAppearance.sceneTheme = undefined;
96
+ lastAppearance.materials = null;
97
+ }
98
+ // Membership truth for the ?perf panel's `batch` row — the panel cannot read
99
+ // this package's store itself, and the per-pass multi-draw counters flip
100
+ // between shadow/main/outline cameras.
101
+ function publishBatchStats() {
102
+ const stats = store.stats();
103
+ publishPerfBatchStats({
104
+ items: stats.nodes,
105
+ instances: stats.instances,
106
+ containers: stats.batches,
107
+ releases: stats.releases,
108
+ joins: stats.joins,
109
+ geometryReplacements: stats.geometryReplacements,
110
+ overflowRebuilds: stats.overflowRebuilds,
111
+ geometryBytesCopied: stats.geometryBytesCopied,
112
+ });
113
+ }
114
+ function releaseNode(nodeId) {
115
+ partialNodes.delete(nodeId);
116
+ leftoverNodes.delete(nodeId);
117
+ store.release(nodeId);
118
+ revealBatchedNode(nodeId);
119
+ }
120
+ function releaseAll() {
121
+ for (const nodeId of [...store.nodeIds()])
122
+ releaseNode(nodeId);
123
+ store.disposeAll();
124
+ // Tracked refs can go stale when a system rebuilt a batched node's meshes;
125
+ // the sweep guarantees nothing stays draw-hidden after a full stand-down.
126
+ revealAllBatchedHolds();
127
+ }
128
+ export function subscribeBatchInteractions(invalidate) {
129
+ const changed = (nodeId) => {
130
+ const node = useScene.getState().nodes[nodeId];
131
+ if (!node || !BATCH_KINDS.has(node.type))
132
+ return;
133
+ releaseNode(nodeId);
134
+ changedNodes.add(nodeId);
135
+ invalidate();
136
+ };
137
+ const unsubscribeTransforms = useLiveTransforms.subscribe((state, previous) => {
138
+ for (const nodeId of state.transforms.keys()) {
139
+ if (!previous.transforms.has(nodeId))
140
+ changed(nodeId);
141
+ }
142
+ for (const nodeId of previous.transforms.keys()) {
143
+ if (!state.transforms.has(nodeId))
144
+ changed(nodeId);
145
+ }
146
+ });
147
+ const unsubscribePreviews = subscribeSlotPaintPreviews(changed);
148
+ const unsubscribeMaterials = registerMaterialCacheCleanup(() => {
149
+ releaseAll();
150
+ for (const nodeId of getBatchableNodeIds())
151
+ changedNodes.add(nodeId);
152
+ invalidate();
153
+ });
154
+ return () => {
155
+ unsubscribeTransforms();
156
+ unsubscribePreviews();
157
+ unsubscribeMaterials();
158
+ };
159
+ }
160
+ export function captureChangedNodes() {
161
+ const dirty = useScene.getState().dirtyNodes;
162
+ if (dirty.size === 0)
163
+ return;
164
+ const nodes = useScene.getState().nodes;
165
+ for (const id of dirty) {
166
+ const node = nodes[id];
167
+ if (!node)
168
+ continue;
169
+ if (BATCH_KINDS.has(node.type))
170
+ changedNodes.add(id);
171
+ else if (node.type === 'wall' && Array.isArray(node.children)) {
172
+ // The wall edit moved its openings in level space; their own marks may
173
+ // never come.
174
+ for (const childId of node.children) {
175
+ const child = nodes[childId];
176
+ if (child && (child.type === 'door' || child.type === 'window')) {
177
+ changedNodes.add(childId);
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
183
+ export function runBatchFrame(invalidate, wakeRef) {
184
+ try {
185
+ processBatchFrame(invalidate, wakeRef);
186
+ }
187
+ finally {
188
+ store.flushReleases();
189
+ const emptyPending = store.pruneEmpty(performance.now(), new Set(surfaceLevelReadyAt.keys()), staleNodes.size > 0 ? lastNodeChangeAtMs + NODE_BATCH_SETTLE_MS : 0);
190
+ if (emptyPending && !wakeRef.current) {
191
+ wakeRef.current = setTimeout(() => {
192
+ wakeRef.current = null;
193
+ invalidate();
194
+ }, NODE_BATCH_SETTLE_MS + 20);
195
+ }
196
+ publishBatchStats();
197
+ }
198
+ }
199
+ function processBatchFrame(invalidate, wakeRef) {
200
+ const nodeIds = getBatchableNodeIds();
201
+ const frameNow = performance.now();
202
+ const sceneNodes = useScene.getState().nodes;
203
+ const draggingLevels = new Set();
204
+ for (const id of useLiveNodeOverrides.getState().overrides.keys()) {
205
+ const node = sceneNodes[id];
206
+ if (node?.type === 'wall' && node.parentId)
207
+ draggingLevels.add(node.parentId);
208
+ }
209
+ for (const level of draggingLevels)
210
+ surfaceLevelReadyAt.set(level, Infinity);
211
+ const wallsPending = getPendingWallRebuildCount() > 0;
212
+ for (const [level, readyAt] of surfaceLevelReadyAt) {
213
+ if (draggingLevels.has(level) || wallsPending)
214
+ surfaceLevelReadyAt.set(level, Infinity);
215
+ else if (readyAt === Infinity)
216
+ surfaceLevelReadyAt.set(level, frameNow + NODE_BATCH_SETTLE_MS);
217
+ else if (frameNow >= readyAt)
218
+ surfaceLevelReadyAt.delete(level);
219
+ }
220
+ let changed = changedNodes.size > 0;
221
+ // A level-subtree remount (thumbnail capture, tool-state swings) replaces
222
+ // the registry groups: batches die with the old groups and fresh sources
223
+ // mount with no hold. Detect it by parent identity and re-sew.
224
+ for (const nodeId of store.pruneDetached()) {
225
+ releaseNode(nodeId);
226
+ staleNodes.add(nodeId);
227
+ changed = true;
228
+ }
229
+ for (const nodeId of changedNodes) {
230
+ releaseNode(nodeId);
231
+ staleNodes.add(nodeId);
232
+ }
233
+ changedNodes.clear();
234
+ const viewer = useViewer.getState();
235
+ if (lastLevelMode !== viewer.levelMode || lastSelectedLevel !== viewer.selection.levelId) {
236
+ lastLevelMode = viewer.levelMode;
237
+ lastSelectedLevel = viewer.selection.levelId;
238
+ // Shadow-only sources were rejected and dropped from the previous join wave.
239
+ for (const nodeId of nodeIds)
240
+ if (!store.has(nodeId))
241
+ staleNodes.add(nodeId);
242
+ changed = true;
243
+ }
244
+ const tinted = collectTintedNodes(nodeIds);
245
+ for (const nodeId of tinted) {
246
+ if (!store.has(nodeId))
247
+ continue;
248
+ releaseNode(nodeId);
249
+ staleNodes.add(nodeId);
250
+ changed = true;
251
+ }
252
+ // A live override on a batched node — a collaborator's remote drag, a
253
+ // programmatic move — has no local selection to tint it; the batch copy
254
+ // would freeze at the join pose while the real meshes move.
255
+ for (const nodeId of useLiveNodeOverrides.getState().overrides.keys()) {
256
+ if (!store.has(nodeId))
257
+ continue;
258
+ releaseNode(nodeId);
259
+ staleNodes.add(nodeId);
260
+ changed = true;
261
+ }
262
+ // A door/window whose animation record just appeared must draw its own
263
+ // meshes for the tween — the batch copy would hold the pre-swing pose. The
264
+ // candidate filter keeps it out while the record lives; the completion
265
+ // dirty mark re-stales it at the settled pose.
266
+ const interactive = useInteractive.getState();
267
+ for (const animated of [interactive.doorAnimations, interactive.windowAnimations]) {
268
+ for (const nodeId of Object.keys(animated)) {
269
+ if (!store.has(nodeId))
270
+ continue;
271
+ releaseNode(nodeId);
272
+ staleNodes.add(nodeId);
273
+ changed = true;
274
+ }
275
+ }
276
+ if (appearanceChanged()) {
277
+ releaseAll();
278
+ for (const nodeId of nodeIds)
279
+ staleNodes.add(nodeId);
280
+ changed = true;
281
+ }
282
+ // Deleted nodes carry no mark of their own, so membership is diffed by id
283
+ // against last frame's registry — a size comparison would miss a same-size
284
+ // add-and-remove (compound undo, paste-replace) and leave the removed
285
+ // node's instances drawing as ghosts.
286
+ if (knownNodeIds === null) {
287
+ for (const nodeId of nodeIds)
288
+ staleNodes.add(nodeId);
289
+ changed = true;
290
+ }
291
+ else {
292
+ for (const nodeId of knownNodeIds) {
293
+ if (nodeIds.has(nodeId))
294
+ continue;
295
+ if (store.has(nodeId))
296
+ releaseNode(nodeId);
297
+ staleNodes.delete(nodeId);
298
+ changed = true;
299
+ }
300
+ let added = false;
301
+ for (const nodeId of nodeIds) {
302
+ if (knownNodeIds.has(nodeId) || store.has(nodeId))
303
+ continue;
304
+ staleNodes.add(nodeId);
305
+ added = true;
306
+ changed = true;
307
+ }
308
+ // A newly placed copy can be what pushes an under-threshold bucket over
309
+ // MIN_BATCH_ENTRIES — earlier copies were dropped from staleNodes when
310
+ // their wave came up short, so re-stale everything unbatched, and release
311
+ // partial members so their leftover meshes get re-offered too.
312
+ if (added) {
313
+ for (const nodeId of nodeIds) {
314
+ if (!store.has(nodeId))
315
+ staleNodes.add(nodeId);
316
+ }
317
+ for (const nodeId of [...partialNodes]) {
318
+ releaseNode(nodeId);
319
+ staleNodes.add(nodeId);
320
+ }
321
+ }
322
+ }
323
+ knownNodeIds = nodeIds;
324
+ // Isolation hides everything outside the focused subtree; batches hang off
325
+ // level roots and would go dark with them, leaving members drawn by nobody
326
+ // when a batched node is the focus. Stand down entirely, re-sew after.
327
+ const suspended = isIsolationActive();
328
+ if (suspended !== batchingSuspended) {
329
+ batchingSuspended = suspended;
330
+ releaseAll();
331
+ staleNodes.clear();
332
+ if (!suspended)
333
+ for (const nodeId of nodeIds)
334
+ staleNodes.add(nodeId);
335
+ changed = true;
336
+ }
337
+ if (batchingSuspended) {
338
+ staleNodes.clear();
339
+ return;
340
+ }
341
+ const now = performance.now();
342
+ if (changed)
343
+ lastNodeChangeAtMs = now;
344
+ if (staleNodes.size === 0)
345
+ return;
346
+ const settled = !changed && now - lastNodeChangeAtMs >= NODE_BATCH_SETTLE_MS;
347
+ if (!settled) {
348
+ if (wakeRef.current)
349
+ clearTimeout(wakeRef.current);
350
+ wakeRef.current = setTimeout(() => {
351
+ wakeRef.current = null;
352
+ invalidate();
353
+ }, NODE_BATCH_SETTLE_MS + 20);
354
+ return;
355
+ }
356
+ const dirty = useScene.getState().dirtyNodes;
357
+ const candidates = [];
358
+ // A lit or still-dirty node is deferred, not dropped — it must rejoin once
359
+ // the tint lifts or the mark drains, and nothing later would re-stale it.
360
+ const deferred = new Set();
361
+ waveDebug.runs++;
362
+ waveDebug.stale = staleNodes.size;
363
+ waveDebug.nullCandidates = 0;
364
+ const overrides = useLiveNodeOverrides.getState();
365
+ for (const nodeId of staleNodes) {
366
+ if (store.has(nodeId))
367
+ continue;
368
+ // Overrides defer like tint/dirt — an in-flight gesture ends with a
369
+ // commit whose mark re-offers the node; dropping it here would strand it.
370
+ if (((sceneNodes[nodeId]?.type === 'slab' ||
371
+ sceneNodes[nodeId]?.type === 'ceiling') &&
372
+ (wallsPending ||
373
+ surfaceLevelReadyAt.has(sceneNodes[nodeId].parentId ?? ''))) ||
374
+ tinted.has(nodeId) ||
375
+ dirty.has(nodeId) ||
376
+ overrides.get(nodeId) !== undefined ||
377
+ useLiveTransforms.getState().get(nodeId) !== undefined ||
378
+ isSlotPaintPreviewActive(nodeId)) {
379
+ deferred.add(nodeId);
380
+ continue;
381
+ }
382
+ const candidate = collectBatchCandidate(nodeId);
383
+ if (candidate)
384
+ candidates.push(candidate);
385
+ else
386
+ waveDebug.nullCandidates++;
387
+ }
388
+ waveDebug.candidates = candidates.length;
389
+ // Hide exactly what the store took — an entry it skipped (below the
390
+ // new-batch threshold, rejected geometry, missing level root) must keep
391
+ // drawing itself.
392
+ const joined = store.join(candidates, MIN_BATCH_ENTRIES);
393
+ waveDebug.joined = joined.length;
394
+ const joinedByNode = new Map();
395
+ for (const entry of joined) {
396
+ const bucket = joinedByNode.get(entry.nodeId);
397
+ if (bucket)
398
+ bucket.push(entry);
399
+ else
400
+ joinedByNode.set(entry.nodeId, [entry]);
401
+ }
402
+ let newLeftovers = false;
403
+ for (const candidate of candidates) {
404
+ if (!joinedByNode.has(candidate.nodeId)) {
405
+ if (!leftoverNodes.has(candidate.nodeId))
406
+ newLeftovers = true;
407
+ leftoverNodes.add(candidate.nodeId);
408
+ }
409
+ }
410
+ for (const candidate of candidates) {
411
+ const joinedEntries = joinedByNode.get(candidate.nodeId);
412
+ if (!joinedEntries)
413
+ continue;
414
+ leftoverNodes.delete(candidate.nodeId);
415
+ hideBatchedNode({
416
+ nodeId: candidate.nodeId,
417
+ levelId: candidate.levelId,
418
+ entries: joinedEntries,
419
+ });
420
+ if (joinedEntries.length < candidate.entries.length)
421
+ partialNodes.add(candidate.nodeId);
422
+ }
423
+ staleNodes.clear();
424
+ for (const nodeId of deferred)
425
+ staleNodes.add(nodeId);
426
+ // A new leftover may be the bucket-mate its peers were missing — re-offer
427
+ // the whole set together next wave.
428
+ if (newLeftovers)
429
+ for (const nodeId of leftoverNodes)
430
+ staleNodes.add(nodeId);
431
+ if (deferred.size > 0) {
432
+ if (wakeRef.current)
433
+ clearTimeout(wakeRef.current);
434
+ wakeRef.current = setTimeout(() => {
435
+ wakeRef.current = null;
436
+ invalidate();
437
+ }, NODE_BATCH_SETTLE_MS + 20);
438
+ }
439
+ }
440
+ // The headless bake/thumbnail worker loads `?disable=draw` pages: one capture,
441
+ // no interactive frames — batching there only risks the export (sources are
442
+ // layer-held exactly when the clone happens) and wins nothing.
443
+ const DRAW_DISABLED = typeof window !== 'undefined' &&
444
+ new Set((new URLSearchParams(window.location.search).get('disable') ?? '')
445
+ .split(',')
446
+ .map((s) => s.trim())).has('draw');
447
+ export const NodeBatchSystem = () => {
448
+ if (DRAW_DISABLED)
449
+ return null;
450
+ return _jsx(NodeBatchSystemActive, {});
451
+ };
452
+ const NodeBatchSystemActive = () => {
453
+ const invalidate = useThree((state) => state.invalidate);
454
+ const wakeRef = useRef(null);
455
+ useEffect(() => subscribeBatchInteractions(invalidate), [invalidate]);
456
+ // Before the consuming systems (priority 2+) clear the marks this frame.
457
+ useFrame(captureChangedNodes, 1);
458
+ useFrame(() => runBatchFrame(invalidate, wakeRef), 5);
459
+ // GLB export / thumbnail capture clones the live scene and prunes anything
460
+ // off the scene layer — exactly where batched sources sit. Hand every node
461
+ // its own meshes back before the clone; the settle window re-sews after.
462
+ useEffect(() => {
463
+ const restoreForCapture = () => {
464
+ for (const nodeId of [...store.nodeIds()]) {
465
+ releaseNode(nodeId);
466
+ staleNodes.add(nodeId);
467
+ }
468
+ store.disposeAll();
469
+ revealAllBatchedHolds();
470
+ lastNodeChangeAtMs = performance.now();
471
+ };
472
+ emitter.on('thumbnail:before-capture', restoreForCapture);
473
+ return () => {
474
+ emitter.off('thumbnail:before-capture', restoreForCapture);
475
+ };
476
+ }, []);
477
+ // Scripted-probe hook, ?perf sessions only (mirrors __pascalPerf).
478
+ useEffect(() => {
479
+ if (!new URLSearchParams(window.location.search).has('perf'))
480
+ return;
481
+ const probe = {
482
+ stats: () => store.stats(),
483
+ staleCount: () => staleNodes.size,
484
+ lastChangeAgoMs: () => performance.now() - lastNodeChangeAtMs,
485
+ has: (nodeId) => store.has(nodeId),
486
+ ids: () => [...store.nodeIds()],
487
+ hovered: () => useViewer.getState().hoveredId ?? null,
488
+ wave: () => ({ ...waveDebug }),
489
+ releaseAllNow: () => {
490
+ releaseAll();
491
+ publishBatchStats();
492
+ },
493
+ staleAllNow: () => {
494
+ for (const nodeId of getBatchableNodeIds())
495
+ staleNodes.add(nodeId);
496
+ },
497
+ batchRender: () => {
498
+ const out = [];
499
+ for (const levelId of sceneRegistry.byType.level ?? []) {
500
+ const root = sceneRegistry.nodes.get(levelId);
501
+ root?.traverse((child) => {
502
+ if (child.name !== 'item-batch')
503
+ return;
504
+ let chain = true;
505
+ let walker = child;
506
+ let top = child;
507
+ while (walker) {
508
+ if (walker.visible === false)
509
+ chain = false;
510
+ top = walker;
511
+ walker = walker.parent;
512
+ }
513
+ const b = child;
514
+ out.push({
515
+ segments: b._multiDrawCount ?? -1,
516
+ visibleChain: chain && top.isScene === true,
517
+ instances: b._maxInstanceCount ?? -1,
518
+ });
519
+ });
520
+ }
521
+ return out;
522
+ },
523
+ // Emits the real capture event and reports what is still draw-hidden
524
+ // afterwards — a nonzero heldSources here is exactly what the GLB
525
+ // exporter would prune.
526
+ simulateCapture: () => {
527
+ emitter.emit('thumbnail:before-capture', undefined);
528
+ let batchMeshes = 0;
529
+ const heldMeshes = [];
530
+ for (const levelId of sceneRegistry.byType.level ?? []) {
531
+ const root = sceneRegistry.nodes.get(levelId);
532
+ root?.traverse((child) => {
533
+ if (child.name === 'item-batch')
534
+ batchMeshes++;
535
+ else if (child.isMesh && !child.layers.isEnabled(0)) {
536
+ heldMeshes.push(`${child.name || '?'}`);
537
+ }
538
+ });
539
+ }
540
+ return { batchMeshes, held: heldMeshes.length, heldNames: heldMeshes.slice(0, 20) };
541
+ },
542
+ sceneCensus: () => {
543
+ let batchMeshes = 0;
544
+ let heldSources = 0;
545
+ for (const levelId of sceneRegistry.byType.level ?? []) {
546
+ const root = sceneRegistry.nodes.get(levelId);
547
+ root?.traverse((child) => {
548
+ if (child.name === 'item-batch')
549
+ batchMeshes++;
550
+ else if (child.isMesh && !child.layers.isEnabled(0)) {
551
+ heldSources++;
552
+ }
553
+ });
554
+ }
555
+ return { batchMeshes, heldSources };
556
+ },
557
+ };
558
+ window.__itemBatch = probe;
559
+ return () => {
560
+ delete window.__itemBatch;
561
+ };
562
+ }, []);
563
+ useEffect(() => () => {
564
+ if (wakeRef.current)
565
+ clearTimeout(wakeRef.current);
566
+ resetNodeBatchState();
567
+ }, []);
568
+ return null;
569
+ };
@@ -0,0 +1,99 @@
1
+ import type { BufferGeometry, Material, Matrix4, Mesh, Object3D } from 'three';
2
+ /**
3
+ * Contract for node draw-call batching (charter backlog #3a/#3b).
4
+ *
5
+ * Mirrors the wall-batch architecture (`../../wall/wall-batch-system.tsx`)
6
+ * with one structural upgrade: the container is a `THREE.BatchedMesh` per
7
+ * `(levelId, material, attribute-signature, castShadow, receiveShadow)`;
8
+ * membership changes are incremental instance adds/deletes.
9
+ *
10
+ * Batched kinds: items, columns, ceilings and slabs (level-parented), doors
11
+ * and windows (wall-hosted, resolved to the host wall's level). Walls keep
12
+ * their own merged-geometry batch and cutaway lifecycle.
13
+ *
14
+ * Invariants every module must respect:
15
+ * - Source meshes STAY MOUNTED. They are draw-hidden via
16
+ * `hideFromScene(mesh, 'batched')` while batched; picking, measuring,
17
+ * outlines and the GLB exporter keep working through them. Batch meshes
18
+ * are draw-only: `raycast` is a noop, name is `'item-batch'`.
19
+ * - Batch meshes are parented under the LEVEL ROOT, so level visibility and
20
+ * isolation cull batches exactly like every other level child.
21
+ * - A tinted node (selected, externally selected, preview-selected or hovered)
22
+ * is released and draws itself, as do hosted openings whose host wall is
23
+ * tinted or mid-gesture.
24
+ * - Membership follows the scene dirty signal + the node-count tell; a batch
25
+ * never chases per-frame transforms. Live transforms and slot paint previews
26
+ * release sources until they end. A dirty host wall releases its
27
+ * openings (their level-space transforms move with the wall).
28
+ * - Doors/windows with an active animation record are excluded while it
29
+ * runs; the completion dirty mark re-joins them at the settled pose.
30
+ */
31
+ /** One batchable mesh of one node. */
32
+ export type BatchEntry = {
33
+ nodeId: string;
34
+ levelId: string;
35
+ /** Stable node/part identity for mutable surface geometry. */
36
+ allocationKey?: string;
37
+ /** Source mesh in the node's mounted subtree; draw-hidden while batched. */
38
+ mesh: Mesh;
39
+ geometry: BufferGeometry;
40
+ /**
41
+ * The mesh's resolved material — a shared/cached instance; its `uuid` is
42
+ * part of the batch key. Array-material meshes are not batchable.
43
+ */
44
+ material: Material;
45
+ castShadow: boolean;
46
+ receiveShadow: boolean;
47
+ /** Source mesh world matrix expressed in level-root space, captured at join. */
48
+ matrixInLevel: Matrix4;
49
+ };
50
+ /** Everything batchable about one node. `entries` empty ⇒ not batchable. */
51
+ export type BatchCandidate = {
52
+ nodeId: string;
53
+ levelId: string;
54
+ entries: BatchEntry[];
55
+ };
56
+ export type NodeBatchStats = {
57
+ batches: number;
58
+ instances: number;
59
+ nodes: number;
60
+ releases: number;
61
+ joins: number;
62
+ geometryReplacements: number;
63
+ overflowRebuilds: number;
64
+ geometryBytesCopied: number;
65
+ };
66
+ /**
67
+ * Owns every BatchedMesh. Implementation in `store.ts`; consumed only by
68
+ * `system.tsx`.
69
+ */
70
+ export type NodeBatchStoreApi = {
71
+ /**
72
+ * Adds a wave of candidates, growing/creating batches as needed, and
73
+ * returns the entries actually joined — the caller draw-hides exactly
74
+ * those meshes and no others. An EXISTING batch always accepts a matching
75
+ * entry (a released node must be able to rejoin alone); a NEW batch is
76
+ * only created when the wave brings at least `minEntriesForNewBatch`
77
+ * matching entries — below that, a batch trades plain draws for
78
+ * bookkeeping and wins nothing.
79
+ */
80
+ join(candidates: BatchCandidate[], minEntriesForNewBatch: number): BatchEntry[];
81
+ /** Hides draws immediately; deletion is coalesced by flushReleases. Caller reveals sources. */
82
+ release(nodeId: string): boolean;
83
+ flushReleases(now?: number): void;
84
+ pruneEmpty(now?: number, retainedLevels?: ReadonlySet<string>, earliestDisposalAt?: number): boolean;
85
+ /** Drops batches orphaned by a level-subtree remount; returns their nodes. */
86
+ pruneDetached(): Set<string>;
87
+ has(nodeId: string): boolean;
88
+ nodeIds(): ReadonlySet<string>;
89
+ /** Tears down every batch on a level (level deleted / isolation). */
90
+ disposeLevel(levelId: string): void;
91
+ disposeAll(): void;
92
+ stats(): NodeBatchStats;
93
+ };
94
+ export type GetLevelRoot = (levelId: string) => Object3D | undefined;
95
+ /** A (level, material) bucket below this many entries is not worth a batch. */
96
+ export declare const MIN_BATCH_ENTRIES = 3;
97
+ /** Quiet window after the last node change before joins run (walls: 180). */
98
+ export declare const NODE_BATCH_SETTLE_MS = 180;
99
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAE9E;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,sCAAsC;AACtC,MAAM,MAAM,UAAU,GAAG;IACvB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,8DAA8D;IAC9D,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,4EAA4E;IAC5E,IAAI,EAAE,IAAI,CAAA;IACV,QAAQ,EAAE,cAAc,CAAA;IACxB;;;OAGG;IACH,QAAQ,EAAE,QAAQ,CAAA;IAClB,UAAU,EAAE,OAAO,CAAA;IACnB,aAAa,EAAE,OAAO,CAAA;IACtB,gFAAgF;IAChF,aAAa,EAAE,OAAO,CAAA;CACvB,CAAA;AAED,4EAA4E;AAC5E,MAAM,MAAM,cAAc,GAAG;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,UAAU,EAAE,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,cAAc,GAAG;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,oBAAoB,EAAE,MAAM,CAAA;IAC5B,gBAAgB,EAAE,MAAM,CAAA;IACxB,mBAAmB,EAAE,MAAM,CAAA;CAC5B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B;;;;;;;;OAQG;IACH,IAAI,CAAC,UAAU,EAAE,cAAc,EAAE,EAAE,qBAAqB,EAAE,MAAM,GAAG,UAAU,EAAE,CAAA;IAC/E,+FAA+F;IAC/F,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAChC,aAAa,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,UAAU,CACR,GAAG,CAAC,EAAE,MAAM,EACZ,cAAc,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,EACpC,kBAAkB,CAAC,EAAE,MAAM,GAC1B,OAAO,CAAA;IACV,8EAA8E;IAC9E,aAAa,IAAI,GAAG,CAAC,MAAM,CAAC,CAAA;IAC5B,GAAG,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAA;IAC5B,OAAO,IAAI,WAAW,CAAC,MAAM,CAAC,CAAA;IAC9B,qEAAqE;IACrE,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACnC,UAAU,IAAI,IAAI,CAAA;IAClB,KAAK,IAAI,cAAc,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,QAAQ,GAAG,SAAS,CAAA;AAEpE,+EAA+E;AAC/E,eAAO,MAAM,iBAAiB,IAAI,CAAA;AAClC,6EAA6E;AAC7E,eAAO,MAAM,oBAAoB,MAAM,CAAA"}
@@ -0,0 +1,4 @@
1
+ /** A (level, material) bucket below this many entries is not worth a batch. */
2
+ export const MIN_BATCH_ENTRIES = 3;
3
+ /** Quiet window after the last node change before joins run (walls: 180). */
4
+ export const NODE_BATCH_SETTLE_MS = 180;