@pascal-app/nodes 1.0.3 → 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 (708) hide show
  1. package/dist/block/definition.d.ts.map +1 -1
  2. package/dist/block/definition.js +18 -3
  3. package/dist/block/floorplan.d.ts +11 -1
  4. package/dist/block/floorplan.d.ts.map +1 -1
  5. package/dist/block/floorplan.js +81 -13
  6. package/dist/block/geometry.d.ts +2 -2
  7. package/dist/block/geometry.d.ts.map +1 -1
  8. package/dist/block/geometry.js +39 -24
  9. package/dist/block/hosted-edit.d.ts.map +1 -1
  10. package/dist/block/hosted-edit.js +25 -0
  11. package/dist/block/material-slots.d.ts +1 -3
  12. package/dist/block/material-slots.d.ts.map +1 -1
  13. package/dist/block/material-slots.js +1 -11
  14. package/dist/block/paint.d.ts.map +1 -1
  15. package/dist/block/paint.js +4 -10
  16. package/dist/block/panel.d.ts.map +1 -1
  17. package/dist/block/panel.js +8 -3
  18. package/dist/block/selection.d.ts.map +1 -1
  19. package/dist/block/selection.js +2 -2
  20. package/dist/box-vent/definition.d.ts.map +1 -1
  21. package/dist/box-vent/definition.js +2 -5
  22. package/dist/box-vent/panel.d.ts.map +1 -1
  23. package/dist/box-vent/panel.js +5 -28
  24. package/dist/cabinet/countertop-layout.d.ts +13 -2
  25. package/dist/cabinet/countertop-layout.d.ts.map +1 -1
  26. package/dist/cabinet/definition.d.ts.map +1 -1
  27. package/dist/cabinet/definition.js +1 -2
  28. package/dist/cabinet/floorplan.d.ts.map +1 -1
  29. package/dist/cabinet/floorplan.js +125 -28
  30. package/dist/cabinet/geometry/shared.d.ts +1 -2
  31. package/dist/cabinet/geometry/shared.d.ts.map +1 -1
  32. package/dist/cabinet/geometry/shared.js +1 -2
  33. package/dist/cabinet/run-layout.d.ts.map +1 -1
  34. package/dist/cabinet/run-layout.js +8 -5
  35. package/dist/cabinet/run-ops.d.ts +13 -2
  36. package/dist/cabinet/run-ops.d.ts.map +1 -1
  37. package/dist/cabinet/tool.d.ts.map +1 -1
  38. package/dist/cabinet/tool.js +22 -24
  39. package/dist/cabinet/wall-snap.d.ts.map +1 -1
  40. package/dist/cabinet/wall-snap.js +8 -8
  41. package/dist/ceiling/boundary-editor.d.ts.map +1 -1
  42. package/dist/ceiling/boundary-editor.js +5 -3
  43. package/dist/ceiling/definition.d.ts +4 -4
  44. package/dist/ceiling/definition.d.ts.map +1 -1
  45. package/dist/ceiling/definition.js +15 -15
  46. package/dist/ceiling/floorplan-affordances.d.ts +84 -4
  47. package/dist/ceiling/floorplan-affordances.d.ts.map +1 -1
  48. package/dist/ceiling/floorplan-affordances.js +0 -1
  49. package/dist/ceiling/floorplan-move.d.ts.map +1 -1
  50. package/dist/ceiling/floorplan-move.js +0 -1
  51. package/dist/ceiling/floorplan.d.ts +1 -1
  52. package/dist/ceiling/floorplan.d.ts.map +1 -1
  53. package/dist/ceiling/floorplan.js +2 -1
  54. package/dist/ceiling/height-bounds.d.ts +19 -0
  55. package/dist/ceiling/height-bounds.d.ts.map +1 -0
  56. package/dist/ceiling/height-bounds.js +24 -0
  57. package/dist/ceiling/hole-editor.d.ts.map +1 -1
  58. package/dist/ceiling/hole-editor.js +3 -4
  59. package/dist/ceiling/materials.d.ts +1 -1
  60. package/dist/ceiling/materials.d.ts.map +1 -1
  61. package/dist/ceiling/materials.js +10 -3
  62. package/dist/ceiling/paint.d.ts +2 -8
  63. package/dist/ceiling/paint.d.ts.map +1 -1
  64. package/dist/ceiling/paint.js +121 -24
  65. package/dist/ceiling/panel.d.ts.map +1 -1
  66. package/dist/ceiling/panel.js +40 -23
  67. package/dist/ceiling/renderer.d.ts.map +1 -1
  68. package/dist/ceiling/renderer.js +41 -5
  69. package/dist/chimney/move-tool.d.ts.map +1 -1
  70. package/dist/chimney/move-tool.js +8 -2
  71. package/dist/chimney/paint.d.ts.map +1 -1
  72. package/dist/chimney/paint.js +3 -10
  73. package/dist/column/definition.d.ts.map +1 -1
  74. package/dist/column/definition.js +24 -2
  75. package/dist/column/floorplan-affordances.d.ts.map +1 -1
  76. package/dist/column/floorplan-affordances.js +5 -0
  77. package/dist/column/floorplan.d.ts +1 -1
  78. package/dist/column/floorplan.d.ts.map +1 -1
  79. package/dist/column/floorplan.js +47 -2
  80. package/dist/column/hosted-resize.d.ts +101 -2
  81. package/dist/column/hosted-resize.d.ts.map +1 -1
  82. package/dist/column/panel.d.ts.map +1 -1
  83. package/dist/column/panel.js +147 -146
  84. package/dist/column/renderer.d.ts.map +1 -1
  85. package/dist/column/renderer.js +6 -4
  86. package/dist/column/surface.d.ts.map +1 -1
  87. package/dist/column/surface.js +7 -0
  88. package/dist/construction-dimension/floorplan.js +7 -3
  89. package/dist/cupola/definition.d.ts.map +1 -1
  90. package/dist/cupola/definition.js +2 -8
  91. package/dist/cupola/panel.d.ts.map +1 -1
  92. package/dist/cupola/panel.js +5 -23
  93. package/dist/door/definition.d.ts.map +1 -1
  94. package/dist/door/definition.js +12 -3
  95. package/dist/door/door-math.d.ts +5 -10
  96. package/dist/door/door-math.d.ts.map +1 -1
  97. package/dist/door/door-math.js +14 -15
  98. package/dist/door/floorplan-move.d.ts.map +1 -1
  99. package/dist/door/floorplan-move.js +3 -1
  100. package/dist/door/floorplan.d.ts.map +1 -1
  101. package/dist/door/floorplan.js +55 -21
  102. package/dist/door/mechanism.d.ts +4 -0
  103. package/dist/door/mechanism.d.ts.map +1 -0
  104. package/dist/door/mechanism.js +24 -0
  105. package/dist/door/move-tool.d.ts.map +1 -1
  106. package/dist/door/move-tool.js +72 -48
  107. package/dist/door/paint.d.ts.map +1 -1
  108. package/dist/door/paint.js +3 -0
  109. package/dist/door/panel.d.ts.map +1 -1
  110. package/dist/door/panel.js +34 -259
  111. package/dist/door/placement.d.ts +45 -0
  112. package/dist/door/placement.d.ts.map +1 -0
  113. package/dist/door/placement.js +51 -0
  114. package/dist/door/preview.d.ts.map +1 -1
  115. package/dist/door/preview.js +2 -0
  116. package/dist/door/renderer.d.ts.map +1 -1
  117. package/dist/door/renderer.js +3 -2
  118. package/dist/door/tool.d.ts.map +1 -1
  119. package/dist/door/tool.js +92 -21
  120. package/dist/dormer/csg-geometry.d.ts.map +1 -1
  121. package/dist/dormer/csg-geometry.js +2 -0
  122. package/dist/dormer/paint.d.ts.map +1 -1
  123. package/dist/dormer/paint.js +2 -5
  124. package/dist/dormer/panel.d.ts.map +1 -1
  125. package/dist/dormer/panel.js +4 -14
  126. package/dist/downspout/definition.d.ts.map +1 -1
  127. package/dist/downspout/definition.js +2 -2
  128. package/dist/duct-fitting/definition.d.ts.map +1 -1
  129. package/dist/duct-fitting/definition.js +2 -1
  130. package/dist/duct-fitting/geometry.d.ts.map +1 -1
  131. package/dist/duct-fitting/geometry.js +1 -1
  132. package/dist/duct-fitting/move-tool.d.ts.map +1 -1
  133. package/dist/duct-fitting/move-tool.js +8 -2
  134. package/dist/duct-segment/definition.d.ts.map +1 -1
  135. package/dist/duct-segment/definition.js +2 -2
  136. package/dist/duct-segment/geometry.d.ts.map +1 -1
  137. package/dist/duct-segment/geometry.js +1 -1
  138. package/dist/duct-segment/move-tool.d.ts.map +1 -1
  139. package/dist/duct-segment/move-tool.js +8 -2
  140. package/dist/elevator/definition.d.ts.map +1 -1
  141. package/dist/elevator/definition.js +1 -2
  142. package/dist/elevator/panel.d.ts.map +1 -1
  143. package/dist/elevator/panel.js +5 -27
  144. package/dist/elevator/parametrics.js +1 -1
  145. package/dist/elevator/renderer.d.ts.map +1 -1
  146. package/dist/elevator/renderer.js +3 -4
  147. package/dist/eyebrow-vent/definition.d.ts.map +1 -1
  148. package/dist/eyebrow-vent/definition.js +2 -5
  149. package/dist/eyebrow-vent/paint.d.ts.map +1 -1
  150. package/dist/eyebrow-vent/paint.js +3 -6
  151. package/dist/eyebrow-vent/panel.d.ts.map +1 -1
  152. package/dist/eyebrow-vent/panel.js +5 -23
  153. package/dist/fence/actions/move-endpoint.d.ts +1 -1
  154. package/dist/fence/actions/move-endpoint.d.ts.map +1 -1
  155. package/dist/fence/actions/move-endpoint.js +2 -1
  156. package/dist/fence/definition.d.ts +2 -1
  157. package/dist/fence/definition.d.ts.map +1 -1
  158. package/dist/fence/definition.js +83 -28
  159. package/dist/fence/drafting.d.ts +36 -0
  160. package/dist/fence/drafting.d.ts.map +1 -0
  161. package/dist/fence/drafting.js +210 -0
  162. package/dist/fence/feature-tool.d.ts +4 -0
  163. package/dist/fence/feature-tool.d.ts.map +1 -0
  164. package/dist/fence/feature-tool.js +140 -0
  165. package/dist/fence/features.d.ts +2 -0
  166. package/dist/fence/features.d.ts.map +1 -0
  167. package/dist/fence/features.js +12 -0
  168. package/dist/fence/floorplan-affordances.d.ts.map +1 -1
  169. package/dist/fence/floorplan-affordances.js +2 -1
  170. package/dist/fence/floorplan.d.ts +2 -3
  171. package/dist/fence/floorplan.d.ts.map +1 -1
  172. package/dist/fence/floorplan.js +131 -71
  173. package/dist/fence/geometry-parts.d.ts +50 -0
  174. package/dist/fence/geometry-parts.d.ts.map +1 -0
  175. package/dist/fence/geometry-parts.js +1144 -0
  176. package/dist/fence/geometry.d.ts +2 -3
  177. package/dist/fence/geometry.d.ts.map +1 -1
  178. package/dist/fence/geometry.js +84 -7
  179. package/dist/fence/index.d.ts +1 -0
  180. package/dist/fence/index.d.ts.map +1 -1
  181. package/dist/fence/index.js +1 -0
  182. package/dist/fence/inspector-editors.d.ts +15 -0
  183. package/dist/fence/inspector-editors.d.ts.map +1 -1
  184. package/dist/fence/inspector-editors.js +128 -3
  185. package/dist/fence/lift.d.ts.map +1 -1
  186. package/dist/fence/lift.js +5 -2
  187. package/dist/fence/move-tool.js +2 -1
  188. package/dist/fence/panel-model.d.ts +4 -0
  189. package/dist/fence/panel-model.d.ts.map +1 -0
  190. package/dist/fence/panel-model.js +12 -0
  191. package/dist/fence/parametrics.d.ts +0 -12
  192. package/dist/fence/parametrics.d.ts.map +1 -1
  193. package/dist/fence/parametrics.js +185 -18
  194. package/dist/fence/system.d.ts.map +1 -1
  195. package/dist/fence/system.js +141 -31
  196. package/dist/fence/tool.d.ts.map +1 -1
  197. package/dist/fence/tool.js +256 -47
  198. package/dist/fence-feature/actions.d.ts +7 -0
  199. package/dist/fence-feature/actions.d.ts.map +1 -0
  200. package/dist/fence-feature/actions.js +26 -0
  201. package/dist/fence-feature/definition.d.ts +4 -0
  202. package/dist/fence-feature/definition.d.ts.map +1 -0
  203. package/dist/fence-feature/definition.js +112 -0
  204. package/dist/fence-feature/floorplan-affordances.d.ts +3 -0
  205. package/dist/fence-feature/floorplan-affordances.d.ts.map +1 -0
  206. package/dist/fence-feature/floorplan-affordances.js +37 -0
  207. package/dist/fence-feature/floorplan.d.ts +4 -0
  208. package/dist/fence-feature/floorplan.d.ts.map +1 -0
  209. package/dist/fence-feature/floorplan.js +120 -0
  210. package/dist/fence-feature/geometry.d.ts +5 -0
  211. package/dist/fence-feature/geometry.d.ts.map +1 -0
  212. package/dist/fence-feature/geometry.js +43 -0
  213. package/dist/fence-feature/handles.d.ts +5 -0
  214. package/dist/fence-feature/handles.d.ts.map +1 -0
  215. package/dist/fence-feature/handles.js +84 -0
  216. package/dist/fence-feature/inspector.d.ts +6 -0
  217. package/dist/fence-feature/inspector.d.ts.map +1 -0
  218. package/dist/fence-feature/inspector.js +214 -0
  219. package/dist/fence-feature/interaction.d.ts +3 -0
  220. package/dist/fence-feature/interaction.d.ts.map +1 -0
  221. package/dist/fence-feature/interaction.js +41 -0
  222. package/dist/fence-feature/move-session.d.ts +9 -0
  223. package/dist/fence-feature/move-session.d.ts.map +1 -0
  224. package/dist/fence-feature/move-session.js +48 -0
  225. package/dist/fence-feature/move-tool.d.ts +5 -0
  226. package/dist/fence-feature/move-tool.d.ts.map +1 -0
  227. package/dist/fence-feature/move-tool.js +58 -0
  228. package/dist/fence-feature/pick-target.d.ts +7 -0
  229. package/dist/fence-feature/pick-target.d.ts.map +1 -0
  230. package/dist/fence-feature/pick-target.js +52 -0
  231. package/dist/floor-opening/definition.d.ts +3 -0
  232. package/dist/floor-opening/definition.d.ts.map +1 -0
  233. package/dist/floor-opening/definition.js +41 -0
  234. package/dist/floor-opening/floorplan.d.ts +156 -0
  235. package/dist/floor-opening/floorplan.d.ts.map +1 -0
  236. package/dist/floor-opening/floorplan.js +63 -0
  237. package/dist/gutter/definition.d.ts.map +1 -1
  238. package/dist/gutter/definition.js +2 -2
  239. package/dist/imported-mesh/definition.d.ts.map +1 -1
  240. package/dist/imported-mesh/definition.js +2 -0
  241. package/dist/imported-mesh/geometry.d.ts +1 -1
  242. package/dist/imported-mesh/geometry.d.ts.map +1 -1
  243. package/dist/imported-mesh/geometry.js +40 -12
  244. package/dist/index.d.ts +13 -2
  245. package/dist/index.d.ts.map +1 -1
  246. package/dist/index.js +20 -2
  247. package/dist/item/authored-face-host.d.ts +10 -0
  248. package/dist/item/authored-face-host.d.ts.map +1 -0
  249. package/dist/item/authored-face-host.js +87 -0
  250. package/dist/item/authored-params.d.ts +15 -0
  251. package/dist/item/authored-params.d.ts.map +1 -0
  252. package/dist/item/authored-params.js +72 -0
  253. package/dist/item/definition.d.ts +2 -2
  254. package/dist/item/definition.d.ts.map +1 -1
  255. package/dist/item/definition.js +33 -4
  256. package/dist/item/floorplan.d.ts +1 -1
  257. package/dist/item/floorplan.d.ts.map +1 -1
  258. package/dist/item/floorplan.js +35 -5
  259. package/dist/item/index.d.ts +1 -0
  260. package/dist/item/index.d.ts.map +1 -1
  261. package/dist/item/index.js +1 -0
  262. package/dist/item/model-loader.d.ts +2 -0
  263. package/dist/item/model-loader.d.ts.map +1 -1
  264. package/dist/item/model-loader.js +55 -23
  265. package/dist/item/move-tool.js +4 -4
  266. package/dist/item/paint.d.ts.map +1 -1
  267. package/dist/item/paint.js +5 -24
  268. package/dist/item/panel.d.ts +1 -3
  269. package/dist/item/panel.d.ts.map +1 -1
  270. package/dist/item/panel.js +20 -24
  271. package/dist/item/placement-notice.d.ts +14 -0
  272. package/dist/item/placement-notice.d.ts.map +1 -0
  273. package/dist/item/placement-notice.js +38 -0
  274. package/dist/item/plan-symbols.d.ts +67 -0
  275. package/dist/item/plan-symbols.d.ts.map +1 -0
  276. package/dist/item/plan-symbols.js +407 -0
  277. package/dist/item/renderer.d.ts +10 -0
  278. package/dist/item/renderer.d.ts.map +1 -1
  279. package/dist/item/renderer.js +64 -38
  280. package/dist/item/script-param-defaults.d.ts +12 -0
  281. package/dist/item/script-param-defaults.d.ts.map +1 -0
  282. package/dist/item/script-param-defaults.js +34 -0
  283. package/dist/lean-to-extension/definition.d.ts.map +1 -1
  284. package/dist/lean-to-extension/definition.js +1 -2
  285. package/dist/lean-to-extension/geometry.d.ts.map +1 -1
  286. package/dist/lean-to-extension/geometry.js +1 -1
  287. package/dist/lean-to-extension/layout.d.ts.map +1 -1
  288. package/dist/lean-to-extension/layout.js +2 -3
  289. package/dist/lean-to-extension/placement-validation.d.ts.map +1 -1
  290. package/dist/lean-to-extension/placement-validation.js +5 -5
  291. package/dist/lean-to-extension/tool.d.ts.map +1 -1
  292. package/dist/lean-to-extension/tool.js +5 -5
  293. package/dist/lineset/move-tool.d.ts.map +1 -1
  294. package/dist/lineset/move-tool.js +8 -2
  295. package/dist/liquid-line/move-tool.d.ts.map +1 -1
  296. package/dist/liquid-line/move-tool.js +8 -2
  297. package/dist/measurement/definition.js +1 -1
  298. package/dist/pipe-fitting/move-tool.d.ts.map +1 -1
  299. package/dist/pipe-fitting/move-tool.js +8 -2
  300. package/dist/pipe-segment/move-tool.d.ts.map +1 -1
  301. package/dist/pipe-segment/move-tool.js +8 -2
  302. package/dist/procedural-item/animation.d.ts +8 -0
  303. package/dist/procedural-item/animation.d.ts.map +1 -0
  304. package/dist/procedural-item/animation.js +116 -0
  305. package/dist/procedural-item/definition.d.ts.map +1 -1
  306. package/dist/procedural-item/definition.js +74 -8
  307. package/dist/procedural-item/geometry.d.ts +5 -1
  308. package/dist/procedural-item/geometry.d.ts.map +1 -1
  309. package/dist/procedural-item/geometry.js +239 -15
  310. package/dist/procedural-item/renderer.d.ts.map +1 -1
  311. package/dist/procedural-item/renderer.js +272 -23
  312. package/dist/ridge-vent/panel.d.ts.map +1 -1
  313. package/dist/ridge-vent/panel.js +5 -23
  314. package/dist/ridge-vent/renderer.d.ts.map +1 -1
  315. package/dist/ridge-vent/renderer.js +9 -8
  316. package/dist/roof/definition.d.ts.map +1 -1
  317. package/dist/roof/definition.js +4 -1
  318. package/dist/roof/floorplan.d.ts +8 -0
  319. package/dist/roof/floorplan.d.ts.map +1 -1
  320. package/dist/roof/floorplan.js +194 -18
  321. package/dist/roof/panel-model.d.ts.map +1 -1
  322. package/dist/roof/panel-model.js +10 -6
  323. package/dist/roof/panel.d.ts.map +1 -1
  324. package/dist/roof/panel.js +3 -10
  325. package/dist/roof/renderer.d.ts.map +1 -1
  326. package/dist/roof/renderer.js +5 -2
  327. package/dist/roof-segment/panel.d.ts.map +1 -1
  328. package/dist/roof-segment/panel.js +5 -24
  329. package/dist/roof-segment/renderer.d.ts.map +1 -1
  330. package/dist/roof-segment/renderer.js +17 -8
  331. package/dist/separator/definition.d.ts +3 -0
  332. package/dist/separator/definition.d.ts.map +1 -0
  333. package/dist/separator/definition.js +39 -0
  334. package/dist/separator/renderer.d.ts +5 -0
  335. package/dist/separator/renderer.d.ts.map +1 -0
  336. package/dist/separator/renderer.js +36 -0
  337. package/dist/shared/duct-body-paint.d.ts +0 -4
  338. package/dist/shared/duct-body-paint.d.ts.map +1 -1
  339. package/dist/shared/duct-body-paint.js +1 -5
  340. package/dist/shared/item-interaction-actions.d.ts +6 -0
  341. package/dist/shared/item-interaction-actions.d.ts.map +1 -0
  342. package/dist/shared/item-interaction-actions.js +27 -0
  343. package/dist/shared/item-interactions.d.ts +9 -0
  344. package/dist/shared/item-interactions.d.ts.map +1 -0
  345. package/dist/shared/item-interactions.js +74 -0
  346. package/dist/shared/item-light-placement.d.ts +2 -0
  347. package/dist/shared/item-light-placement.d.ts.map +1 -0
  348. package/dist/shared/item-light-placement.js +3 -0
  349. package/dist/shared/move-roof-tool.js +2 -1
  350. package/dist/shared/node-batch/batchable.d.ts +12 -0
  351. package/dist/shared/node-batch/batchable.d.ts.map +1 -0
  352. package/dist/shared/node-batch/batchable.js +41 -0
  353. package/dist/shared/node-batch/candidates.d.ts +7 -5
  354. package/dist/shared/node-batch/candidates.d.ts.map +1 -1
  355. package/dist/shared/node-batch/candidates.js +43 -59
  356. package/dist/shared/node-batch/release.d.ts +8 -0
  357. package/dist/shared/node-batch/release.d.ts.map +1 -0
  358. package/dist/shared/node-batch/release.js +16 -0
  359. package/dist/shared/node-batch/system.d.ts.map +1 -1
  360. package/dist/shared/node-batch/system.js +17 -12
  361. package/dist/shared/node-batch/types.d.ts +4 -1
  362. package/dist/shared/node-batch/types.d.ts.map +1 -1
  363. package/dist/shared/opening-documentation.d.ts +13 -1
  364. package/dist/shared/opening-documentation.d.ts.map +1 -1
  365. package/dist/shared/opening-documentation.js +245 -59
  366. package/dist/shared/opening-guides-runtime.d.ts.map +1 -1
  367. package/dist/shared/opening-guides-runtime.js +17 -14
  368. package/dist/shared/opening-placement-dimensions.d.ts.map +1 -1
  369. package/dist/shared/opening-placement-dimensions.js +3 -3
  370. package/dist/shared/opening-plane-offset.d.ts +23 -0
  371. package/dist/shared/opening-plane-offset.d.ts.map +1 -0
  372. package/dist/shared/opening-plane-offset.js +24 -0
  373. package/dist/shared/polygon-centroid-move.d.ts.map +1 -1
  374. package/dist/shared/polygon-centroid-move.js +4 -1
  375. package/dist/shared/polygon-vertex-affordance.d.ts.map +1 -1
  376. package/dist/shared/polygon-vertex-affordance.js +19 -15
  377. package/dist/shared/run-hangers.d.ts.map +1 -1
  378. package/dist/shared/run-hangers.js +5 -4
  379. package/dist/shared/scripted-opening-handles.d.ts +18 -0
  380. package/dist/shared/scripted-opening-handles.d.ts.map +1 -0
  381. package/dist/shared/scripted-opening-handles.js +53 -0
  382. package/dist/shared/scripted-opening.d.ts +25 -0
  383. package/dist/shared/scripted-opening.d.ts.map +1 -0
  384. package/dist/shared/scripted-opening.js +72 -0
  385. package/dist/shared/slot-paint.d.ts +14 -2
  386. package/dist/shared/slot-paint.d.ts.map +1 -1
  387. package/dist/shared/slot-paint.js +29 -29
  388. package/dist/shared/surface-paint.d.ts.map +1 -1
  389. package/dist/shared/surface-paint.js +2 -5
  390. package/dist/shared/swap-preview-material.d.ts +11 -0
  391. package/dist/shared/swap-preview-material.d.ts.map +1 -0
  392. package/dist/shared/swap-preview-material.js +16 -0
  393. package/dist/shared/system-checks.d.ts.map +1 -1
  394. package/dist/shared/system-checks.js +5 -3
  395. package/dist/shared/wall-attach-target.d.ts +3 -10
  396. package/dist/shared/wall-attach-target.d.ts.map +1 -1
  397. package/dist/shared/wall-attach-target.js +3 -63
  398. package/dist/shared/wall-opening-ceiling.d.ts +5 -15
  399. package/dist/shared/wall-opening-ceiling.d.ts.map +1 -1
  400. package/dist/shared/wall-opening-ceiling.js +10 -18
  401. package/dist/shelf/definition.d.ts.map +1 -1
  402. package/dist/shelf/definition.js +1 -1
  403. package/dist/shelf/geometry.d.ts.map +1 -1
  404. package/dist/shelf/geometry.js +1 -2
  405. package/dist/shelf/paint.d.ts.map +1 -1
  406. package/dist/shelf/paint.js +4 -10
  407. package/dist/site/line-ribbon.d.ts +31 -0
  408. package/dist/site/line-ribbon.d.ts.map +1 -0
  409. package/dist/site/line-ribbon.js +117 -0
  410. package/dist/site/lot-mask.d.ts +18 -0
  411. package/dist/site/lot-mask.d.ts.map +1 -0
  412. package/dist/site/lot-mask.js +35 -0
  413. package/dist/site/panel.d.ts +10 -0
  414. package/dist/site/panel.d.ts.map +1 -0
  415. package/dist/site/panel.js +155 -0
  416. package/dist/site/parametrics.d.ts +7 -0
  417. package/dist/site/parametrics.d.ts.map +1 -1
  418. package/dist/site/parametrics.js +8 -0
  419. package/dist/site/recessed-slab-ground-holes.d.ts.map +1 -1
  420. package/dist/site/recessed-slab-ground-holes.js +5 -2
  421. package/dist/site/renderer.d.ts.map +1 -1
  422. package/dist/site/renderer.js +150 -19
  423. package/dist/site/setbacks.d.ts +33 -0
  424. package/dist/site/setbacks.d.ts.map +1 -0
  425. package/dist/site/setbacks.js +204 -0
  426. package/dist/site/terrain-geometry.d.ts +28 -1
  427. package/dist/site/terrain-geometry.d.ts.map +1 -1
  428. package/dist/site/terrain-geometry.js +78 -4
  429. package/dist/site/terrain-holes.d.ts +15 -0
  430. package/dist/site/terrain-holes.d.ts.map +1 -0
  431. package/dist/site/terrain-holes.js +74 -0
  432. package/dist/site/terrain-mesh.d.ts +9 -2
  433. package/dist/site/terrain-mesh.d.ts.map +1 -1
  434. package/dist/site/terrain-mesh.js +36 -9
  435. package/dist/site/terrain-renderer.d.ts +9 -2
  436. package/dist/site/terrain-renderer.d.ts.map +1 -1
  437. package/dist/site/terrain-renderer.js +14 -4
  438. package/dist/slab/boundary-editor.d.ts +1 -1
  439. package/dist/slab/boundary-editor.d.ts.map +1 -1
  440. package/dist/slab/boundary-editor.js +13 -13
  441. package/dist/slab/definition.d.ts.map +1 -1
  442. package/dist/slab/definition.js +19 -3
  443. package/dist/slab/dependency-tracker.d.ts.map +1 -1
  444. package/dist/slab/dependency-tracker.js +67 -7
  445. package/dist/slab/elevation-limit.d.ts.map +1 -1
  446. package/dist/slab/elevation-limit.js +2 -2
  447. package/dist/slab/floorplan-affordances.d.ts +176 -4
  448. package/dist/slab/floorplan-affordances.d.ts.map +1 -1
  449. package/dist/slab/floorplan-affordances.js +0 -1
  450. package/dist/slab/floorplan-move.d.ts.map +1 -1
  451. package/dist/slab/floorplan-move.js +3 -4
  452. package/dist/slab/floorplan.d.ts +7 -0
  453. package/dist/slab/floorplan.d.ts.map +1 -1
  454. package/dist/slab/floorplan.js +22 -5
  455. package/dist/slab/geometry.d.ts.map +1 -1
  456. package/dist/slab/geometry.js +186 -76
  457. package/dist/slab/move-tool.js +7 -6
  458. package/dist/slab/paint.d.ts +18 -5
  459. package/dist/slab/paint.d.ts.map +1 -1
  460. package/dist/slab/paint.js +458 -9
  461. package/dist/slab/panel.d.ts.map +1 -1
  462. package/dist/slab/panel.js +28 -9
  463. package/dist/slab/placement-ownership.d.ts +2 -1
  464. package/dist/slab/placement-ownership.d.ts.map +1 -1
  465. package/dist/slab/placement-ownership.js +2 -2
  466. package/dist/slab/surface-split.d.ts +24 -0
  467. package/dist/slab/surface-split.d.ts.map +1 -0
  468. package/dist/slab/surface-split.js +389 -0
  469. package/dist/slab/tool.d.ts.map +1 -1
  470. package/dist/slab/tool.js +3 -3
  471. package/dist/stair/baluster-geometry.d.ts +21 -0
  472. package/dist/stair/baluster-geometry.d.ts.map +1 -0
  473. package/dist/stair/baluster-geometry.js +74 -0
  474. package/dist/stair/baluster-guard.d.ts +50 -0
  475. package/dist/stair/baluster-guard.d.ts.map +1 -0
  476. package/dist/stair/baluster-guard.js +71 -0
  477. package/dist/stair/boards-guard.d.ts +37 -0
  478. package/dist/stair/boards-guard.d.ts.map +1 -0
  479. package/dist/stair/boards-guard.js +61 -0
  480. package/dist/stair/cable-guard.d.ts +39 -0
  481. package/dist/stair/cable-guard.d.ts.map +1 -0
  482. package/dist/stair/cable-guard.js +105 -0
  483. package/dist/stair/construction-controls.d.ts +15 -0
  484. package/dist/stair/construction-controls.d.ts.map +1 -0
  485. package/dist/stair/construction-controls.js +29 -0
  486. package/dist/stair/continuous-railings.d.ts +10 -0
  487. package/dist/stair/continuous-railings.d.ts.map +1 -0
  488. package/dist/stair/continuous-railings.js +159 -0
  489. package/dist/stair/definition.d.ts.map +1 -1
  490. package/dist/stair/definition.js +16 -37
  491. package/dist/stair/documentation.d.ts +1 -1
  492. package/dist/stair/documentation.d.ts.map +1 -1
  493. package/dist/stair/documentation.js +10 -17
  494. package/dist/stair/floorplan-affordances.d.ts.map +1 -1
  495. package/dist/stair/floorplan-affordances.js +9 -25
  496. package/dist/stair/floorplan.d.ts +1 -23
  497. package/dist/stair/floorplan.d.ts.map +1 -1
  498. package/dist/stair/floorplan.js +102 -86
  499. package/dist/stair/glass-guard.d.ts +72 -0
  500. package/dist/stair/glass-guard.d.ts.map +1 -0
  501. package/dist/stair/glass-guard.js +167 -0
  502. package/dist/stair/guard-path.d.ts +119 -0
  503. package/dist/stair/guard-path.d.ts.map +1 -0
  504. package/dist/stair/guard-path.js +208 -0
  505. package/dist/stair/materials.d.ts +11 -0
  506. package/dist/stair/materials.d.ts.map +1 -0
  507. package/dist/stair/materials.js +51 -0
  508. package/dist/stair/metal-guard.d.ts +38 -0
  509. package/dist/stair/metal-guard.d.ts.map +1 -0
  510. package/dist/stair/metal-guard.js +79 -0
  511. package/dist/stair/paint.d.ts +32 -0
  512. package/dist/stair/paint.d.ts.map +1 -1
  513. package/dist/stair/paint.js +75 -36
  514. package/dist/stair/panel.d.ts.map +1 -1
  515. package/dist/stair/panel.js +154 -17
  516. package/dist/stair/parametrics.d.ts +1 -1
  517. package/dist/stair/parametrics.d.ts.map +1 -1
  518. package/dist/stair/parametrics.js +32 -15
  519. package/dist/stair/plan-entry.d.ts +31 -0
  520. package/dist/stair/plan-entry.d.ts.map +1 -0
  521. package/dist/stair/plan-entry.js +325 -0
  522. package/dist/stair/post-and-rail-guard.d.ts +31 -0
  523. package/dist/stair/post-and-rail-guard.d.ts.map +1 -0
  524. package/dist/stair/post-and-rail-guard.js +63 -0
  525. package/dist/stair/railing-controls.d.ts +9 -0
  526. package/dist/stair/railing-controls.d.ts.map +1 -0
  527. package/dist/stair/railing-controls.js +49 -0
  528. package/dist/stair/renderer.d.ts.map +1 -1
  529. package/dist/stair/renderer.js +259 -259
  530. package/dist/stair/use-stair-render-data.d.ts +317 -0
  531. package/dist/stair/use-stair-render-data.d.ts.map +1 -0
  532. package/dist/stair/use-stair-render-data.js +73 -0
  533. package/dist/stair-segment/definition.d.ts.map +1 -1
  534. package/dist/stair-segment/definition.js +51 -10
  535. package/dist/stair-segment/panel.d.ts.map +1 -1
  536. package/dist/stair-segment/panel.js +36 -42
  537. package/dist/stair-segment/parametrics.d.ts +1 -1
  538. package/dist/stair-segment/parametrics.d.ts.map +1 -1
  539. package/dist/stair-segment/parametrics.js +21 -8
  540. package/dist/stair-segment/renderer.d.ts.map +1 -1
  541. package/dist/stair-segment/renderer.js +16 -28
  542. package/dist/turbine-vent/definition.d.ts.map +1 -1
  543. package/dist/turbine-vent/definition.js +2 -5
  544. package/dist/turbine-vent/paint.d.ts.map +1 -1
  545. package/dist/turbine-vent/paint.js +2 -5
  546. package/dist/turbine-vent/panel.d.ts.map +1 -1
  547. package/dist/turbine-vent/panel.js +5 -23
  548. package/dist/unit/unit-panel.d.ts.map +1 -1
  549. package/dist/unit/unit-panel.js +6 -1
  550. package/dist/wall/actions.d.ts.map +1 -1
  551. package/dist/wall/actions.js +7 -2
  552. package/dist/wall/construction-dimensions.js +8 -5
  553. package/dist/wall/contextual-dimensions.js +4 -4
  554. package/dist/wall/curtain-wall-materials.d.ts +1 -1
  555. package/dist/wall/curtain-wall-materials.d.ts.map +1 -1
  556. package/dist/wall/curtain-wall-materials.js +2 -2
  557. package/dist/wall/curve-tool.d.ts.map +1 -1
  558. package/dist/wall/curve-tool.js +4 -0
  559. package/dist/wall/definition.d.ts.map +1 -1
  560. package/dist/wall/definition.js +41 -17
  561. package/dist/wall/floorplan-move.d.ts +1 -1
  562. package/dist/wall/floorplan-move.d.ts.map +1 -1
  563. package/dist/wall/floorplan-move.js +20 -83
  564. package/dist/wall/floorplan-tool.d.ts.map +1 -1
  565. package/dist/wall/floorplan-tool.js +10 -11
  566. package/dist/wall/floorplan.d.ts +3 -1
  567. package/dist/wall/floorplan.d.ts.map +1 -1
  568. package/dist/wall/floorplan.js +184 -21
  569. package/dist/wall/measurement.d.ts.map +1 -1
  570. package/dist/wall/measurement.js +5 -5
  571. package/dist/wall/move-endpoint-tool.d.ts.map +1 -1
  572. package/dist/wall/move-endpoint-tool.js +20 -7
  573. package/dist/wall/move-shared.d.ts.map +1 -1
  574. package/dist/wall/move-shared.js +11 -7
  575. package/dist/wall/move-tool.d.ts.map +1 -1
  576. package/dist/wall/move-tool.js +118 -148
  577. package/dist/wall/paint.d.ts +26 -15
  578. package/dist/wall/paint.d.ts.map +1 -1
  579. package/dist/wall/paint.js +306 -117
  580. package/dist/wall/panel-model.d.ts +18 -0
  581. package/dist/wall/panel-model.d.ts.map +1 -1
  582. package/dist/wall/panel-model.js +77 -19
  583. package/dist/wall/panel.d.ts.map +1 -1
  584. package/dist/wall/panel.js +217 -41
  585. package/dist/wall/parametrics.d.ts.map +1 -1
  586. package/dist/wall/parametrics.js +3 -0
  587. package/dist/wall/rectangle-command.d.ts +111 -12
  588. package/dist/wall/rectangle-command.d.ts.map +1 -1
  589. package/dist/wall/rectangle-tool.d.ts.map +1 -1
  590. package/dist/wall/rectangle-tool.js +26 -8
  591. package/dist/wall/renderer.d.ts.map +1 -1
  592. package/dist/wall/renderer.js +4 -2
  593. package/dist/wall/split-floorplan-layer.d.ts.map +1 -1
  594. package/dist/wall/split-floorplan-layer.js +7 -7
  595. package/dist/wall/split-session.d.ts.map +1 -1
  596. package/dist/wall/split-session.js +7 -1
  597. package/dist/wall/system.d.ts.map +1 -1
  598. package/dist/wall/system.js +36 -4
  599. package/dist/wall/tool.d.ts.map +1 -1
  600. package/dist/wall/tool.js +105 -49
  601. package/dist/wall/treatment-level-data.d.ts +3 -2
  602. package/dist/wall/treatment-level-data.d.ts.map +1 -1
  603. package/dist/wall/treatment-level-data.js +17 -13
  604. package/dist/wall/treatments.d.ts +10 -10
  605. package/dist/wall/treatments.d.ts.map +1 -1
  606. package/dist/wall/treatments.js +67 -54
  607. package/dist/wall/wall-batch-system.d.ts +7 -0
  608. package/dist/wall/wall-batch-system.d.ts.map +1 -1
  609. package/dist/wall/wall-batch-system.js +35 -3
  610. package/dist/wall/wall-batch.d.ts +6 -0
  611. package/dist/wall/wall-batch.d.ts.map +1 -1
  612. package/dist/wall/wall-batch.js +7 -1
  613. package/dist/window/definition.d.ts.map +1 -1
  614. package/dist/window/definition.js +12 -4
  615. package/dist/window/floorplan-move.d.ts.map +1 -1
  616. package/dist/window/floorplan-move.js +3 -1
  617. package/dist/window/floorplan.d.ts.map +1 -1
  618. package/dist/window/floorplan.js +145 -60
  619. package/dist/window/mechanism.d.ts +4 -0
  620. package/dist/window/mechanism.d.ts.map +1 -0
  621. package/dist/window/mechanism.js +20 -0
  622. package/dist/window/move-tool.d.ts.map +1 -1
  623. package/dist/window/move-tool.js +79 -48
  624. package/dist/window/paint.d.ts.map +1 -1
  625. package/dist/window/paint.js +3 -0
  626. package/dist/window/panel.d.ts.map +1 -1
  627. package/dist/window/panel.js +32 -88
  628. package/dist/window/placement.d.ts +23 -0
  629. package/dist/window/placement.d.ts.map +1 -0
  630. package/dist/window/placement.js +66 -0
  631. package/dist/window/preview.d.ts.map +1 -1
  632. package/dist/window/preview.js +2 -0
  633. package/dist/window/renderer.d.ts.map +1 -1
  634. package/dist/window/renderer.js +3 -2
  635. package/dist/window/tool.d.ts.map +1 -1
  636. package/dist/window/tool.js +96 -24
  637. package/dist/window/window-math.d.ts +6 -14
  638. package/dist/window/window-math.d.ts.map +1 -1
  639. package/dist/window/window-math.js +14 -20
  640. package/dist/zone/contextual-dimensions.d.ts.map +1 -1
  641. package/dist/zone/contextual-dimensions.js +6 -28
  642. package/dist/zone/definition.d.ts.map +1 -1
  643. package/dist/zone/definition.js +3 -3
  644. package/dist/zone/floorplan-affordances.d.ts +200 -0
  645. package/dist/zone/floorplan-affordances.d.ts.map +1 -1
  646. package/dist/zone/floorplan.d.ts +1 -1
  647. package/dist/zone/floorplan.d.ts.map +1 -1
  648. package/dist/zone/floorplan.js +93 -53
  649. package/dist/zone/quantities-panel.d.ts.map +1 -1
  650. package/dist/zone/quantities-panel.js +3 -14
  651. package/dist/zone/quick-measurement.d.ts +2 -2
  652. package/dist/zone/quick-measurement.d.ts.map +1 -1
  653. package/dist/zone/quick-measurement.js +6 -5
  654. package/dist/zone/renderer.d.ts +1 -1
  655. package/dist/zone/renderer.d.ts.map +1 -1
  656. package/dist/zone/renderer.js +58 -146
  657. package/dist/zone/room-clear-dimensions.js +3 -3
  658. package/dist/zone/room-documentation.d.ts.map +1 -1
  659. package/dist/zone/room-documentation.js +2 -6
  660. package/package.json +11 -11
  661. package/dist/block/slots.d.ts +0 -4
  662. package/dist/block/slots.d.ts.map +0 -1
  663. package/dist/block/slots.js +0 -17
  664. package/dist/cabinet/slots.d.ts +0 -4
  665. package/dist/cabinet/slots.d.ts.map +0 -1
  666. package/dist/cabinet/slots.js +0 -24
  667. package/dist/ceiling/slots.d.ts +0 -6
  668. package/dist/ceiling/slots.d.ts.map +0 -1
  669. package/dist/ceiling/slots.js +0 -7
  670. package/dist/column/slots.d.ts +0 -9
  671. package/dist/column/slots.d.ts.map +0 -1
  672. package/dist/column/slots.js +0 -19
  673. package/dist/door/slots.d.ts +0 -9
  674. package/dist/door/slots.d.ts.map +0 -1
  675. package/dist/door/slots.js +0 -20
  676. package/dist/elevator/slots.d.ts +0 -8
  677. package/dist/elevator/slots.d.ts.map +0 -1
  678. package/dist/elevator/slots.js +0 -17
  679. package/dist/fence/slots.d.ts +0 -10
  680. package/dist/fence/slots.d.ts.map +0 -1
  681. package/dist/fence/slots.js +0 -23
  682. package/dist/item/__fixtures__/main-floorplan.d.ts +0 -26
  683. package/dist/item/__fixtures__/main-floorplan.d.ts.map +0 -1
  684. package/dist/item/__fixtures__/main-floorplan.js +0 -297
  685. package/dist/lean-to-extension/slots.d.ts +0 -5
  686. package/dist/lean-to-extension/slots.d.ts.map +0 -1
  687. package/dist/lean-to-extension/slots.js +0 -15
  688. package/dist/shelf/slots.d.ts +0 -9
  689. package/dist/shelf/slots.d.ts.map +0 -1
  690. package/dist/shelf/slots.js +0 -30
  691. package/dist/slab/slots.d.ts +0 -10
  692. package/dist/slab/slots.d.ts.map +0 -1
  693. package/dist/slab/slots.js +0 -20
  694. package/dist/stair/floor-stack.d.ts +0 -10
  695. package/dist/stair/floor-stack.d.ts.map +0 -1
  696. package/dist/stair/floor-stack.js +0 -115
  697. package/dist/stair/slots.d.ts +0 -7
  698. package/dist/stair/slots.d.ts.map +0 -1
  699. package/dist/stair/slots.js +0 -13
  700. package/dist/wall/drawing-mode.d.ts +0 -12
  701. package/dist/wall/drawing-mode.d.ts.map +0 -1
  702. package/dist/wall/drawing-mode.js +0 -38
  703. package/dist/wall/slots.d.ts +0 -10
  704. package/dist/wall/slots.d.ts.map +0 -1
  705. package/dist/wall/slots.js +0 -92
  706. package/dist/window/slots.d.ts +0 -5
  707. package/dist/window/slots.d.ts.map +0 -1
  708. package/dist/window/slots.js +0 -11
@@ -0,0 +1,27 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { nodeMechanism, useInteractive, useScene } from '@pascal-app/core';
4
+ import { ActionMenuButton } from '@pascal-app/editor';
5
+ import { useViewer } from '@pascal-app/viewer';
6
+ import { Lightbulb, LightbulbOff } from 'lucide-react';
7
+ import { itemHasLights, itemLightsOn, toggleItemLights } from './item-interactions';
8
+ /**
9
+ * The light switch for a single selected item or procedural item. Play/Stop
10
+ * comes from the action menu's `capabilities.mechanism` button.
11
+ */
12
+ export default function ItemInteractionActions() {
13
+ const selected = useViewer((s) => s.selection.selectedIds);
14
+ const node = useScene((s) => selected.length === 1 ? s.nodes[selected[0]] : undefined);
15
+ const hasLights = itemHasLights(node);
16
+ const lit = useInteractive((s) => (node && hasLights ? itemLightsOn(node, s) : false));
17
+ if (!(node && hasLights))
18
+ return null;
19
+ return (_jsx(ActionMenuButton
20
+ // E runs the mechanism when there is one, and only otherwise the light.
21
+ , {
22
+ // E runs the mechanism when there is one, and only otherwise the light.
23
+ keys: nodeMechanism(node) ? undefined : ['E'], label: lit ? 'Turn light off' : 'Turn light on', onClick: (event) => {
24
+ event.stopPropagation();
25
+ toggleItemLights(node);
26
+ }, pressed: lit, children: lit ? _jsx(Lightbulb, { className: "h-4 w-4" }) : _jsx(LightbulbOff, { className: "h-4 w-4" }) }));
27
+ }
@@ -0,0 +1,9 @@
1
+ import { type AnyNode, type InteractiveState, type MechanismCapability } from '@pascal-app/core';
2
+ /** A catalog item's animation toggles: every toggle but the light switch. */
3
+ export declare const itemMechanism: MechanismCapability;
4
+ /** A procedural item's moving parts, all driven through its motion timeline. */
5
+ export declare const proceduralMechanism: MechanismCapability;
6
+ export declare function itemHasLights(node: AnyNode | undefined): boolean;
7
+ export declare function itemLightsOn(node: AnyNode, state: InteractiveState): boolean;
8
+ export declare function toggleItemLights(node: AnyNode): void;
9
+ //# sourceMappingURL=item-interactions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-interactions.d.ts","sourceRoot":"","sources":["../../src/shared/item-interactions.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAEzB,MAAM,kBAAkB,CAAA;AA4BzB,6EAA6E;AAC7E,eAAO,MAAM,aAAa,EAAE,mBAY3B,CAAA;AAED,gFAAgF;AAChF,eAAO,MAAM,mBAAmB,EAAE,mBAKjC,CAAA;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAKhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAQ5E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,QAW7C"}
@@ -0,0 +1,74 @@
1
+ import { useInteractive, } from '@pascal-app/core';
2
+ import { operableParts } from '@pascal-app/core/procedural-items';
3
+ // Catalog light and animation effects both read the first toggle, so on a lamp
4
+ // that toggle is the light switch and any further toggles are the mechanisms.
5
+ function catalogToggles(interactive) {
6
+ const toggles = interactive.controls.flatMap((control, index) => control.kind === 'toggle' ? [index] : []);
7
+ const light = interactive.effects.some((effect) => effect.kind === 'light')
8
+ ? (toggles[0] ?? -1)
9
+ : -1;
10
+ const mechanisms = interactive.effects.some((effect) => effect.kind === 'animation')
11
+ ? toggles.filter((index) => index !== light)
12
+ : [];
13
+ return { light, mechanisms };
14
+ }
15
+ function motionPartIds(node) {
16
+ return node.type === 'procedural-item' ? operableParts(node.recipe).map((part) => part.id) : [];
17
+ }
18
+ function mechanismToggles(node) {
19
+ return node.type === 'item' && node.asset.interactive
20
+ ? catalogToggles(node.asset.interactive).mechanisms
21
+ : [];
22
+ }
23
+ /** A catalog item's animation toggles: every toggle but the light switch. */
24
+ export const itemMechanism = {
25
+ has: (node) => mechanismToggles(node).length > 0,
26
+ isOn: (node, state) => {
27
+ const values = state.items[node.id]?.controlValues;
28
+ return mechanismToggles(node).some((index) => Boolean(values?.[index]));
29
+ },
30
+ set: (node, on) => {
31
+ if (node.type !== 'item' || !node.asset.interactive)
32
+ return;
33
+ const state = useInteractive.getState();
34
+ state.initItem(node.id, node.asset.interactive);
35
+ for (const index of mechanismToggles(node))
36
+ state.setControlValue(node.id, index, on);
37
+ },
38
+ };
39
+ /** A procedural item's moving parts, all driven through its motion timeline. */
40
+ export const proceduralMechanism = {
41
+ has: (node) => motionPartIds(node).length > 0,
42
+ isOn: (node, state) => motionPartIds(node).some((partId) => state.procedural[node.id]?.parts[partId]),
43
+ set: (node, on) => useInteractive.getState().setProceduralParts(node.id, motionPartIds(node), on),
44
+ };
45
+ export function itemHasLights(node) {
46
+ if (node?.type === 'procedural-item')
47
+ return node.recipe.parts.some((part) => part.light);
48
+ if (node?.type === 'item' && node.asset.interactive)
49
+ return catalogToggles(node.asset.interactive).light >= 0;
50
+ return false;
51
+ }
52
+ export function itemLightsOn(node, state) {
53
+ if (node.type === 'procedural-item')
54
+ return state.procedural[node.id]?.lightsOn ?? state.lampDefault;
55
+ if (node.type === 'item' && node.asset.interactive) {
56
+ const { light } = catalogToggles(node.asset.interactive);
57
+ return light >= 0 && Boolean(state.items[node.id]?.controlValues[light]);
58
+ }
59
+ return false;
60
+ }
61
+ export function toggleItemLights(node) {
62
+ const state = useInteractive.getState();
63
+ if (node.type === 'procedural-item') {
64
+ state.toggleProceduralLights(node.id);
65
+ return;
66
+ }
67
+ if (node.type !== 'item' || !node.asset.interactive)
68
+ return;
69
+ const { light } = catalogToggles(node.asset.interactive);
70
+ if (light < 0)
71
+ return;
72
+ state.initItem(node.id, node.asset.interactive);
73
+ state.setControlValue(node.id, light, !itemLightsOn(node, useInteractive.getState()));
74
+ }
@@ -0,0 +1,2 @@
1
+ export declare function canRegisterItemLight(metadata: Record<string, unknown> | undefined): boolean;
2
+ //# sourceMappingURL=item-light-placement.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-light-placement.d.ts","sourceRoot":"","sources":["../../src/shared/item-light-placement.ts"],"names":[],"mappings":"AAAA,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,OAAO,CAE3F"}
@@ -0,0 +1,3 @@
1
+ export function canRegisterItemLight(metadata) {
2
+ return metadata?.isNew !== true;
3
+ }
@@ -1,9 +1,10 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { collectAlignmentAnchors, emitter, movingAlignmentAnchors, nodeRegistry, resolveAlignment, resolveSupportSlabPatch, sceneRegistry, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
3
- import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isMagneticSnapActive, resolvePlanarCursorPosition, snapFenceDraftPoint, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFreshPlacementVisibility, } from '@pascal-app/editor';
3
+ import { CursorSphere, commitFreshPlacementSubtree, consumePlacementDragRelease, DragBoundingBox, getFloorStackPreviewPosition, isMagneticSnapActive, resolvePlanarCursorPosition, stripPlacementMetadataFlags, triggerSFX, useAlignmentGuides, useEditor, useFreshPlacementVisibility, } from '@pascal-app/editor';
4
4
  import { useViewer } from '@pascal-app/viewer';
5
5
  import { useCallback, useEffect, useRef, useState } from 'react';
6
6
  import * as THREE from 'three';
7
+ import { snapFenceDraftPoint } from '../fence/drafting';
7
8
  /** Figma-style alignment-snap threshold (meters), matching the other tools. */
8
9
  const ALIGNMENT_THRESHOLD_M = 0.08;
9
10
  function disableRaycastDuringDrag(root) {
@@ -0,0 +1,12 @@
1
+ import { type AnyNode, type BatchableConfig } from '@pascal-app/core';
2
+ /** One packed allocation per node mesh, for geometry each rebuild replaces. */
3
+ export declare const nodeMeshBatchKey: (node: AnyNode, meshIndex: number) => string;
4
+ export declare const columnBatchable: BatchableConfig;
5
+ /** Ceiling undersides and slab bodies are trimmed by walls and rebuilt in place. */
6
+ export declare const surfaceBatchable: BatchableConfig;
7
+ export declare const itemBatchable: BatchableConfig;
8
+ export declare const doorBatchable: BatchableConfig;
9
+ export declare const windowBatchable: BatchableConfig;
10
+ /** Imported meshes and blocks build their own geometry per node, rebuilt in place. */
11
+ export declare const perNodeGeometryBatchable: BatchableConfig;
12
+ //# sourceMappingURL=batchable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batchable.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/batchable.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAGrB,MAAM,kBAAkB,CAAA;AAEzB,+EAA+E;AAC/E,eAAO,MAAM,gBAAgB,GAAI,MAAM,OAAO,EAAE,WAAW,MAAM,WAA8B,CAAA;AAE/F,eAAO,MAAM,eAAe,EAAE,eAI7B,CAAA;AAED,oFAAoF;AACpF,eAAO,MAAM,gBAAgB,EAAE,eAI9B,CAAA;AAED,eAAO,MAAM,aAAa,EAAE,eAgB3B,CAAA;AAID,eAAO,MAAM,aAAa,EAAE,eAG3B,CAAA;AAED,eAAO,MAAM,eAAe,EAAE,eAG7B,CAAA;AAED,sFAAsF;AACtF,eAAO,MAAM,wBAAwB,EAAE,eAGtC,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { itemClipRegistry, useInteractive, } from '@pascal-app/core';
2
+ /** One packed allocation per node mesh, for geometry each rebuild replaces. */
3
+ export const nodeMeshBatchKey = (node, meshIndex) => `${node.id}:${meshIndex}`;
4
+ export const columnBatchable = {
5
+ scope: 'level',
6
+ excluded: (node) => itemClipRegistry.has(node.id),
7
+ settled: (data) => !data.scriptedColumn || data.itemModelSettled === true,
8
+ };
9
+ /** Ceiling undersides and slab bodies are trimmed by walls and rebuilt in place. */
10
+ export const surfaceBatchable = {
11
+ scope: 'level',
12
+ batchKey: nodeMeshBatchKey,
13
+ waitsForWalls: true,
14
+ };
15
+ export const itemBatchable = {
16
+ scope: 'level',
17
+ // An animation effect or a registered clip means the item animates its own
18
+ // subtree (a fan's spin) — per-mesh transforms move under a static batch
19
+ // instance. Light effects drive separate light objects, so a lit porch or
20
+ // lamp still batches.
21
+ excluded: (node) => Boolean(node.asset?.interactive?.effects?.some((effect) => effect.kind === 'animation')) || itemClipRegistry.has(node.id),
22
+ // Items hold their dirty mark until the GLB settles. A GLB that ships clips
23
+ // autoplays its first one even without an interactive effect
24
+ // (ItemAnimation's no-effect fallback) — static batching would freeze it.
25
+ settled: (userData) => userData.itemModelSettled === true && userData.itemHasAnimations !== true,
26
+ };
27
+ // Mid-swing openings rebuild per tick off their animation record; the
28
+ // completion dirty mark re-joins them at the settled pose.
29
+ export const doorBatchable = {
30
+ scope: 'wall',
31
+ excluded: (node) => node.id in useInteractive.getState().doorAnimations,
32
+ };
33
+ export const windowBatchable = {
34
+ scope: 'wall',
35
+ excluded: (node) => node.id in useInteractive.getState().windowAnimations,
36
+ };
37
+ /** Imported meshes and blocks build their own geometry per node, rebuilt in place. */
38
+ export const perNodeGeometryBatchable = {
39
+ scope: 'level',
40
+ batchKey: nodeMeshBatchKey,
41
+ };
@@ -1,11 +1,13 @@
1
+ import { type AnyNode, type BatchableConfig } from '@pascal-app/core';
1
2
  import type { BatchCandidate } from './types';
2
3
  /**
3
- * Candidate collection + source hide/reveal for node batching. Counterpart of
4
- * the wall batch's `toCandidate` (../../wall/wall-batch-system.tsx), walking
5
- * each node's mounted subtree instead of a single wall mesh.
4
+ * Kinds that declare `capabilities.batchable`, re-read when a plugin
5
+ * registers. Walls keep their merged-geometry batch.
6
6
  */
7
- /** Kinds the batch system manages. Walls keep their merged-geometry batch. */
8
- export declare const BATCH_KINDS: ReadonlySet<string>;
7
+ export declare function batchableKinds(): ReadonlyMap<string, BatchableConfig>;
8
+ export declare function batchableConfig(node: AnyNode | undefined): BatchableConfig | undefined;
9
+ /** A wall-scoped node (door, window) moves with its host wall. */
10
+ export declare function isWallHosted(node: AnyNode | undefined): boolean;
9
11
  export declare function collectBatchCandidate(nodeId: string): BatchCandidate | null;
10
12
  export declare function hideBatchedNode(candidate: BatchCandidate): void;
11
13
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/candidates.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAEzD;;;;GAIG;AAEH,8EAA8E;AAC9E,eAAO,MAAM,WAAW,EAAE,WAAW,CAAC,MAAM,CAO1C,CAAA;AA2EF,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAqF3E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAyB5E;AAED,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC,CAOzD"}
1
+ {"version":3,"file":"candidates.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/candidates.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EAEZ,KAAK,eAAe,EAOrB,MAAM,kBAAkB,CAAA;AAIzB,OAAO,KAAK,EAAE,cAAc,EAAc,MAAM,SAAS,CAAA;AAWzD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,WAAW,CAAC,MAAM,EAAE,eAAe,CAAC,CAYrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,eAAe,GAAG,SAAS,CAEtF;AAED,kEAAkE;AAClE,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAE/D;AAsDD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAsE3E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAI/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,IAAI,IAAI,CAQ5C;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAyB5E;AAED,wBAAgB,mBAAmB,IAAI,WAAW,CAAC,MAAM,CAAC,CAOzD"}
@@ -1,4 +1,4 @@
1
- import { itemClipRegistry, sceneRegistry, useInteractive, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
1
+ import { getRegistryVersion, nodeRegistry, sceneRegistry, useLiveNodeOverrides, useLiveTransforms, useScene, } from '@pascal-app/core';
2
2
  import { hideFromScene, SCENE_LAYER, showInScene, useViewer } from '@pascal-app/viewer';
3
3
  import { Matrix4 } from 'three';
4
4
  import { isSlotPaintPreviewActive } from '../slot-paint';
@@ -7,15 +7,33 @@ import { isSlotPaintPreviewActive } from '../slot-paint';
7
7
  * the wall batch's `toCandidate` (../../wall/wall-batch-system.tsx), walking
8
8
  * each node's mounted subtree instead of a single wall mesh.
9
9
  */
10
- /** Kinds the batch system manages. Walls keep their merged-geometry batch. */
11
- export const BATCH_KINDS = new Set([
12
- 'item',
13
- 'column',
14
- 'door',
15
- 'window',
16
- 'ceiling',
17
- 'slab',
18
- ]);
10
+ let batchKindsVersion = -1;
11
+ let batchKinds = new Map();
12
+ /**
13
+ * Kinds that declare `capabilities.batchable`, re-read when a plugin
14
+ * registers. Walls keep their merged-geometry batch.
15
+ */
16
+ export function batchableKinds() {
17
+ const version = getRegistryVersion();
18
+ if (version !== batchKindsVersion) {
19
+ const kinds = new Map();
20
+ for (const [kind, definition] of nodeRegistry.entries()) {
21
+ const batchable = definition.capabilities?.batchable;
22
+ if (batchable)
23
+ kinds.set(kind, batchable);
24
+ }
25
+ batchKinds = kinds;
26
+ batchKindsVersion = version;
27
+ }
28
+ return batchKinds;
29
+ }
30
+ export function batchableConfig(node) {
31
+ return node ? batchableKinds().get(node.type) : undefined;
32
+ }
33
+ /** A wall-scoped node (door, window) moves with its host wall. */
34
+ export function isWallHosted(node) {
35
+ return batchableConfig(node)?.scope === 'wall';
36
+ }
19
37
  const rootInverse = new Matrix4();
20
38
  /** Source meshes currently draw-hidden per node, so reveal needs no candidate. */
21
39
  const hiddenMeshesByNode = new Map();
@@ -42,22 +60,19 @@ function collectMeshes(object, out, hostedRoots) {
42
60
  }
43
61
  /**
44
62
  * The level this node's batches live under, or null when the node is not in
45
- * batchable scope. Items, columns, ceilings and slabs qualify directly under a level;
46
- * doors and windows through a wall that is itself parented to a level. Other
63
+ * batchable scope. Level-scoped kinds qualify directly under a level; doors
64
+ * and windows through a wall that is itself parented to a level. Other
47
65
  * hosting shapes (roof faces, blocks, wall-hosted items) move when their host
48
66
  * changes without any signal the batch would see — they draw themselves.
49
67
  */
50
- function resolveLevelId(node, nodes) {
68
+ function resolveLevelId(node, batchable, nodes) {
51
69
  const parent = node.parentId ? nodes[node.parentId] : undefined;
52
70
  if (!parent)
53
71
  return null;
54
- if (node.type === 'item' ||
55
- node.type === 'column' ||
56
- node.type === 'ceiling' ||
57
- node.type === 'slab') {
72
+ if (batchable.scope === 'level') {
58
73
  return parent.type === 'level' ? parent.id : null;
59
74
  }
60
- // door / window: host wall → its level. A hidden wall hides its openings
75
+ // Wall-hosted: host wall → its level. A hidden wall hides its openings
61
76
  // through group visibility — batch instances hang off the level root and
62
77
  // would keep drawing them.
63
78
  if (parent.type !== 'wall' || parent.visible === false)
@@ -65,60 +80,29 @@ function resolveLevelId(node, nodes) {
65
80
  const level = parent.parentId ? nodes[parent.parentId] : undefined;
66
81
  return level?.type === 'level' ? level.id : null;
67
82
  }
68
- function isExcluded(node) {
69
- if (node.type === 'item') {
70
- const asset = node.asset;
71
- if (asset?.interactive)
72
- return true;
73
- // A registered clip means the item animates its own subtree (a fan's
74
- // spin) — per-mesh transforms move under a static batch instance.
75
- if (itemClipRegistry.has(node.id))
76
- return true;
77
- return false;
78
- }
79
- if (node.type === 'door') {
80
- // Mid-swing doors rebuild per tick off their animation record; the
81
- // completion dirty mark re-joins them at the settled pose.
82
- return node.id in useInteractive.getState().doorAnimations;
83
- }
84
- if (node.type === 'window') {
85
- return node.id in useInteractive.getState().windowAnimations;
86
- }
87
- return false;
88
- }
89
83
  export function collectBatchCandidate(nodeId) {
90
84
  const nodes = useScene.getState().nodes;
91
85
  const node = nodes[nodeId];
92
- if (!node || !BATCH_KINDS.has(node.type) || node.visible === false)
86
+ const batchable = batchableConfig(node);
87
+ if (!node || !batchable || node.visible === false)
93
88
  return null;
94
- const levelId = resolveLevelId(node, nodes);
89
+ const levelId = resolveLevelId(node, batchable, nodes);
95
90
  if (!levelId)
96
91
  return null;
97
- if (isExcluded(node) || isSlotPaintPreviewActive(nodeId))
92
+ if (batchable.excluded?.(node) || isSlotPaintPreviewActive(nodeId))
98
93
  return null;
99
94
  const group = sceneRegistry.nodes.get(nodeId);
100
95
  if (!group)
101
96
  return null;
102
- // Items hold their dirty mark until the GLB settles; other kinds mount
103
- // their real geometry synchronously and carry no such flag. A GLB that
104
- // ships clips autoplays its first one even without an interactive effect
105
- // (ItemAnimation's no-effect fallback) — static batching would freeze it.
106
- if (node.type === 'item') {
107
- const userData = group.userData;
108
- if (userData.itemModelSettled !== true)
109
- return null;
110
- if (userData.itemHasAnimations === true)
111
- return null;
112
- }
97
+ if (batchable.settled && !batchable.settled(group.userData))
98
+ return null;
113
99
  // A live override on the node (or, for hosted openings, on the host wall)
114
100
  // means an in-flight gesture: transforms are moving under our feet and the
115
101
  // commit's dirty mark has not landed yet.
116
102
  const overrides = useLiveNodeOverrides.getState();
117
103
  if (overrides.get(nodeId) || useLiveTransforms.getState().get(nodeId))
118
104
  return null;
119
- if ((node.type === 'door' || node.type === 'window') &&
120
- node.parentId &&
121
- overrides.get(node.parentId)) {
105
+ if (batchable.scope === 'wall' && node.parentId && overrides.get(node.parentId)) {
122
106
  return null;
123
107
  }
124
108
  const levelRoot = sceneRegistry.nodes.get(levelId);
@@ -157,7 +141,7 @@ export function collectBatchCandidate(nodeId) {
157
141
  entries.push({
158
142
  nodeId,
159
143
  levelId,
160
- allocationKey: node.type === 'ceiling' || node.type === 'slab' ? `${nodeId}:${meshIndex}` : undefined,
144
+ allocationKey: batchable.batchKey?.(node, meshIndex),
161
145
  mesh,
162
146
  geometry: mesh.geometry,
163
147
  material,
@@ -238,7 +222,7 @@ export function collectTintedNodes(nodeIds) {
238
222
  if (tinted.has(id))
239
223
  continue;
240
224
  const node = nodes[id];
241
- if (!node || (node.type !== 'door' && node.type !== 'window'))
225
+ if (!node || !isWallHosted(node))
242
226
  continue;
243
227
  const wallId = node.parentId;
244
228
  if (!wallId)
@@ -250,7 +234,7 @@ export function collectTintedNodes(nodeIds) {
250
234
  }
251
235
  export function getBatchableNodeIds() {
252
236
  const out = new Set();
253
- for (const kind of BATCH_KINDS) {
237
+ for (const kind of batchableKinds().keys()) {
254
238
  const ids = sceneRegistry.byType[kind];
255
239
  if (ids)
256
240
  for (const id of ids)
@@ -0,0 +1,8 @@
1
+ /** The node batch listens here; kept apart from `system.tsx` so renderers can import it. */
2
+ export declare function subscribeBatchReleases(listener: (nodeId: string) => void): () => void;
3
+ /**
4
+ * A renderer whose meshes start or stop moving inside a frame (a procedural
5
+ * motion) reports it here: the node draws itself, then rejoins once quiet.
6
+ */
7
+ export declare function releaseFromBatch(nodeId: string): void;
8
+ //# sourceMappingURL=release.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/release.ts"],"names":[],"mappings":"AAEA,4FAA4F;AAC5F,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAKrF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAErD"}
@@ -0,0 +1,16 @@
1
+ const listeners = new Set();
2
+ /** The node batch listens here; kept apart from `system.tsx` so renderers can import it. */
3
+ export function subscribeBatchReleases(listener) {
4
+ listeners.add(listener);
5
+ return () => {
6
+ listeners.delete(listener);
7
+ };
8
+ }
9
+ /**
10
+ * A renderer whose meshes start or stop moving inside a frame (a procedural
11
+ * motion) reports it here: the node draws itself, then rejoins once quiet.
12
+ */
13
+ export function releaseFromBatch(nodeId) {
14
+ for (const listener of listeners)
15
+ listener(nodeId);
16
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/system.tsx"],"names":[],"mappings":"AAwHA,wBAAgB,mBAAmB,SAiBlC;AAkCD,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CA2B7E;AAED,wBAAgB,mBAAmB,SAmBlC;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,IAAI,EACtB,OAAO,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAA;CAAE,QAmB3D;AAgPD,eAAO,MAAM,eAAe,0CAG3B,CAAA"}
1
+ {"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../../../src/shared/node-batch/system.tsx"],"names":[],"mappings":"AA2HA,wBAAgB,mBAAmB,SAkBlC;AAkCD,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CA4B7E;AAED,wBAAgB,mBAAmB,SAgBlC;AAED,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,IAAI,EACtB,OAAO,EAAE;IAAE,OAAO,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAA;CAAE,QAmB3D;AAqPD,eAAO,MAAM,eAAe,0CAG3B,CAAA"}
@@ -5,7 +5,8 @@ import { getPendingWallRebuildCount, isIsolationActive, publishPerfBatchStats, r
5
5
  import { useFrame, useThree } from '@react-three/fiber';
6
6
  import { useEffect, useRef } from 'react';
7
7
  import { isSlotPaintPreviewActive, subscribeSlotPaintPreviews } from '../slot-paint';
8
- import { BATCH_KINDS, collectBatchCandidate, collectTintedNodes, getBatchableNodeIds, hideBatchedNode, revealAllBatchedHolds, revealBatchedNode, } from './candidates';
8
+ import { batchableConfig, collectBatchCandidate, collectTintedNodes, getBatchableNodeIds, hideBatchedNode, isWallHosted, revealAllBatchedHolds, revealBatchedNode, } from './candidates';
9
+ import { subscribeBatchReleases } from './release';
9
10
  import { NodeBatchStore } from './store';
10
11
  import { MIN_BATCH_ENTRIES, NODE_BATCH_SETTLE_MS } from './types';
11
12
  /**
@@ -49,6 +50,7 @@ const waveDebug = { runs: 0, stale: 0, candidates: 0, joined: 0, nullCandidates:
49
50
  let lastNodeChangeAtMs = 0;
50
51
  let batchingSuspended = false;
51
52
  let lastLevelMode;
53
+ let lastHideAbove;
52
54
  let lastSelectedLevel;
53
55
  const lastAppearance = {
54
56
  shading: undefined,
@@ -88,6 +90,7 @@ export function resetNodeBatchState() {
88
90
  lastNodeChangeAtMs = 0;
89
91
  batchingSuspended = false;
90
92
  lastLevelMode = undefined;
93
+ lastHideAbove = undefined;
91
94
  lastSelectedLevel = undefined;
92
95
  lastAppearance.shading = undefined;
93
96
  lastAppearance.textures = undefined;
@@ -127,8 +130,7 @@ function releaseAll() {
127
130
  }
128
131
  export function subscribeBatchInteractions(invalidate) {
129
132
  const changed = (nodeId) => {
130
- const node = useScene.getState().nodes[nodeId];
131
- if (!node || !BATCH_KINDS.has(node.type))
133
+ if (!batchableConfig(useScene.getState().nodes[nodeId]))
132
134
  return;
133
135
  releaseNode(nodeId);
134
136
  changedNodes.add(nodeId);
@@ -145,6 +147,7 @@ export function subscribeBatchInteractions(invalidate) {
145
147
  }
146
148
  });
147
149
  const unsubscribePreviews = subscribeSlotPaintPreviews(changed);
150
+ const unsubscribeReleases = subscribeBatchReleases(changed);
148
151
  const unsubscribeMaterials = registerMaterialCacheCleanup(() => {
149
152
  releaseAll();
150
153
  for (const nodeId of getBatchableNodeIds())
@@ -154,6 +157,7 @@ export function subscribeBatchInteractions(invalidate) {
154
157
  return () => {
155
158
  unsubscribeTransforms();
156
159
  unsubscribePreviews();
160
+ unsubscribeReleases();
157
161
  unsubscribeMaterials();
158
162
  };
159
163
  }
@@ -166,16 +170,14 @@ export function captureChangedNodes() {
166
170
  const node = nodes[id];
167
171
  if (!node)
168
172
  continue;
169
- if (BATCH_KINDS.has(node.type))
173
+ if (batchableConfig(node))
170
174
  changedNodes.add(id);
171
175
  else if (node.type === 'wall' && Array.isArray(node.children)) {
172
176
  // The wall edit moved its openings in level space; their own marks may
173
177
  // never come.
174
178
  for (const childId of node.children) {
175
- const child = nodes[childId];
176
- if (child && (child.type === 'door' || child.type === 'window')) {
179
+ if (isWallHosted(nodes[childId]))
177
180
  changedNodes.add(childId);
178
- }
179
181
  }
180
182
  }
181
183
  }
@@ -232,8 +234,11 @@ function processBatchFrame(invalidate, wakeRef) {
232
234
  }
233
235
  changedNodes.clear();
234
236
  const viewer = useViewer.getState();
235
- if (lastLevelMode !== viewer.levelMode || lastSelectedLevel !== viewer.selection.levelId) {
237
+ if (lastLevelMode !== viewer.levelMode ||
238
+ lastHideAbove !== viewer.hideLevelsAboveSelection ||
239
+ lastSelectedLevel !== viewer.selection.levelId) {
236
240
  lastLevelMode = viewer.levelMode;
241
+ lastHideAbove = viewer.hideLevelsAboveSelection;
237
242
  lastSelectedLevel = viewer.selection.levelId;
238
243
  // Shadow-only sources were rejected and dropped from the previous join wave.
239
244
  for (const nodeId of nodeIds)
@@ -365,12 +370,12 @@ function processBatchFrame(invalidate, wakeRef) {
365
370
  for (const nodeId of staleNodes) {
366
371
  if (store.has(nodeId))
367
372
  continue;
373
+ const node = sceneNodes[nodeId];
368
374
  // Overrides defer like tint/dirt — an in-flight gesture ends with a
369
375
  // 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 ?? ''))) ||
376
+ if ((node &&
377
+ batchableConfig(node)?.waitsForWalls &&
378
+ (wallsPending || surfaceLevelReadyAt.has(node.parentId ?? ''))) ||
374
379
  tinted.has(nodeId) ||
375
380
  dirty.has(nodeId) ||
376
381
  overrides.get(nodeId) !== undefined ||
@@ -7,7 +7,8 @@ import type { BufferGeometry, Material, Matrix4, Mesh, Object3D } from 'three';
7
7
  * `(levelId, material, attribute-signature, castShadow, receiveShadow)`;
8
8
  * membership changes are incremental instance adds/deletes.
9
9
  *
10
- * Batched kinds: items, columns, ceilings and slabs (level-parented), doors
10
+ * Batched kinds declare `capabilities.batchable`: items, columns, ceilings,
11
+ * slabs, procedural items, imported meshes and blocks (level-parented), doors
11
12
  * and windows (wall-hosted, resolved to the host wall's level). Walls keep
12
13
  * their own merged-geometry batch and cutaway lifecycle.
13
14
  *
@@ -27,6 +28,8 @@ import type { BufferGeometry, Material, Matrix4, Mesh, Object3D } from 'three';
27
28
  * openings (their level-space transforms move with the wall).
28
29
  * - Doors/windows with an active animation record are excluded while it
29
30
  * runs; the completion dirty mark re-joins them at the settled pose.
31
+ * Procedural items are excluded while a motion plays and whenever they
32
+ * carry part lights.
30
33
  */
31
34
  /** One batchable mesh of one node. */
32
35
  export type BatchEntry = {
@@ -1 +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"}
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;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"}
@@ -15,6 +15,8 @@ export type OpeningDimensionDocumentation = {
15
15
  };
16
16
  export type OpeningFloorplanLevelData = {
17
17
  markById: ReadonlyMap<string, string>;
18
+ /** The drafted-sheet numbering, resolved on first use so the editor plan never pays for it. */
19
+ draftingMarkById: () => ReadonlyMap<string, string>;
18
20
  };
19
21
  export declare function computeDoorFloorplanLevelData(args: {
20
22
  siblings: ReadonlyArray<DoorNode>;
@@ -30,6 +32,7 @@ export declare function buildDoorFloorplanSchedule(args: {
30
32
  levelId: string;
31
33
  unit: ConstructionLinearUnit;
32
34
  profile?: ConstructionLengthProfile;
35
+ drafting?: boolean;
33
36
  }): FloorplanSchedule | null;
34
37
  export declare function buildWindowFloorplanSchedule(args: {
35
38
  siblings: ReadonlyArray<WindowNode>;
@@ -37,10 +40,19 @@ export declare function buildWindowFloorplanSchedule(args: {
37
40
  levelId: string;
38
41
  unit: ConstructionLinearUnit;
39
42
  profile?: ConstructionLengthProfile;
43
+ drafting?: boolean;
40
44
  }): FloorplanSchedule | null;
41
- export declare function buildOpeningMarkAnnotation(opening: OpeningNode, wall: WallNode, levelData: OpeningFloorplanLevelData | undefined, { preferredSide, stroke, }?: {
45
+ export declare const OPENING_TAG_HEIGHT: number;
46
+ export declare const OPENING_TAG_STROKE_WIDTH: number;
47
+ export declare const OPENING_TAG_FONT_SIZE: number;
48
+ export declare const OPENING_TAG_LEADER_WIDTH: number;
49
+ /** Clear distance from the wall face to the near edge of the tag. */
50
+ export declare const OPENING_TAG_STANDOFF: number;
51
+ export declare function buildOpeningMarkAnnotation(opening: OpeningNode, wall: WallNode, levelData: OpeningFloorplanLevelData | undefined, { preferredSide, stroke, drafting, }?: {
42
52
  preferredSide?: -1 | 1;
43
53
  stroke?: string;
54
+ /** Sheet drafting: tag outside the exterior face, door hexagon / window ellipse, paper sizes. */
55
+ drafting?: boolean;
44
56
  }): FloorplanGeometry | null;
45
57
  export declare function resolveOpeningDimensionDocumentation(opening: OpeningNode): OpeningDimensionDocumentation;
46
58
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAE,KAAK,iBAAiB,EAAiC,MAAM,oBAAoB,CAAA;AAC1F,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAA;AAE9B,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAA;AAGxC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gBAAgB,EAAE,uBAAuB,CAAA;IACzC,SAAS,EAAE,yBAAyB,CAAA;IACpC,cAAc,EAAE,YAAY,GAAG,cAAc,CAAA;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACtC,CAAA;AAMD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;CACpC,GAAG,iBAAiB,GAAG,IAAI,CA6B3B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;CACpC,GAAG,iBAAiB,GAAG,IAAI,CAqC3B;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,yBAAyB,GAAG,SAAS,EAChD,EACE,aAAkB,EAClB,MAAkB,GACnB,GAAE;IACD,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;CACX,GACL,iBAAiB,GAAG,IAAI,CAiE1B;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,WAAW,GACnB,6BAA6B,CAoB/B"}
1
+ {"version":3,"file":"opening-documentation.d.ts","sourceRoot":"","sources":["../../src/shared/opening-documentation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,QAAQ,EACR,iBAAiB,EAEjB,QAAQ,EACR,UAAU,EACX,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EACL,KAAK,iBAAiB,EAGvB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,KAAK,yBAAyB,EAC9B,KAAK,sBAAsB,EAE5B,MAAM,uBAAuB,CAAA;AAE9B,KAAK,WAAW,GAAG,QAAQ,GAAG,UAAU,CAAA;AAGxC,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,SAAS,CAAA;AAC1D,MAAM,MAAM,yBAAyB,GACjC,SAAS,GACT,eAAe,GACf,iBAAiB,GACjB,gBAAgB,CAAA;AAEpB,MAAM,MAAM,6BAA6B,GAAG;IAC1C,gBAAgB,EAAE,uBAAuB,CAAA;IACzC,SAAS,EAAE,yBAAyB,CAAA;IACpC,cAAc,EAAE,YAAY,GAAG,cAAc,CAAA;IAC7C,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACpB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,OAAO,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,yBAAyB,GAAG;IACtC,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,+FAA+F;IAC/F,gBAAgB,EAAE,MAAM,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CACpD,CAAA;AAsBD,wBAAgB,6BAA6B,CAAC,IAAI,EAAE;IAClD,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE;IACpD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC/B,GAAG,yBAAyB,CAE5B;AAED,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,QAAQ,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAA;IACjC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,iBAAiB,GAAG,IAAI,CAmC3B;AAED,wBAAgB,4BAA4B,CAAC,IAAI,EAAE;IACjD,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACnC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IACxC,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,sBAAsB,CAAA;IAC5B,OAAO,CAAC,EAAE,yBAAyB,CAAA;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAA;CACnB,GAAG,iBAAiB,GAAG,IAAI,CA8C3B;AAwBD,eAAO,MAAM,kBAAkB,QAAmB,CAAA;AAClD,eAAO,MAAM,wBAAwB,QAAqB,CAAA;AAC1D,eAAO,MAAM,qBAAqB,QAAqB,CAAA;AACvD,eAAO,MAAM,wBAAwB,QAAqB,CAAA;AAC1D,qEAAqE;AACrE,eAAO,MAAM,oBAAoB,QAAoB,CAAA;AAErD,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,QAAQ,EACd,SAAS,EAAE,yBAAyB,GAAG,SAAS,EAChD,EACE,aAAkB,EAClB,MAAkB,EAClB,QAAgB,GACjB,GAAE;IACD,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,iGAAiG;IACjG,QAAQ,CAAC,EAAE,OAAO,CAAA;CACd,GACL,iBAAiB,GAAG,IAAI,CA2I1B;AAED,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,WAAW,GACnB,6BAA6B,CAoB/B"}