@pascal-app/core 0.8.0 → 0.9.2

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 (471) hide show
  1. package/dist/events/bus.d.ts +67 -13
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
  4. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
  5. package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
  6. package/dist/hooks/scene-registry/scene-registry.d.ts +14 -23
  7. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  8. package/dist/hooks/scene-registry/scene-registry.js +59 -26
  9. package/dist/hooks/scene-registry/scene-registry.test.d.ts +2 -0
  10. package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +1 -0
  11. package/dist/hooks/scene-registry/scene-registry.test.js +26 -0
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +14 -0
  13. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -0
  14. package/dist/hooks/spatial-grid/floor-placed-elevation.js +51 -0
  15. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +2 -0
  16. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +1 -0
  17. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +366 -0
  18. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +79 -11
  19. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  20. package/dist/hooks/spatial-grid/spatial-grid-manager.js +508 -141
  21. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +28 -1
  22. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  23. package/dist/hooks/spatial-grid/spatial-grid-sync.js +109 -18
  24. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +2 -0
  25. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +1 -0
  26. package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +363 -0
  27. package/dist/index.d.ts +36 -8
  28. package/dist/index.d.ts.map +1 -1
  29. package/dist/index.js +33 -6
  30. package/dist/lib/level-name.d.ts +4 -0
  31. package/dist/lib/level-name.d.ts.map +1 -0
  32. package/dist/lib/level-name.js +10 -0
  33. package/dist/lib/measurement-geometry.d.ts +19 -0
  34. package/dist/lib/measurement-geometry.d.ts.map +1 -0
  35. package/dist/lib/measurement-geometry.js +232 -0
  36. package/dist/lib/measurement-geometry.test.d.ts +2 -0
  37. package/dist/lib/measurement-geometry.test.d.ts.map +1 -0
  38. package/dist/lib/measurement-geometry.test.js +102 -0
  39. package/dist/lib/polygon-geometry.d.ts +0 -1
  40. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  41. package/dist/lib/polygon-geometry.js +0 -18
  42. package/dist/lib/polygon-relations.d.ts +10 -0
  43. package/dist/lib/polygon-relations.d.ts.map +1 -0
  44. package/dist/lib/polygon-relations.js +73 -0
  45. package/dist/lib/selection-proxy.d.ts +4 -0
  46. package/dist/lib/selection-proxy.d.ts.map +1 -0
  47. package/dist/lib/selection-proxy.js +12 -0
  48. package/dist/lib/slab-polygon.d.ts +31 -2
  49. package/dist/lib/slab-polygon.d.ts.map +1 -1
  50. package/dist/lib/slab-polygon.js +525 -31
  51. package/dist/lib/slab-polygon.test.d.ts +2 -0
  52. package/dist/lib/slab-polygon.test.d.ts.map +1 -0
  53. package/dist/lib/slab-polygon.test.js +635 -0
  54. package/dist/lib/slots.d.ts +14 -0
  55. package/dist/lib/slots.d.ts.map +1 -0
  56. package/dist/lib/slots.js +26 -0
  57. package/dist/lib/space-detection-pause.test.d.ts +2 -0
  58. package/dist/lib/space-detection-pause.test.d.ts.map +1 -0
  59. package/dist/lib/space-detection-pause.test.js +42 -0
  60. package/dist/lib/space-detection.d.ts +54 -2
  61. package/dist/lib/space-detection.d.ts.map +1 -1
  62. package/dist/lib/space-detection.js +599 -124
  63. package/dist/lib/space-detection.test.d.ts +2 -0
  64. package/dist/lib/space-detection.test.d.ts.map +1 -0
  65. package/dist/lib/space-detection.test.js +376 -0
  66. package/dist/lib/wall-distance.d.ts +60 -0
  67. package/dist/lib/wall-distance.d.ts.map +1 -0
  68. package/dist/lib/wall-distance.js +85 -0
  69. package/dist/lib/zone-quantities.d.ts +21 -0
  70. package/dist/lib/zone-quantities.d.ts.map +1 -0
  71. package/dist/lib/zone-quantities.js +183 -0
  72. package/dist/lib/zone-quantities.test.d.ts +2 -0
  73. package/dist/lib/zone-quantities.test.d.ts.map +1 -0
  74. package/dist/lib/zone-quantities.test.js +82 -0
  75. package/dist/material-library.d.ts +20 -1
  76. package/dist/material-library.d.ts.map +1 -1
  77. package/dist/material-library.js +3737 -200
  78. package/dist/registry/__bench__/relations-resolver.bench.d.ts +15 -0
  79. package/dist/registry/__bench__/relations-resolver.bench.d.ts.map +1 -0
  80. package/dist/registry/__bench__/relations-resolver.bench.js +170 -0
  81. package/dist/registry/handles.d.ts +394 -0
  82. package/dist/registry/handles.d.ts.map +1 -0
  83. package/dist/registry/handles.js +24 -0
  84. package/dist/registry/index.d.ts +7 -0
  85. package/dist/registry/index.d.ts.map +1 -0
  86. package/dist/registry/index.js +4 -0
  87. package/dist/registry/registry.d.ts +136 -0
  88. package/dist/registry/registry.d.ts.map +1 -0
  89. package/dist/registry/registry.js +282 -0
  90. package/dist/registry/registry.test.d.ts +2 -0
  91. package/dist/registry/registry.test.d.ts.map +1 -0
  92. package/dist/registry/registry.test.js +196 -0
  93. package/dist/registry/relations-resolver.d.ts +42 -0
  94. package/dist/registry/relations-resolver.d.ts.map +1 -0
  95. package/dist/registry/relations-resolver.js +77 -0
  96. package/dist/registry/relations-resolver.test.d.ts +2 -0
  97. package/dist/registry/relations-resolver.test.d.ts.map +1 -0
  98. package/dist/registry/relations-resolver.test.js +183 -0
  99. package/dist/registry/scene-api.d.ts +44 -0
  100. package/dist/registry/scene-api.d.ts.map +1 -0
  101. package/dist/registry/scene-api.js +111 -0
  102. package/dist/registry/scene-api.test.d.ts +2 -0
  103. package/dist/registry/scene-api.test.d.ts.map +1 -0
  104. package/dist/registry/scene-api.test.js +183 -0
  105. package/dist/registry/subtree.d.ts +67 -0
  106. package/dist/registry/subtree.d.ts.map +1 -0
  107. package/dist/registry/subtree.js +123 -0
  108. package/dist/registry/subtree.test.d.ts +2 -0
  109. package/dist/registry/subtree.test.d.ts.map +1 -0
  110. package/dist/registry/subtree.test.js +163 -0
  111. package/dist/registry/types.d.ts +2099 -0
  112. package/dist/registry/types.d.ts.map +1 -0
  113. package/dist/registry/types.js +1 -0
  114. package/dist/schema/index.d.ts +35 -4
  115. package/dist/schema/index.d.ts.map +1 -1
  116. package/dist/schema/index.js +32 -4
  117. package/dist/schema/material.d.ts +13 -2
  118. package/dist/schema/material.d.ts.map +1 -1
  119. package/dist/schema/material.js +17 -5
  120. package/dist/schema/material.test.d.ts +2 -0
  121. package/dist/schema/material.test.d.ts.map +1 -0
  122. package/dist/schema/material.test.js +43 -0
  123. package/dist/schema/nodes/box-vent.d.ts +74 -0
  124. package/dist/schema/nodes/box-vent.d.ts.map +1 -0
  125. package/dist/schema/nodes/box-vent.js +63 -0
  126. package/dist/schema/nodes/building.d.ts +1 -1
  127. package/dist/schema/nodes/building.d.ts.map +1 -1
  128. package/dist/schema/nodes/building.js +3 -2
  129. package/dist/schema/nodes/cabinet.d.ts +534 -0
  130. package/dist/schema/nodes/cabinet.d.ts.map +1 -0
  131. package/dist/schema/nodes/cabinet.js +137 -0
  132. package/dist/schema/nodes/ceiling.d.ts +5 -2
  133. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  134. package/dist/schema/nodes/ceiling.js +5 -1
  135. package/dist/schema/nodes/chimney.d.ts +158 -0
  136. package/dist/schema/nodes/chimney.d.ts.map +1 -0
  137. package/dist/schema/nodes/chimney.js +67 -0
  138. package/dist/schema/nodes/column.d.ts +600 -7
  139. package/dist/schema/nodes/column.d.ts.map +1 -1
  140. package/dist/schema/nodes/column.js +589 -6
  141. package/dist/schema/nodes/cupola.d.ts +66 -0
  142. package/dist/schema/nodes/cupola.d.ts.map +1 -0
  143. package/dist/schema/nodes/cupola.js +28 -0
  144. package/dist/schema/nodes/door.d.ts +13 -5
  145. package/dist/schema/nodes/door.d.ts.map +1 -1
  146. package/dist/schema/nodes/door.js +12 -0
  147. package/dist/schema/nodes/dormer.d.ts +228 -0
  148. package/dist/schema/nodes/dormer.d.ts.map +1 -0
  149. package/dist/schema/nodes/dormer.js +119 -0
  150. package/dist/schema/nodes/downspout.d.ts +75 -0
  151. package/dist/schema/nodes/downspout.d.ts.map +1 -0
  152. package/dist/schema/nodes/downspout.js +63 -0
  153. package/dist/schema/nodes/duct-fitting.d.ts +91 -0
  154. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
  155. package/dist/schema/nodes/duct-fitting.js +92 -0
  156. package/dist/schema/nodes/duct-segment.d.ts +61 -0
  157. package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
  158. package/dist/schema/nodes/duct-segment.js +73 -0
  159. package/dist/schema/nodes/duct-terminal.d.ts +57 -0
  160. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
  161. package/dist/schema/nodes/duct-terminal.js +51 -0
  162. package/dist/schema/nodes/elevator.d.ts +106 -0
  163. package/dist/schema/nodes/elevator.d.ts.map +1 -0
  164. package/dist/schema/nodes/elevator.js +57 -0
  165. package/dist/schema/nodes/eyebrow-vent.d.ts +68 -0
  166. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -0
  167. package/dist/schema/nodes/eyebrow-vent.js +40 -0
  168. package/dist/schema/nodes/fence.d.ts +19 -2
  169. package/dist/schema/nodes/fence.d.ts.map +1 -1
  170. package/dist/schema/nodes/fence.js +27 -2
  171. package/dist/schema/nodes/gutter.d.ts +84 -0
  172. package/dist/schema/nodes/gutter.d.ts.map +1 -0
  173. package/dist/schema/nodes/gutter.js +76 -0
  174. package/dist/schema/nodes/hvac-equipment.d.ts +63 -0
  175. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
  176. package/dist/schema/nodes/hvac-equipment.js +55 -0
  177. package/dist/schema/nodes/item.d.ts +12 -0
  178. package/dist/schema/nodes/item.d.ts.map +1 -1
  179. package/dist/schema/nodes/item.js +20 -0
  180. package/dist/schema/nodes/level.d.ts +1 -1
  181. package/dist/schema/nodes/level.d.ts.map +1 -1
  182. package/dist/schema/nodes/level.js +4 -0
  183. package/dist/schema/nodes/lineset.d.ts +42 -0
  184. package/dist/schema/nodes/lineset.d.ts.map +1 -0
  185. package/dist/schema/nodes/lineset.js +38 -0
  186. package/dist/schema/nodes/liquid-line.d.ts +34 -0
  187. package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
  188. package/dist/schema/nodes/liquid-line.js +24 -0
  189. package/dist/schema/nodes/measurement.d.ts +306 -0
  190. package/dist/schema/nodes/measurement.d.ts.map +1 -0
  191. package/dist/schema/nodes/measurement.js +87 -0
  192. package/dist/schema/nodes/measurement.test.d.ts +2 -0
  193. package/dist/schema/nodes/measurement.test.d.ts.map +1 -0
  194. package/dist/schema/nodes/measurement.test.js +139 -0
  195. package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
  196. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
  197. package/dist/schema/nodes/pipe-fitting.js +45 -0
  198. package/dist/schema/nodes/pipe-segment.d.ts +48 -0
  199. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
  200. package/dist/schema/nodes/pipe-segment.js +36 -0
  201. package/dist/schema/nodes/pipe-trap.d.ts +43 -0
  202. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
  203. package/dist/schema/nodes/pipe-trap.js +36 -0
  204. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +2 -0
  205. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +1 -0
  206. package/dist/schema/nodes/ridge-vent-defaults.test.js +205 -0
  207. package/dist/schema/nodes/ridge-vent.d.ts +82 -0
  208. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -0
  209. package/dist/schema/nodes/ridge-vent.js +248 -0
  210. package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
  211. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
  212. package/dist/schema/nodes/roof-segment-shape.js +318 -0
  213. package/dist/schema/nodes/roof-segment-shape.test.d.ts +2 -0
  214. package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +1 -0
  215. package/dist/schema/nodes/roof-segment-shape.test.js +175 -0
  216. package/dist/schema/nodes/roof-segment-surface.test.d.ts +2 -0
  217. package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +1 -0
  218. package/dist/schema/nodes/roof-segment-surface.test.js +48 -0
  219. package/dist/schema/nodes/roof-segment-trim.test.d.ts +2 -0
  220. package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +1 -0
  221. package/dist/schema/nodes/roof-segment-trim.test.js +107 -0
  222. package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
  223. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
  224. package/dist/schema/nodes/roof-segment-walls.js +330 -0
  225. package/dist/schema/nodes/roof-segment-walls.test.d.ts +2 -0
  226. package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +1 -0
  227. package/dist/schema/nodes/roof-segment-walls.test.js +92 -0
  228. package/dist/schema/nodes/roof-segment.d.ts +273 -3
  229. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  230. package/dist/schema/nodes/roof-segment.js +539 -3
  231. package/dist/schema/nodes/roof.d.ts +8 -8
  232. package/dist/schema/nodes/roof.d.ts.map +1 -1
  233. package/dist/schema/nodes/roof.js +4 -16
  234. package/dist/schema/nodes/shelf.d.ts +106 -0
  235. package/dist/schema/nodes/shelf.d.ts.map +1 -0
  236. package/dist/schema/nodes/shelf.js +90 -0
  237. package/dist/schema/nodes/site.d.ts +1 -122
  238. package/dist/schema/nodes/site.d.ts.map +1 -1
  239. package/dist/schema/nodes/site.js +2 -6
  240. package/dist/schema/nodes/skylight.d.ts +279 -0
  241. package/dist/schema/nodes/skylight.d.ts.map +1 -0
  242. package/dist/schema/nodes/skylight.js +152 -0
  243. package/dist/schema/nodes/slab.d.ts +5 -2
  244. package/dist/schema/nodes/slab.d.ts.map +1 -1
  245. package/dist/schema/nodes/slab.js +5 -1
  246. package/dist/schema/nodes/solar-panel.d.ts +117 -0
  247. package/dist/schema/nodes/solar-panel.d.ts.map +1 -0
  248. package/dist/schema/nodes/solar-panel.js +47 -0
  249. package/dist/schema/nodes/stair-segment.d.ts +4 -4
  250. package/dist/schema/nodes/stair.d.ts +13 -12
  251. package/dist/schema/nodes/stair.d.ts.map +1 -1
  252. package/dist/schema/nodes/stair.js +3 -0
  253. package/dist/schema/nodes/surface-hole-metadata.d.ts +2 -0
  254. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  255. package/dist/schema/nodes/surface-hole-metadata.js +3 -1
  256. package/dist/schema/nodes/turbine-vent.d.ts +68 -0
  257. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -0
  258. package/dist/schema/nodes/turbine-vent.js +41 -0
  259. package/dist/schema/nodes/wall.d.ts +245 -6
  260. package/dist/schema/nodes/wall.d.ts.map +1 -1
  261. package/dist/schema/nodes/wall.js +257 -0
  262. package/dist/schema/nodes/wall.test.d.ts +2 -0
  263. package/dist/schema/nodes/wall.test.d.ts.map +1 -0
  264. package/dist/schema/nodes/wall.test.js +208 -0
  265. package/dist/schema/nodes/window.d.ts +11 -3
  266. package/dist/schema/nodes/window.d.ts.map +1 -1
  267. package/dist/schema/nodes/window.js +12 -0
  268. package/dist/schema/nodes/zone.d.ts +2 -0
  269. package/dist/schema/nodes/zone.d.ts.map +1 -1
  270. package/dist/schema/nodes/zone.js +6 -0
  271. package/dist/schema/scene-material.d.ts +41 -0
  272. package/dist/schema/scene-material.d.ts.map +1 -0
  273. package/dist/schema/scene-material.js +9 -0
  274. package/dist/schema/types.d.ts +2850 -655
  275. package/dist/schema/types.d.ts.map +1 -1
  276. package/dist/schema/types.js +49 -0
  277. package/dist/services/alignment-anchors.d.ts +100 -0
  278. package/dist/services/alignment-anchors.d.ts.map +1 -0
  279. package/dist/services/alignment-anchors.js +312 -0
  280. package/dist/services/alignment-anchors.test.d.ts +2 -0
  281. package/dist/services/alignment-anchors.test.d.ts.map +1 -0
  282. package/dist/services/alignment-anchors.test.js +383 -0
  283. package/dist/services/alignment.d.ts +131 -0
  284. package/dist/services/alignment.d.ts.map +1 -0
  285. package/dist/services/alignment.js +171 -0
  286. package/dist/services/alignment.test.d.ts +2 -0
  287. package/dist/services/alignment.test.d.ts.map +1 -0
  288. package/dist/services/alignment.test.js +92 -0
  289. package/dist/services/drag-session.d.ts +47 -0
  290. package/dist/services/drag-session.d.ts.map +1 -0
  291. package/dist/services/drag-session.js +100 -0
  292. package/dist/services/drag-session.test.d.ts +2 -0
  293. package/dist/services/drag-session.test.d.ts.map +1 -0
  294. package/dist/services/drag-session.test.js +219 -0
  295. package/dist/services/hosting.d.ts +88 -0
  296. package/dist/services/hosting.d.ts.map +1 -0
  297. package/dist/services/hosting.js +131 -0
  298. package/dist/services/hosting.test.d.ts +2 -0
  299. package/dist/services/hosting.test.d.ts.map +1 -0
  300. package/dist/services/hosting.test.js +230 -0
  301. package/dist/services/index.d.ts +13 -0
  302. package/dist/services/index.d.ts.map +1 -0
  303. package/dist/services/index.js +12 -0
  304. package/dist/services/level-height.d.ts +28 -0
  305. package/dist/services/level-height.d.ts.map +1 -0
  306. package/dist/services/level-height.js +62 -0
  307. package/dist/services/movement.d.ts +48 -0
  308. package/dist/services/movement.d.ts.map +1 -0
  309. package/dist/services/movement.js +65 -0
  310. package/dist/services/movement.test.d.ts +2 -0
  311. package/dist/services/movement.test.d.ts.map +1 -0
  312. package/dist/services/movement.test.js +133 -0
  313. package/dist/services/opening-guides.d.ts +141 -0
  314. package/dist/services/opening-guides.d.ts.map +1 -0
  315. package/dist/services/opening-guides.js +267 -0
  316. package/dist/services/opening-guides.test.d.ts +2 -0
  317. package/dist/services/opening-guides.test.d.ts.map +1 -0
  318. package/dist/services/opening-guides.test.js +208 -0
  319. package/dist/services/port-connectivity.d.ts +115 -0
  320. package/dist/services/port-connectivity.d.ts.map +1 -0
  321. package/dist/services/port-connectivity.js +300 -0
  322. package/dist/services/port-connectivity.test.d.ts +2 -0
  323. package/dist/services/port-connectivity.test.d.ts.map +1 -0
  324. package/dist/services/port-connectivity.test.js +297 -0
  325. package/dist/services/riser-diagram.d.ts +40 -0
  326. package/dist/services/riser-diagram.d.ts.map +1 -0
  327. package/dist/services/riser-diagram.js +110 -0
  328. package/dist/services/riser-diagram.test.d.ts +2 -0
  329. package/dist/services/riser-diagram.test.d.ts.map +1 -0
  330. package/dist/services/riser-diagram.test.js +66 -0
  331. package/dist/services/single-undo-dance.test.d.ts +2 -0
  332. package/dist/services/single-undo-dance.test.d.ts.map +1 -0
  333. package/dist/services/single-undo-dance.test.js +210 -0
  334. package/dist/services/snap.d.ts +80 -0
  335. package/dist/services/snap.d.ts.map +1 -0
  336. package/dist/services/snap.js +140 -0
  337. package/dist/services/snap.test.d.ts +2 -0
  338. package/dist/services/snap.test.d.ts.map +1 -0
  339. package/dist/services/snap.test.js +137 -0
  340. package/dist/services/system-graph.d.ts +30 -0
  341. package/dist/services/system-graph.d.ts.map +1 -0
  342. package/dist/services/system-graph.js +164 -0
  343. package/dist/services/system-graph.test.d.ts +2 -0
  344. package/dist/services/system-graph.test.d.ts.map +1 -0
  345. package/dist/services/system-graph.test.js +138 -0
  346. package/dist/services/validate-dwv.d.ts +32 -0
  347. package/dist/services/validate-dwv.d.ts.map +1 -0
  348. package/dist/services/validate-dwv.js +118 -0
  349. package/dist/services/validate-dwv.test.d.ts +2 -0
  350. package/dist/services/validate-dwv.test.d.ts.map +1 -0
  351. package/dist/services/validate-dwv.test.js +109 -0
  352. package/dist/solar-panel-presets.d.ts +17 -0
  353. package/dist/solar-panel-presets.d.ts.map +1 -0
  354. package/dist/solar-panel-presets.js +43 -0
  355. package/dist/store/actions/node-actions.d.ts +14 -2
  356. package/dist/store/actions/node-actions.d.ts.map +1 -1
  357. package/dist/store/actions/node-actions.js +585 -15
  358. package/dist/store/actions/node-mutation-sanitize.test.d.ts +2 -0
  359. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +1 -0
  360. package/dist/store/actions/node-mutation-sanitize.test.js +147 -0
  361. package/dist/store/actions/reparent.test.d.ts +2 -0
  362. package/dist/store/actions/reparent.test.d.ts.map +1 -0
  363. package/dist/store/actions/reparent.test.js +212 -0
  364. package/dist/store/actions/ridge-vent-update.test.d.ts +2 -0
  365. package/dist/store/actions/ridge-vent-update.test.d.ts.map +1 -0
  366. package/dist/store/actions/ridge-vent-update.test.js +264 -0
  367. package/dist/store/history-control.d.ts +11 -0
  368. package/dist/store/history-control.d.ts.map +1 -1
  369. package/dist/store/history-control.js +33 -0
  370. package/dist/store/use-interactive.d.ts +39 -0
  371. package/dist/store/use-interactive.d.ts.map +1 -1
  372. package/dist/store/use-interactive.js +75 -0
  373. package/dist/store/use-live-node-overrides.d.ts +22 -0
  374. package/dist/store/use-live-node-overrides.d.ts.map +1 -0
  375. package/dist/store/use-live-node-overrides.js +59 -0
  376. package/dist/store/use-scene-dirty-tracking.test.d.ts +2 -0
  377. package/dist/store/use-scene-dirty-tracking.test.d.ts.map +1 -0
  378. package/dist/store/use-scene-dirty-tracking.test.js +68 -0
  379. package/dist/store/use-scene-elevator-migration.test.d.ts +2 -0
  380. package/dist/store/use-scene-elevator-migration.test.d.ts.map +1 -0
  381. package/dist/store/use-scene-elevator-migration.test.js +109 -0
  382. package/dist/store/use-scene-measurement-roundtrip.test.d.ts +2 -0
  383. package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +1 -0
  384. package/dist/store/use-scene-measurement-roundtrip.test.js +97 -0
  385. package/dist/store/use-scene-plugins.test.d.ts +2 -0
  386. package/dist/store/use-scene-plugins.test.d.ts.map +1 -0
  387. package/dist/store/use-scene-plugins.test.js +51 -0
  388. package/dist/store/use-scene-wall-slot-migration.test.d.ts +2 -0
  389. package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +1 -0
  390. package/dist/store/use-scene-wall-slot-migration.test.js +210 -0
  391. package/dist/store/use-scene-window-migration.test.d.ts +2 -0
  392. package/dist/store/use-scene-window-migration.test.d.ts.map +1 -0
  393. package/dist/store/use-scene-window-migration.test.js +85 -0
  394. package/dist/store/use-scene.d.ts +28 -2
  395. package/dist/store/use-scene.d.ts.map +1 -1
  396. package/dist/store/use-scene.js +546 -49
  397. package/dist/systems/elevator/elevator-dispatch.d.ts +12 -0
  398. package/dist/systems/elevator/elevator-dispatch.d.ts.map +1 -0
  399. package/dist/systems/elevator/elevator-dispatch.js +57 -0
  400. package/dist/systems/elevator/elevator-geometry.d.ts +15 -0
  401. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -0
  402. package/dist/systems/elevator/elevator-geometry.js +50 -0
  403. package/dist/systems/elevator/elevator-opening-sync.d.ts +6 -0
  404. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -0
  405. package/dist/systems/elevator/elevator-opening-sync.js +218 -0
  406. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +2 -0
  407. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +1 -0
  408. package/dist/systems/elevator/elevator-opening-sync.test.js +146 -0
  409. package/dist/systems/elevator/elevator-opening-system.d.ts +2 -0
  410. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -0
  411. package/dist/systems/elevator/elevator-opening-system.js +48 -0
  412. package/dist/systems/elevator/elevator-runtime-system.d.ts +2 -0
  413. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +1 -0
  414. package/dist/systems/elevator/elevator-runtime-system.js +8 -0
  415. package/dist/systems/elevator/elevator-runtime.d.ts +18 -0
  416. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -0
  417. package/dist/systems/elevator/elevator-runtime.js +225 -0
  418. package/dist/systems/elevator/elevator-runtime.test.d.ts +2 -0
  419. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +1 -0
  420. package/dist/systems/elevator/elevator-runtime.test.js +64 -0
  421. package/dist/systems/elevator/elevator-service.d.ts +19 -0
  422. package/dist/systems/elevator/elevator-service.d.ts.map +1 -0
  423. package/dist/systems/elevator/elevator-service.js +111 -0
  424. package/dist/systems/fence/fence-centerline.d.ts +12 -0
  425. package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
  426. package/dist/systems/fence/fence-centerline.js +37 -0
  427. package/dist/systems/fence/fence-spline.d.ts +39 -0
  428. package/dist/systems/fence/fence-spline.d.ts.map +1 -0
  429. package/dist/systems/fence/fence-spline.js +196 -0
  430. package/dist/systems/fence/fence-spline.test.d.ts +2 -0
  431. package/dist/systems/fence/fence-spline.test.d.ts.map +1 -0
  432. package/dist/systems/fence/fence-spline.test.js +136 -0
  433. package/dist/systems/stair/stair-footprint.d.ts +44 -0
  434. package/dist/systems/stair/stair-footprint.d.ts.map +1 -0
  435. package/dist/systems/stair/stair-footprint.js +178 -0
  436. package/dist/systems/stair/stair-opening-preview.d.ts +2447 -0
  437. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -0
  438. package/dist/systems/stair/stair-opening-preview.js +93 -0
  439. package/dist/systems/stair/stair-opening-preview.test.d.ts +2 -0
  440. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +1 -0
  441. package/dist/systems/stair/stair-opening-preview.test.js +80 -0
  442. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  443. package/dist/systems/stair/stair-opening-sync.js +155 -147
  444. package/dist/systems/stair/stair-opening-sync.test.js +424 -2
  445. package/dist/systems/stair/stair-opening-system.d.ts +2 -0
  446. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -0
  447. package/dist/systems/stair/stair-opening-system.js +104 -0
  448. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  449. package/dist/systems/wall/wall-mitering.js +38 -2
  450. package/dist/systems/wall/wall-mitering.test.d.ts +2 -0
  451. package/dist/systems/wall/wall-mitering.test.d.ts.map +1 -0
  452. package/dist/systems/wall/wall-mitering.test.js +63 -0
  453. package/dist/systems/wall/wall-move.d.ts +48 -0
  454. package/dist/systems/wall/wall-move.d.ts.map +1 -0
  455. package/dist/systems/wall/wall-move.js +193 -0
  456. package/dist/utils/clone-scene-graph.d.ts +7 -4
  457. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  458. package/dist/utils/clone-scene-graph.js +29 -7
  459. package/dist/utils/clone-scene-graph.test.d.ts +2 -0
  460. package/dist/utils/clone-scene-graph.test.d.ts.map +1 -0
  461. package/dist/utils/clone-scene-graph.test.js +62 -0
  462. package/dist/utils/heal-scene-graph.d.ts +18 -0
  463. package/dist/utils/heal-scene-graph.d.ts.map +1 -0
  464. package/dist/utils/heal-scene-graph.js +90 -0
  465. package/dist/utils/heal-scene-graph.test.d.ts +2 -0
  466. package/dist/utils/heal-scene-graph.test.d.ts.map +1 -0
  467. package/dist/utils/heal-scene-graph.test.js +88 -0
  468. package/dist/validation/validate-build-json.d.ts +44 -0
  469. package/dist/validation/validate-build-json.d.ts.map +1 -0
  470. package/dist/validation/validate-build-json.js +256 -0
  471. package/package.json +11 -4
@@ -0,0 +1,2447 @@
1
+ import type { AnyNode, AnyNodeId, CeilingNode, SlabNode } from '../../schema';
2
+ import { type LiveNodeOverrides } from '../../store/use-live-node-overrides';
3
+ import type { LiveTransform } from '../../store/use-live-transforms';
4
+ type SurfaceOpeningUpdate = {
5
+ id: AnyNodeId;
6
+ data: Partial<SlabNode | CeilingNode>;
7
+ };
8
+ export declare function hasLiveStairOpeningInputs(nodes: Record<string, AnyNode>, liveTransforms: ReadonlyMap<string, LiveTransform>, liveOverrides: ReadonlyMap<string, LiveNodeOverrides>, previewSurfaceIds: ReadonlySet<string>): boolean;
9
+ export declare function getNodesWithLiveStairOpeningInputs(nodes: Record<string, AnyNode>, liveTransforms: ReadonlyMap<string, LiveTransform>, liveOverrides: ReadonlyMap<string, LiveNodeOverrides>, previewSurfaceIds: ReadonlySet<string>): Record<string, {
10
+ object: "node";
11
+ parentId: string | null;
12
+ visible: boolean;
13
+ metadata: import("zod").JSONType;
14
+ id: `bvent_${string}`;
15
+ type: "box-vent";
16
+ materialPreset: string;
17
+ position: [number, number, number];
18
+ rotation: number;
19
+ width: number;
20
+ depth: number;
21
+ height: number;
22
+ hoodOverhang: number;
23
+ topTaper: number;
24
+ capHeight: number;
25
+ capGap: number;
26
+ domeCurvature: number;
27
+ baseInset: number;
28
+ baseHeight: number;
29
+ cornerBevel: number;
30
+ style: "box" | "cap" | "dome";
31
+ name?: string | undefined;
32
+ camera?: {
33
+ position: [number, number, number];
34
+ target: [number, number, number];
35
+ mode: "perspective" | "orthographic";
36
+ fov?: number | undefined;
37
+ zoom?: number | undefined;
38
+ } | undefined;
39
+ material?: {
40
+ id?: string | undefined;
41
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
42
+ properties?: {
43
+ color: string;
44
+ roughness: number;
45
+ metalness: number;
46
+ opacity: number;
47
+ transparent: boolean;
48
+ side: "front" | "back" | "double";
49
+ } | undefined;
50
+ texture?: {
51
+ url: string;
52
+ repeat?: [number, number] | undefined;
53
+ scale?: number | undefined;
54
+ } | undefined;
55
+ } | undefined;
56
+ roofSegmentId?: string | undefined;
57
+ } | {
58
+ object: "node";
59
+ parentId: string | null;
60
+ visible: boolean;
61
+ metadata: import("zod").JSONType;
62
+ id: `elevator_${string}`;
63
+ type: "elevator";
64
+ position: [number, number, number];
65
+ rotation: number;
66
+ width: number;
67
+ depth: number;
68
+ shaftWallThickness: number;
69
+ shaftStyle: "glass" | "solid";
70
+ cabHeight: number;
71
+ doorWidth: number;
72
+ doorHeight: number;
73
+ doorStyle: "center-opening" | "single-left" | "single-right";
74
+ doorPanelStyle: "glass-frame" | "solid-panel" | "segmented-panel";
75
+ fromLevelId: string | null;
76
+ toLevelId: string | null;
77
+ disabledLevelIds: string[];
78
+ serviceOnlyLevelIds: string[];
79
+ defaultLevelId: string | null;
80
+ speed: number;
81
+ doorDurationMs: number;
82
+ dwellMs: number;
83
+ name?: string | undefined;
84
+ camera?: {
85
+ position: [number, number, number];
86
+ target: [number, number, number];
87
+ mode: "perspective" | "orthographic";
88
+ fov?: number | undefined;
89
+ zoom?: number | undefined;
90
+ } | undefined;
91
+ material?: {
92
+ id?: string | undefined;
93
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
94
+ properties?: {
95
+ color: string;
96
+ roughness: number;
97
+ metalness: number;
98
+ opacity: number;
99
+ transparent: boolean;
100
+ side: "front" | "back" | "double";
101
+ } | undefined;
102
+ texture?: {
103
+ url: string;
104
+ repeat?: [number, number] | undefined;
105
+ scale?: number | undefined;
106
+ } | undefined;
107
+ } | undefined;
108
+ materialPreset?: string | undefined;
109
+ slots?: Record<string, string> | undefined;
110
+ shaftWidth?: number | undefined;
111
+ shaftDepth?: number | undefined;
112
+ servedLevelIds?: string[] | undefined;
113
+ } | {
114
+ object: "node";
115
+ parentId: string | null;
116
+ visible: boolean;
117
+ metadata: import("zod").JSONType;
118
+ id: `item_${string}`;
119
+ type: "item";
120
+ position: [number, number, number];
121
+ rotation: [number, number, number];
122
+ scale: [number, number, number];
123
+ children: `item_${string}`[];
124
+ asset: {
125
+ id: string;
126
+ category: string;
127
+ name: string;
128
+ thumbnail: string;
129
+ source: "library" | "community" | "mine";
130
+ src: string;
131
+ dimensions: [number, number, number];
132
+ offset: [number, number, number];
133
+ rotation: [number, number, number];
134
+ scale: [number, number, number];
135
+ floorPlanUrl?: string | undefined;
136
+ isDraft?: boolean | undefined;
137
+ attachTo?: "wall" | "ceiling" | "wall-side" | undefined;
138
+ recessed?: boolean | undefined;
139
+ tags?: string[] | undefined;
140
+ functionTags?: string[] | undefined;
141
+ surface?: {
142
+ height: number;
143
+ } | undefined;
144
+ interactive?: {
145
+ controls: ({
146
+ kind: "toggle";
147
+ label?: string | undefined;
148
+ default?: boolean | undefined;
149
+ } | {
150
+ kind: "slider";
151
+ label: string;
152
+ min: number;
153
+ max: number;
154
+ step: number;
155
+ displayMode: "slider" | "stepper" | "dial";
156
+ unit?: string | undefined;
157
+ default?: number | undefined;
158
+ } | {
159
+ kind: "temperature";
160
+ label: string;
161
+ min: number;
162
+ max: number;
163
+ unit: "C" | "F";
164
+ default?: number | undefined;
165
+ })[];
166
+ effects: ({
167
+ kind: "animation";
168
+ clips: {
169
+ on?: string | undefined;
170
+ off?: string | undefined;
171
+ loop?: string | undefined;
172
+ };
173
+ } | {
174
+ kind: "light";
175
+ color: string;
176
+ intensityRange: [number, number];
177
+ offset: [number, number, number];
178
+ distance?: number | undefined;
179
+ })[];
180
+ } | undefined;
181
+ };
182
+ name?: string | undefined;
183
+ camera?: {
184
+ position: [number, number, number];
185
+ target: [number, number, number];
186
+ mode: "perspective" | "orthographic";
187
+ fov?: number | undefined;
188
+ zoom?: number | undefined;
189
+ } | undefined;
190
+ side?: "front" | "back" | undefined;
191
+ wallId?: string | undefined;
192
+ wallT?: number | undefined;
193
+ roofSegmentId?: string | undefined;
194
+ roofFace?: "front" | "back" | "right" | "left" | undefined;
195
+ collectionIds?: `collection_${string}`[] | undefined;
196
+ slots?: Record<string, string> | undefined;
197
+ } | {
198
+ object: "node";
199
+ parentId: string | null;
200
+ visible: boolean;
201
+ metadata: import("zod").JSONType;
202
+ id: `ceiling_${string}`;
203
+ type: "ceiling";
204
+ children: `item_${string}`[];
205
+ polygon: [number, number][];
206
+ holes: [number, number][][];
207
+ holeMetadata: {
208
+ source: "stair" | "elevator" | "manual";
209
+ stairId?: string | undefined;
210
+ elevatorId?: string | undefined;
211
+ }[];
212
+ height: number;
213
+ autoFromWalls: boolean;
214
+ name?: string | undefined;
215
+ camera?: {
216
+ position: [number, number, number];
217
+ target: [number, number, number];
218
+ mode: "perspective" | "orthographic";
219
+ fov?: number | undefined;
220
+ zoom?: number | undefined;
221
+ } | undefined;
222
+ material?: {
223
+ id?: string | undefined;
224
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
225
+ properties?: {
226
+ color: string;
227
+ roughness: number;
228
+ metalness: number;
229
+ opacity: number;
230
+ transparent: boolean;
231
+ side: "front" | "back" | "double";
232
+ } | undefined;
233
+ texture?: {
234
+ url: string;
235
+ repeat?: [number, number] | undefined;
236
+ scale?: number | undefined;
237
+ } | undefined;
238
+ } | undefined;
239
+ materialPreset?: string | undefined;
240
+ slots?: Record<string, string> | undefined;
241
+ } | {
242
+ object: "node";
243
+ parentId: string | null;
244
+ visible: boolean;
245
+ metadata: import("zod").JSONType;
246
+ id: `column_${string}`;
247
+ type: "column";
248
+ position: [number, number, number];
249
+ rotation: number;
250
+ style: "plain" | "faceted" | "fluted" | "lathe-turned" | "dravidian-carved" | "cluster";
251
+ crossSection: "round" | "square" | "rectangular" | "octagonal" | "sixteen-sided";
252
+ height: number;
253
+ radius: number;
254
+ width: number;
255
+ depth: number;
256
+ edgeSoftness: number;
257
+ baseHeight: number;
258
+ capitalHeight: number;
259
+ shaftProfile: "straight" | "tapered" | "bulged" | "baluster" | "hourglass";
260
+ shaftTaper: number;
261
+ shaftBulge: number;
262
+ shaftStartScale: number;
263
+ shaftEndScale: number;
264
+ shaftSegmentCount: number;
265
+ shaftTwistStep: number;
266
+ shaftCornerRadius: number;
267
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "spiral" | "panelled";
268
+ baseStyle: "none" | "simple-square" | "round-rings" | "square-plinth" | "stepped-square" | "lotus" | "ribbed-lotus" | "panelled-pedestal";
269
+ baseWidthScale: number;
270
+ baseDepthScale: number;
271
+ baseTierCount: number;
272
+ baseStepSpread: number;
273
+ basePlinthHeightRatio: number;
274
+ baseRoundBandScale: number;
275
+ baseNeckScale: number;
276
+ baseRoundBandCount: number;
277
+ baseRibCount: number;
278
+ baseCarvingLevel: number;
279
+ basePanelInset: number;
280
+ capitalStyle: "none" | "simple" | "simple-slab" | "rounded" | "stepped" | "doric" | "volute" | "ionic-volute" | "leaf-carved" | "corinthian-leaf" | "south-indian-bracket" | "wood-bracket";
281
+ capitalWidthScale: number;
282
+ capitalDepthScale: number;
283
+ capitalTierCount: number;
284
+ capitalStepSpread: number;
285
+ capitalBandCount: number;
286
+ voluteSize: number;
287
+ voluteCount: number;
288
+ leafCount: number;
289
+ leafRows: number;
290
+ bracketDepth: number;
291
+ bracketTierCount: number;
292
+ pendantCount: number;
293
+ capitalCarvingLevel: number;
294
+ ringCount: number;
295
+ ringPlacement: "ends" | "even" | "top" | "bottom";
296
+ ringThickness: number;
297
+ ringSpread: number;
298
+ fluteCount: number;
299
+ fluteDepth: number;
300
+ fluteWidth: number;
301
+ spiralTwist: number;
302
+ spiralRibCount: number;
303
+ panelCount: number;
304
+ panelInsetDepth: number;
305
+ panelShape: "rectangle" | "arched" | "diamond";
306
+ latheRingCount: number;
307
+ latheRingSpacing: "ends" | "even" | "top" | "bottom";
308
+ carvingLevel: number;
309
+ carvingPlacement: "shaft" | "base" | "capital" | "all";
310
+ lowerBandEnabled: boolean;
311
+ lowerBandHeight: number;
312
+ lowerBandCarvingLevel: number;
313
+ dentilCount: number;
314
+ beadCount: number;
315
+ supportStyle: "vertical" | "a-frame" | "y-frame" | "v-frame" | "x-brace" | "k-brace" | "single-strut" | "tripod" | "trestle" | "portal-frame" | "box-frame";
316
+ braceWidth: number;
317
+ braceDepth: number;
318
+ braceBottomSpread: number;
319
+ braceTopSpread: number;
320
+ bracePlateEnabled: boolean;
321
+ name?: string | undefined;
322
+ camera?: {
323
+ position: [number, number, number];
324
+ target: [number, number, number];
325
+ mode: "perspective" | "orthographic";
326
+ fov?: number | undefined;
327
+ zoom?: number | undefined;
328
+ } | undefined;
329
+ material?: {
330
+ id?: string | undefined;
331
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
332
+ properties?: {
333
+ color: string;
334
+ roughness: number;
335
+ metalness: number;
336
+ opacity: number;
337
+ transparent: boolean;
338
+ side: "front" | "back" | "double";
339
+ } | undefined;
340
+ texture?: {
341
+ url: string;
342
+ repeat?: [number, number] | undefined;
343
+ scale?: number | undefined;
344
+ } | undefined;
345
+ } | undefined;
346
+ materialPreset?: string | undefined;
347
+ slots?: Record<string, string> | undefined;
348
+ } | {
349
+ object: "node";
350
+ parentId: string | null;
351
+ visible: boolean;
352
+ metadata: import("zod").JSONType;
353
+ id: `fence_${string}`;
354
+ type: "fence";
355
+ start: [number, number];
356
+ end: [number, number];
357
+ height: number;
358
+ thickness: number;
359
+ baseHeight: number;
360
+ postSpacing: number;
361
+ postSize: number;
362
+ topRailHeight: number;
363
+ groundClearance: number;
364
+ edgeInset: number;
365
+ slatGap: number;
366
+ postCap: "flat" | "none" | "pyramid";
367
+ baseStyle: "floating" | "grounded";
368
+ showInfill: boolean;
369
+ color: string;
370
+ style: "slat" | "rail" | "privacy" | "horizontal";
371
+ name?: string | undefined;
372
+ camera?: {
373
+ position: [number, number, number];
374
+ target: [number, number, number];
375
+ mode: "perspective" | "orthographic";
376
+ fov?: number | undefined;
377
+ zoom?: number | undefined;
378
+ } | undefined;
379
+ material?: {
380
+ id?: string | undefined;
381
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
382
+ properties?: {
383
+ color: string;
384
+ roughness: number;
385
+ metalness: number;
386
+ opacity: number;
387
+ transparent: boolean;
388
+ side: "front" | "back" | "double";
389
+ } | undefined;
390
+ texture?: {
391
+ url: string;
392
+ repeat?: [number, number] | undefined;
393
+ scale?: number | undefined;
394
+ } | undefined;
395
+ } | undefined;
396
+ materialPreset?: string | undefined;
397
+ slots?: Record<string, string> | undefined;
398
+ path?: [number, number][] | undefined;
399
+ tangents?: ([number, number] | null)[] | undefined;
400
+ curveOffset?: number | undefined;
401
+ } | {
402
+ object: "node";
403
+ parentId: string | null;
404
+ visible: boolean;
405
+ metadata: import("zod").JSONType;
406
+ id: `guide_${string}`;
407
+ type: "guide";
408
+ url: string;
409
+ position: [number, number, number];
410
+ rotation: [number, number, number];
411
+ scale: number;
412
+ opacity: number;
413
+ scaleReference: {
414
+ start: [number, number];
415
+ end: [number, number];
416
+ realLengthMeters: number;
417
+ measuredLengthUnits: number;
418
+ metersPerUnit: number;
419
+ label: string;
420
+ } | null;
421
+ name?: string | undefined;
422
+ camera?: {
423
+ position: [number, number, number];
424
+ target: [number, number, number];
425
+ mode: "perspective" | "orthographic";
426
+ fov?: number | undefined;
427
+ zoom?: number | undefined;
428
+ } | undefined;
429
+ } | {
430
+ object: "node";
431
+ parentId: string | null;
432
+ visible: boolean;
433
+ metadata: import("zod").JSONType;
434
+ id: `site_${string}`;
435
+ type: "site";
436
+ polygon: {
437
+ type: "polygon";
438
+ points: [number, number][];
439
+ };
440
+ children: string[];
441
+ name?: string | undefined;
442
+ camera?: {
443
+ position: [number, number, number];
444
+ target: [number, number, number];
445
+ mode: "perspective" | "orthographic";
446
+ fov?: number | undefined;
447
+ zoom?: number | undefined;
448
+ } | undefined;
449
+ } | {
450
+ object: "node";
451
+ parentId: string | null;
452
+ visible: boolean;
453
+ metadata: import("zod").JSONType;
454
+ id: `building_${string}`;
455
+ type: "building";
456
+ children: (`elevator_${string}` | `level_${string}`)[];
457
+ position: [number, number, number];
458
+ rotation: [number, number, number];
459
+ name?: string | undefined;
460
+ camera?: {
461
+ position: [number, number, number];
462
+ target: [number, number, number];
463
+ mode: "perspective" | "orthographic";
464
+ fov?: number | undefined;
465
+ zoom?: number | undefined;
466
+ } | undefined;
467
+ } | {
468
+ object: "node";
469
+ parentId: string | null;
470
+ visible: boolean;
471
+ metadata: import("zod").JSONType;
472
+ id: `level_${string}`;
473
+ type: "level";
474
+ children: (`item_${string}` | `ceiling_${string}` | `column_${string}` | `fence_${string}` | `guide_${string}` | `wall_${string}` | `zone_${string}` | `slab_${string}` | `roof_${string}` | `stair_${string}` | `scan_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}`)[];
475
+ level: number;
476
+ name?: string | undefined;
477
+ camera?: {
478
+ position: [number, number, number];
479
+ target: [number, number, number];
480
+ mode: "perspective" | "orthographic";
481
+ fov?: number | undefined;
482
+ zoom?: number | undefined;
483
+ } | undefined;
484
+ } | {
485
+ object: "node";
486
+ parentId: string | null;
487
+ visible: boolean;
488
+ metadata: import("zod").JSONType;
489
+ id: `wall_${string}`;
490
+ type: "wall";
491
+ children: (`item_${string}` | `door_${string}` | `window_${string}`)[];
492
+ start: [number, number];
493
+ end: [number, number];
494
+ frontSide: "unknown" | "interior" | "exterior";
495
+ backSide: "unknown" | "interior" | "exterior";
496
+ name?: string | undefined;
497
+ camera?: {
498
+ position: [number, number, number];
499
+ target: [number, number, number];
500
+ mode: "perspective" | "orthographic";
501
+ fov?: number | undefined;
502
+ zoom?: number | undefined;
503
+ } | undefined;
504
+ material?: {
505
+ id?: string | undefined;
506
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
507
+ properties?: {
508
+ color: string;
509
+ roughness: number;
510
+ metalness: number;
511
+ opacity: number;
512
+ transparent: boolean;
513
+ side: "front" | "back" | "double";
514
+ } | undefined;
515
+ texture?: {
516
+ url: string;
517
+ repeat?: [number, number] | undefined;
518
+ scale?: number | undefined;
519
+ } | undefined;
520
+ } | undefined;
521
+ materialPreset?: string | undefined;
522
+ interiorMaterial?: {
523
+ id?: string | undefined;
524
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
525
+ properties?: {
526
+ color: string;
527
+ roughness: number;
528
+ metalness: number;
529
+ opacity: number;
530
+ transparent: boolean;
531
+ side: "front" | "back" | "double";
532
+ } | undefined;
533
+ texture?: {
534
+ url: string;
535
+ repeat?: [number, number] | undefined;
536
+ scale?: number | undefined;
537
+ } | undefined;
538
+ } | undefined;
539
+ interiorMaterialPreset?: string | undefined;
540
+ exteriorMaterial?: {
541
+ id?: string | undefined;
542
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
543
+ properties?: {
544
+ color: string;
545
+ roughness: number;
546
+ metalness: number;
547
+ opacity: number;
548
+ transparent: boolean;
549
+ side: "front" | "back" | "double";
550
+ } | undefined;
551
+ texture?: {
552
+ url: string;
553
+ repeat?: [number, number] | undefined;
554
+ scale?: number | undefined;
555
+ } | undefined;
556
+ } | undefined;
557
+ exteriorMaterialPreset?: string | undefined;
558
+ slots?: Record<string, string> | undefined;
559
+ thickness?: number | undefined;
560
+ height?: number | undefined;
561
+ curveOffset?: number | undefined;
562
+ faceBands?: {
563
+ enabled: boolean;
564
+ count: number;
565
+ lowerHeight: number;
566
+ middleHeight: number;
567
+ upperHeight: number;
568
+ } | undefined;
569
+ skirting?: {
570
+ enabled: boolean;
571
+ sides: "interior" | "exterior" | "both";
572
+ height: number;
573
+ proud: number;
574
+ profile: "flat" | "bevel" | "triangle" | "cove" | "bullnose" | "base-modern" | "base-colonial" | "base-shoe" | "base-ogee" | "crown-cove" | "crown-ogee" | "crown-craftsman" | "crown-layered" | "rail-rounded" | "rail-ogee" | "rail-picture" | "rail-stepped";
575
+ offsetY?: number | undefined;
576
+ } | undefined;
577
+ crown?: {
578
+ enabled: boolean;
579
+ sides: "interior" | "exterior" | "both";
580
+ height: number;
581
+ proud: number;
582
+ profile: "flat" | "bevel" | "triangle" | "cove" | "bullnose" | "base-modern" | "base-colonial" | "base-shoe" | "base-ogee" | "crown-cove" | "crown-ogee" | "crown-craftsman" | "crown-layered" | "rail-rounded" | "rail-ogee" | "rail-picture" | "rail-stepped";
583
+ offsetY?: number | undefined;
584
+ } | undefined;
585
+ chairRail?: {
586
+ enabled: boolean;
587
+ sides: "interior" | "exterior" | "both";
588
+ height: number;
589
+ proud: number;
590
+ profile: "flat" | "bevel" | "triangle" | "cove" | "bullnose" | "base-modern" | "base-colonial" | "base-shoe" | "base-ogee" | "crown-cove" | "crown-ogee" | "crown-craftsman" | "crown-layered" | "rail-rounded" | "rail-ogee" | "rail-picture" | "rail-stepped";
591
+ offsetY?: number | undefined;
592
+ } | undefined;
593
+ } | {
594
+ object: "node";
595
+ parentId: string | null;
596
+ visible: boolean;
597
+ metadata: import("zod").JSONType;
598
+ position: [number, number, number];
599
+ rotation: number;
600
+ width: number;
601
+ depth: number;
602
+ carcassHeight: number;
603
+ operationState: number;
604
+ plinthHeight: number;
605
+ toeKickDepth: number;
606
+ boardThickness: number;
607
+ countertopThickness: number;
608
+ countertopOverhang: number;
609
+ countertopBackOverhang: number;
610
+ withFinishedBack: boolean;
611
+ frontThickness: number;
612
+ frontGap: number;
613
+ frontStyle: "slab" | "shaker" | "raised-arch";
614
+ handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
615
+ handlePosition: "top" | "auto" | "center";
616
+ frontOverlay: "full" | "inset";
617
+ withBottomPanel: boolean;
618
+ showPlinth: boolean;
619
+ withCountertop: boolean;
620
+ id: `cabinet_${string}`;
621
+ type: "cabinet";
622
+ runTier: "wall" | "base" | "tall";
623
+ children: `cabinet-module_${string}`[];
624
+ withWaterfall: boolean;
625
+ name?: string | undefined;
626
+ camera?: {
627
+ position: [number, number, number];
628
+ target: [number, number, number];
629
+ mode: "perspective" | "orthographic";
630
+ fov?: number | undefined;
631
+ zoom?: number | undefined;
632
+ } | undefined;
633
+ material?: {
634
+ id?: string | undefined;
635
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
636
+ properties?: {
637
+ color: string;
638
+ roughness: number;
639
+ metalness: number;
640
+ opacity: number;
641
+ transparent: boolean;
642
+ side: "front" | "back" | "double";
643
+ } | undefined;
644
+ texture?: {
645
+ url: string;
646
+ repeat?: [number, number] | undefined;
647
+ scale?: number | undefined;
648
+ } | undefined;
649
+ } | undefined;
650
+ materialPreset?: string | undefined;
651
+ slots?: Record<string, string> | undefined;
652
+ stack?: ({
653
+ type: "shelf";
654
+ id: string;
655
+ shelfCount?: number | undefined;
656
+ height?: number | undefined;
657
+ } | {
658
+ type: "drawer";
659
+ id: string;
660
+ drawerCount?: number | undefined;
661
+ height?: number | undefined;
662
+ } | {
663
+ type: "door";
664
+ id: string;
665
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
666
+ shelfCount?: number | undefined;
667
+ height?: number | undefined;
668
+ } | {
669
+ type: "sink";
670
+ id: string;
671
+ sinkLayout?: "double" | "single" | "double-offset" | undefined;
672
+ height?: number | undefined;
673
+ } | {
674
+ type: "oven";
675
+ id: string;
676
+ height?: number | undefined;
677
+ } | {
678
+ type: "microwave";
679
+ id: string;
680
+ height?: number | undefined;
681
+ } | {
682
+ type: "dishwasher";
683
+ id: string;
684
+ height?: number | undefined;
685
+ } | {
686
+ type: "cooktop-gas";
687
+ id: string;
688
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
689
+ cooktopBurnersOn?: boolean | undefined;
690
+ cooktopActiveBurners?: number[] | undefined;
691
+ cooktopKnobProgress?: number[] | undefined;
692
+ cooktopShowGrate?: boolean | undefined;
693
+ height?: number | undefined;
694
+ } | {
695
+ type: "cooktop-induction";
696
+ id: string;
697
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
698
+ cooktopBurnersOn?: boolean | undefined;
699
+ cooktopActiveBurners?: number[] | undefined;
700
+ cooktopKnobProgress?: number[] | undefined;
701
+ cooktopShowGrate?: boolean | undefined;
702
+ height?: number | undefined;
703
+ } | {
704
+ type: "pull-out-pantry";
705
+ id: string;
706
+ shelfCount?: number | undefined;
707
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
708
+ height?: number | undefined;
709
+ } | {
710
+ type: "fridge-single";
711
+ id: string;
712
+ height?: number | undefined;
713
+ } | {
714
+ type: "fridge-double";
715
+ id: string;
716
+ height?: number | undefined;
717
+ } | {
718
+ type: "fridge-top-freezer";
719
+ id: string;
720
+ height?: number | undefined;
721
+ } | {
722
+ type: "fridge-bottom-freezer";
723
+ id: string;
724
+ height?: number | undefined;
725
+ } | {
726
+ type: "hood-pyramid";
727
+ id: string;
728
+ height?: number | undefined;
729
+ } | {
730
+ type: "hood-curved-glass";
731
+ id: string;
732
+ height?: number | undefined;
733
+ })[] | undefined;
734
+ barLedge?: {
735
+ edge: "back" | "right" | "left";
736
+ height: number;
737
+ depth: number;
738
+ } | undefined;
739
+ } | {
740
+ object: "node";
741
+ parentId: string | null;
742
+ visible: boolean;
743
+ metadata: import("zod").JSONType;
744
+ position: [number, number, number];
745
+ rotation: number;
746
+ width: number;
747
+ depth: number;
748
+ carcassHeight: number;
749
+ operationState: number;
750
+ plinthHeight: number;
751
+ toeKickDepth: number;
752
+ boardThickness: number;
753
+ countertopThickness: number;
754
+ countertopOverhang: number;
755
+ countertopBackOverhang: number;
756
+ withFinishedBack: boolean;
757
+ frontThickness: number;
758
+ frontGap: number;
759
+ frontStyle: "slab" | "shaker" | "raised-arch";
760
+ handleStyle: "none" | "bar" | "cutout" | "hole" | "knob";
761
+ handlePosition: "top" | "auto" | "center";
762
+ frontOverlay: "full" | "inset";
763
+ withBottomPanel: boolean;
764
+ showPlinth: boolean;
765
+ withCountertop: boolean;
766
+ id: `cabinet-module_${string}`;
767
+ type: "cabinet-module";
768
+ children: (`cabinet_${string}` | `cabinet-module_${string}`)[];
769
+ cabinetType: "base" | "tall";
770
+ moduleKind: "standard" | "corner-filler";
771
+ name?: string | undefined;
772
+ camera?: {
773
+ position: [number, number, number];
774
+ target: [number, number, number];
775
+ mode: "perspective" | "orthographic";
776
+ fov?: number | undefined;
777
+ zoom?: number | undefined;
778
+ } | undefined;
779
+ material?: {
780
+ id?: string | undefined;
781
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
782
+ properties?: {
783
+ color: string;
784
+ roughness: number;
785
+ metalness: number;
786
+ opacity: number;
787
+ transparent: boolean;
788
+ side: "front" | "back" | "double";
789
+ } | undefined;
790
+ texture?: {
791
+ url: string;
792
+ repeat?: [number, number] | undefined;
793
+ scale?: number | undefined;
794
+ } | undefined;
795
+ } | undefined;
796
+ materialPreset?: string | undefined;
797
+ slots?: Record<string, string> | undefined;
798
+ stack?: ({
799
+ type: "shelf";
800
+ id: string;
801
+ shelfCount?: number | undefined;
802
+ height?: number | undefined;
803
+ } | {
804
+ type: "drawer";
805
+ id: string;
806
+ drawerCount?: number | undefined;
807
+ height?: number | undefined;
808
+ } | {
809
+ type: "door";
810
+ id: string;
811
+ doorType?: "glass" | "double" | "single-left" | "single-right" | undefined;
812
+ shelfCount?: number | undefined;
813
+ height?: number | undefined;
814
+ } | {
815
+ type: "sink";
816
+ id: string;
817
+ sinkLayout?: "double" | "single" | "double-offset" | undefined;
818
+ height?: number | undefined;
819
+ } | {
820
+ type: "oven";
821
+ id: string;
822
+ height?: number | undefined;
823
+ } | {
824
+ type: "microwave";
825
+ id: string;
826
+ height?: number | undefined;
827
+ } | {
828
+ type: "dishwasher";
829
+ id: string;
830
+ height?: number | undefined;
831
+ } | {
832
+ type: "cooktop-gas";
833
+ id: string;
834
+ cooktopLayout?: "gas-2burner" | "gas-4burner" | "gas-5burner-wok" | "gas-6burner" | undefined;
835
+ cooktopBurnersOn?: boolean | undefined;
836
+ cooktopActiveBurners?: number[] | undefined;
837
+ cooktopKnobProgress?: number[] | undefined;
838
+ cooktopShowGrate?: boolean | undefined;
839
+ height?: number | undefined;
840
+ } | {
841
+ type: "cooktop-induction";
842
+ id: string;
843
+ cooktopLayout?: "induction-2zone" | "induction-4zone" | undefined;
844
+ cooktopBurnersOn?: boolean | undefined;
845
+ cooktopActiveBurners?: number[] | undefined;
846
+ cooktopKnobProgress?: number[] | undefined;
847
+ cooktopShowGrate?: boolean | undefined;
848
+ height?: number | undefined;
849
+ } | {
850
+ type: "pull-out-pantry";
851
+ id: string;
852
+ shelfCount?: number | undefined;
853
+ pantryRackStyle?: "glass" | "wire" | "tray" | undefined;
854
+ height?: number | undefined;
855
+ } | {
856
+ type: "fridge-single";
857
+ id: string;
858
+ height?: number | undefined;
859
+ } | {
860
+ type: "fridge-double";
861
+ id: string;
862
+ height?: number | undefined;
863
+ } | {
864
+ type: "fridge-top-freezer";
865
+ id: string;
866
+ height?: number | undefined;
867
+ } | {
868
+ type: "fridge-bottom-freezer";
869
+ id: string;
870
+ height?: number | undefined;
871
+ } | {
872
+ type: "hood-pyramid";
873
+ id: string;
874
+ height?: number | undefined;
875
+ } | {
876
+ type: "hood-curved-glass";
877
+ id: string;
878
+ height?: number | undefined;
879
+ })[] | undefined;
880
+ openSide?: "right" | "left" | undefined;
881
+ cornerShelf?: boolean | undefined;
882
+ } | {
883
+ object: "node";
884
+ parentId: string | null;
885
+ visible: boolean;
886
+ id: `zone_${string}`;
887
+ type: "zone";
888
+ name: string;
889
+ polygon: [number, number][];
890
+ autoFromWalls: boolean;
891
+ boundaryWallIds: `wall_${string}`[];
892
+ color: string;
893
+ metadata: import("zod").JSONType;
894
+ camera?: {
895
+ position: [number, number, number];
896
+ target: [number, number, number];
897
+ mode: "perspective" | "orthographic";
898
+ fov?: number | undefined;
899
+ zoom?: number | undefined;
900
+ } | undefined;
901
+ } | {
902
+ object: "node";
903
+ parentId: string | null;
904
+ visible: boolean;
905
+ metadata: import("zod").JSONType;
906
+ id: `slab_${string}`;
907
+ type: "slab";
908
+ polygon: [number, number][];
909
+ holes: [number, number][][];
910
+ holeMetadata: {
911
+ source: "stair" | "elevator" | "manual";
912
+ stairId?: string | undefined;
913
+ elevatorId?: string | undefined;
914
+ }[];
915
+ elevation: number;
916
+ autoFromWalls: boolean;
917
+ name?: string | undefined;
918
+ camera?: {
919
+ position: [number, number, number];
920
+ target: [number, number, number];
921
+ mode: "perspective" | "orthographic";
922
+ fov?: number | undefined;
923
+ zoom?: number | undefined;
924
+ } | undefined;
925
+ material?: {
926
+ id?: string | undefined;
927
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
928
+ properties?: {
929
+ color: string;
930
+ roughness: number;
931
+ metalness: number;
932
+ opacity: number;
933
+ transparent: boolean;
934
+ side: "front" | "back" | "double";
935
+ } | undefined;
936
+ texture?: {
937
+ url: string;
938
+ repeat?: [number, number] | undefined;
939
+ scale?: number | undefined;
940
+ } | undefined;
941
+ } | undefined;
942
+ materialPreset?: string | undefined;
943
+ slots?: Record<string, string> | undefined;
944
+ } | {
945
+ object: "node";
946
+ parentId: string | null;
947
+ visible: boolean;
948
+ metadata: import("zod").JSONType;
949
+ id: `roof_${string}`;
950
+ type: "roof";
951
+ position: [number, number, number];
952
+ rotation: number;
953
+ children: `rseg_${string}`[];
954
+ name?: string | undefined;
955
+ camera?: {
956
+ position: [number, number, number];
957
+ target: [number, number, number];
958
+ mode: "perspective" | "orthographic";
959
+ fov?: number | undefined;
960
+ zoom?: number | undefined;
961
+ } | undefined;
962
+ material?: {
963
+ id?: string | undefined;
964
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
965
+ properties?: {
966
+ color: string;
967
+ roughness: number;
968
+ metalness: number;
969
+ opacity: number;
970
+ transparent: boolean;
971
+ side: "front" | "back" | "double";
972
+ } | undefined;
973
+ texture?: {
974
+ url: string;
975
+ repeat?: [number, number] | undefined;
976
+ scale?: number | undefined;
977
+ } | undefined;
978
+ } | undefined;
979
+ materialPreset?: string | undefined;
980
+ topMaterial?: {
981
+ id?: string | undefined;
982
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
983
+ properties?: {
984
+ color: string;
985
+ roughness: number;
986
+ metalness: number;
987
+ opacity: number;
988
+ transparent: boolean;
989
+ side: "front" | "back" | "double";
990
+ } | undefined;
991
+ texture?: {
992
+ url: string;
993
+ repeat?: [number, number] | undefined;
994
+ scale?: number | undefined;
995
+ } | undefined;
996
+ } | undefined;
997
+ topMaterialPreset?: string | undefined;
998
+ edgeMaterial?: {
999
+ id?: string | undefined;
1000
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1001
+ properties?: {
1002
+ color: string;
1003
+ roughness: number;
1004
+ metalness: number;
1005
+ opacity: number;
1006
+ transparent: boolean;
1007
+ side: "front" | "back" | "double";
1008
+ } | undefined;
1009
+ texture?: {
1010
+ url: string;
1011
+ repeat?: [number, number] | undefined;
1012
+ scale?: number | undefined;
1013
+ } | undefined;
1014
+ } | undefined;
1015
+ edgeMaterialPreset?: string | undefined;
1016
+ wallMaterial?: {
1017
+ id?: string | undefined;
1018
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1019
+ properties?: {
1020
+ color: string;
1021
+ roughness: number;
1022
+ metalness: number;
1023
+ opacity: number;
1024
+ transparent: boolean;
1025
+ side: "front" | "back" | "double";
1026
+ } | undefined;
1027
+ texture?: {
1028
+ url: string;
1029
+ repeat?: [number, number] | undefined;
1030
+ scale?: number | undefined;
1031
+ } | undefined;
1032
+ } | undefined;
1033
+ wallMaterialPreset?: string | undefined;
1034
+ } | {
1035
+ object: "node";
1036
+ parentId: string | null;
1037
+ visible: boolean;
1038
+ metadata: import("zod").JSONType;
1039
+ id: `rseg_${string}`;
1040
+ type: "roof-segment";
1041
+ position: [number, number, number];
1042
+ rotation: number;
1043
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
1044
+ width: number;
1045
+ depth: number;
1046
+ trim: {
1047
+ left: number;
1048
+ right: number;
1049
+ front: number;
1050
+ back: number;
1051
+ frontLeft: number;
1052
+ frontRight: number;
1053
+ backLeft: number;
1054
+ backRight: number;
1055
+ frontLeftX: number;
1056
+ frontLeftZ: number;
1057
+ frontRightX: number;
1058
+ frontRightZ: number;
1059
+ backLeftX: number;
1060
+ backLeftZ: number;
1061
+ backRightX: number;
1062
+ backRightZ: number;
1063
+ };
1064
+ wallHeight: number;
1065
+ pitch: number;
1066
+ wallThickness: number;
1067
+ deckThickness: number;
1068
+ overhang: number;
1069
+ shingleThickness: number;
1070
+ gambrelLowerWidthRatio: number;
1071
+ gambrelLowerHeightRatio: number;
1072
+ mansardSteepWidthRatio: number;
1073
+ mansardSteepHeightRatio: number;
1074
+ dutchHipWidthRatio: number;
1075
+ dutchHipHeightRatio: number;
1076
+ dutchWaistLengthRatio: number;
1077
+ dutchGabletRake: number;
1078
+ dutchTopRakeThickness: number;
1079
+ children: string[];
1080
+ name?: string | undefined;
1081
+ camera?: {
1082
+ position: [number, number, number];
1083
+ target: [number, number, number];
1084
+ mode: "perspective" | "orthographic";
1085
+ fov?: number | undefined;
1086
+ zoom?: number | undefined;
1087
+ } | undefined;
1088
+ material?: {
1089
+ id?: string | undefined;
1090
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1091
+ properties?: {
1092
+ color: string;
1093
+ roughness: number;
1094
+ metalness: number;
1095
+ opacity: number;
1096
+ transparent: boolean;
1097
+ side: "front" | "back" | "double";
1098
+ } | undefined;
1099
+ texture?: {
1100
+ url: string;
1101
+ repeat?: [number, number] | undefined;
1102
+ scale?: number | undefined;
1103
+ } | undefined;
1104
+ } | undefined;
1105
+ materialPreset?: string | undefined;
1106
+ topMaterial?: {
1107
+ id?: string | undefined;
1108
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1109
+ properties?: {
1110
+ color: string;
1111
+ roughness: number;
1112
+ metalness: number;
1113
+ opacity: number;
1114
+ transparent: boolean;
1115
+ side: "front" | "back" | "double";
1116
+ } | undefined;
1117
+ texture?: {
1118
+ url: string;
1119
+ repeat?: [number, number] | undefined;
1120
+ scale?: number | undefined;
1121
+ } | undefined;
1122
+ } | undefined;
1123
+ topMaterialPreset?: string | undefined;
1124
+ edgeMaterial?: {
1125
+ id?: string | undefined;
1126
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1127
+ properties?: {
1128
+ color: string;
1129
+ roughness: number;
1130
+ metalness: number;
1131
+ opacity: number;
1132
+ transparent: boolean;
1133
+ side: "front" | "back" | "double";
1134
+ } | undefined;
1135
+ texture?: {
1136
+ url: string;
1137
+ repeat?: [number, number] | undefined;
1138
+ scale?: number | undefined;
1139
+ } | undefined;
1140
+ } | undefined;
1141
+ edgeMaterialPreset?: string | undefined;
1142
+ wallMaterial?: {
1143
+ id?: string | undefined;
1144
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1145
+ properties?: {
1146
+ color: string;
1147
+ roughness: number;
1148
+ metalness: number;
1149
+ opacity: number;
1150
+ transparent: boolean;
1151
+ side: "front" | "back" | "double";
1152
+ } | undefined;
1153
+ texture?: {
1154
+ url: string;
1155
+ repeat?: [number, number] | undefined;
1156
+ scale?: number | undefined;
1157
+ } | undefined;
1158
+ } | undefined;
1159
+ wallMaterialPreset?: string | undefined;
1160
+ } | {
1161
+ object: "node";
1162
+ parentId: string | null;
1163
+ visible: boolean;
1164
+ metadata: import("zod").JSONType;
1165
+ id: `shelf_${string}`;
1166
+ type: "shelf";
1167
+ children: `item_${string}`[];
1168
+ position: [number, number, number];
1169
+ rotation: [number, number, number];
1170
+ width: number;
1171
+ depth: number;
1172
+ thickness: number;
1173
+ height: number;
1174
+ style: "wall-shelf" | "bookshelf" | "open-rack" | "cubby";
1175
+ rows: number;
1176
+ columns: number;
1177
+ withBack: boolean;
1178
+ withSides: boolean;
1179
+ withBottom: boolean;
1180
+ bracketStyle: "minimal" | "industrial" | "hidden";
1181
+ name?: string | undefined;
1182
+ camera?: {
1183
+ position: [number, number, number];
1184
+ target: [number, number, number];
1185
+ mode: "perspective" | "orthographic";
1186
+ fov?: number | undefined;
1187
+ zoom?: number | undefined;
1188
+ } | undefined;
1189
+ material?: {
1190
+ id?: string | undefined;
1191
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1192
+ properties?: {
1193
+ color: string;
1194
+ roughness: number;
1195
+ metalness: number;
1196
+ opacity: number;
1197
+ transparent: boolean;
1198
+ side: "front" | "back" | "double";
1199
+ } | undefined;
1200
+ texture?: {
1201
+ url: string;
1202
+ repeat?: [number, number] | undefined;
1203
+ scale?: number | undefined;
1204
+ } | undefined;
1205
+ } | undefined;
1206
+ materialPreset?: string | undefined;
1207
+ slots?: Record<string, string> | undefined;
1208
+ } | {
1209
+ object: "node";
1210
+ parentId: string | null;
1211
+ visible: boolean;
1212
+ metadata: import("zod").JSONType;
1213
+ id: `stair_${string}`;
1214
+ type: "stair";
1215
+ position: [number, number, number];
1216
+ rotation: number;
1217
+ stairType: "straight" | "spiral" | "curved";
1218
+ fromLevelId: string | null;
1219
+ toLevelId: string | null;
1220
+ slabOpeningMode: "none" | "destination";
1221
+ openingOffset: number;
1222
+ width: number;
1223
+ totalRise: number;
1224
+ stepCount: number;
1225
+ thickness: number;
1226
+ fillToFloor: boolean;
1227
+ innerRadius: number;
1228
+ sweepAngle: number;
1229
+ topLandingMode: "none" | "integrated";
1230
+ topLandingDepth: number;
1231
+ showCenterColumn: boolean;
1232
+ showStepSupports: boolean;
1233
+ railingMode: "right" | "left" | "none" | "both";
1234
+ railingHeight: number;
1235
+ children: `sseg_${string}`[];
1236
+ name?: string | undefined;
1237
+ camera?: {
1238
+ position: [number, number, number];
1239
+ target: [number, number, number];
1240
+ mode: "perspective" | "orthographic";
1241
+ fov?: number | undefined;
1242
+ zoom?: number | undefined;
1243
+ } | undefined;
1244
+ material?: {
1245
+ id?: string | undefined;
1246
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1247
+ properties?: {
1248
+ color: string;
1249
+ roughness: number;
1250
+ metalness: number;
1251
+ opacity: number;
1252
+ transparent: boolean;
1253
+ side: "front" | "back" | "double";
1254
+ } | undefined;
1255
+ texture?: {
1256
+ url: string;
1257
+ repeat?: [number, number] | undefined;
1258
+ scale?: number | undefined;
1259
+ } | undefined;
1260
+ } | undefined;
1261
+ materialPreset?: string | undefined;
1262
+ railingMaterial?: {
1263
+ id?: string | undefined;
1264
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1265
+ properties?: {
1266
+ color: string;
1267
+ roughness: number;
1268
+ metalness: number;
1269
+ opacity: number;
1270
+ transparent: boolean;
1271
+ side: "front" | "back" | "double";
1272
+ } | undefined;
1273
+ texture?: {
1274
+ url: string;
1275
+ repeat?: [number, number] | undefined;
1276
+ scale?: number | undefined;
1277
+ } | undefined;
1278
+ } | undefined;
1279
+ railingMaterialPreset?: string | undefined;
1280
+ treadMaterial?: {
1281
+ id?: string | undefined;
1282
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1283
+ properties?: {
1284
+ color: string;
1285
+ roughness: number;
1286
+ metalness: number;
1287
+ opacity: number;
1288
+ transparent: boolean;
1289
+ side: "front" | "back" | "double";
1290
+ } | undefined;
1291
+ texture?: {
1292
+ url: string;
1293
+ repeat?: [number, number] | undefined;
1294
+ scale?: number | undefined;
1295
+ } | undefined;
1296
+ } | undefined;
1297
+ treadMaterialPreset?: string | undefined;
1298
+ sideMaterial?: {
1299
+ id?: string | undefined;
1300
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1301
+ properties?: {
1302
+ color: string;
1303
+ roughness: number;
1304
+ metalness: number;
1305
+ opacity: number;
1306
+ transparent: boolean;
1307
+ side: "front" | "back" | "double";
1308
+ } | undefined;
1309
+ texture?: {
1310
+ url: string;
1311
+ repeat?: [number, number] | undefined;
1312
+ scale?: number | undefined;
1313
+ } | undefined;
1314
+ } | undefined;
1315
+ sideMaterialPreset?: string | undefined;
1316
+ slots?: Record<string, string> | undefined;
1317
+ } | {
1318
+ object: "node";
1319
+ parentId: string | null;
1320
+ visible: boolean;
1321
+ metadata: import("zod").JSONType;
1322
+ id: `sseg_${string}`;
1323
+ type: "stair-segment";
1324
+ position: [number, number, number];
1325
+ rotation: number;
1326
+ segmentType: "stair" | "landing";
1327
+ width: number;
1328
+ length: number;
1329
+ height: number;
1330
+ stepCount: number;
1331
+ attachmentSide: "front" | "right" | "left";
1332
+ fillToFloor: boolean;
1333
+ thickness: number;
1334
+ name?: string | undefined;
1335
+ camera?: {
1336
+ position: [number, number, number];
1337
+ target: [number, number, number];
1338
+ mode: "perspective" | "orthographic";
1339
+ fov?: number | undefined;
1340
+ zoom?: number | undefined;
1341
+ } | undefined;
1342
+ material?: {
1343
+ id?: string | undefined;
1344
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1345
+ properties?: {
1346
+ color: string;
1347
+ roughness: number;
1348
+ metalness: number;
1349
+ opacity: number;
1350
+ transparent: boolean;
1351
+ side: "front" | "back" | "double";
1352
+ } | undefined;
1353
+ texture?: {
1354
+ url: string;
1355
+ repeat?: [number, number] | undefined;
1356
+ scale?: number | undefined;
1357
+ } | undefined;
1358
+ } | undefined;
1359
+ materialPreset?: string | undefined;
1360
+ } | {
1361
+ object: "node";
1362
+ parentId: string | null;
1363
+ visible: boolean;
1364
+ metadata: import("zod").JSONType;
1365
+ id: `scan_${string}`;
1366
+ type: "scan";
1367
+ url: string;
1368
+ position: [number, number, number];
1369
+ rotation: [number, number, number];
1370
+ scale: number;
1371
+ opacity: number;
1372
+ name?: string | undefined;
1373
+ camera?: {
1374
+ position: [number, number, number];
1375
+ target: [number, number, number];
1376
+ mode: "perspective" | "orthographic";
1377
+ fov?: number | undefined;
1378
+ zoom?: number | undefined;
1379
+ } | undefined;
1380
+ } | {
1381
+ object: "node";
1382
+ parentId: string | null;
1383
+ visible: boolean;
1384
+ metadata: import("zod").JSONType;
1385
+ id: `measurement_${string}`;
1386
+ type: "measurement";
1387
+ measurement: {
1388
+ kind: "distance";
1389
+ points: [[number, number, number] | {
1390
+ kind: "feature";
1391
+ reference: {
1392
+ nodeId: string;
1393
+ featureId: string;
1394
+ parameters?: Record<string, string | number | boolean> | undefined;
1395
+ };
1396
+ fallback: [number, number, number];
1397
+ }, [number, number, number] | {
1398
+ kind: "feature";
1399
+ reference: {
1400
+ nodeId: string;
1401
+ featureId: string;
1402
+ parameters?: Record<string, string | number | boolean> | undefined;
1403
+ };
1404
+ fallback: [number, number, number];
1405
+ }];
1406
+ } | {
1407
+ kind: "angle";
1408
+ points: [[number, number, number] | {
1409
+ kind: "feature";
1410
+ reference: {
1411
+ nodeId: string;
1412
+ featureId: string;
1413
+ parameters?: Record<string, string | number | boolean> | undefined;
1414
+ };
1415
+ fallback: [number, number, number];
1416
+ }, [number, number, number] | {
1417
+ kind: "feature";
1418
+ reference: {
1419
+ nodeId: string;
1420
+ featureId: string;
1421
+ parameters?: Record<string, string | number | boolean> | undefined;
1422
+ };
1423
+ fallback: [number, number, number];
1424
+ }, [number, number, number] | {
1425
+ kind: "feature";
1426
+ reference: {
1427
+ nodeId: string;
1428
+ featureId: string;
1429
+ parameters?: Record<string, string | number | boolean> | undefined;
1430
+ };
1431
+ fallback: [number, number, number];
1432
+ }];
1433
+ } | {
1434
+ kind: "area";
1435
+ base: ([number, number, number] | {
1436
+ kind: "feature";
1437
+ reference: {
1438
+ nodeId: string;
1439
+ featureId: string;
1440
+ parameters?: Record<string, string | number | boolean> | undefined;
1441
+ };
1442
+ fallback: [number, number, number];
1443
+ })[];
1444
+ } | {
1445
+ kind: "perimeter";
1446
+ base: ([number, number, number] | {
1447
+ kind: "feature";
1448
+ reference: {
1449
+ nodeId: string;
1450
+ featureId: string;
1451
+ parameters?: Record<string, string | number | boolean> | undefined;
1452
+ };
1453
+ fallback: [number, number, number];
1454
+ })[];
1455
+ } | {
1456
+ kind: "volume";
1457
+ base: ([number, number, number] | {
1458
+ kind: "feature";
1459
+ reference: {
1460
+ nodeId: string;
1461
+ featureId: string;
1462
+ parameters?: Record<string, string | number | boolean> | undefined;
1463
+ };
1464
+ fallback: [number, number, number];
1465
+ })[];
1466
+ extrusion: [number, number, number];
1467
+ };
1468
+ name?: string | undefined;
1469
+ camera?: {
1470
+ position: [number, number, number];
1471
+ target: [number, number, number];
1472
+ mode: "perspective" | "orthographic";
1473
+ fov?: number | undefined;
1474
+ zoom?: number | undefined;
1475
+ } | undefined;
1476
+ } | {
1477
+ object: "node";
1478
+ parentId: string | null;
1479
+ visible: boolean;
1480
+ metadata: import("zod").JSONType;
1481
+ id: `spawn_${string}`;
1482
+ type: "spawn";
1483
+ position: [number, number, number];
1484
+ rotation: number;
1485
+ name?: string | undefined;
1486
+ camera?: {
1487
+ position: [number, number, number];
1488
+ target: [number, number, number];
1489
+ mode: "perspective" | "orthographic";
1490
+ fov?: number | undefined;
1491
+ zoom?: number | undefined;
1492
+ } | undefined;
1493
+ } | {
1494
+ object: "node";
1495
+ parentId: string | null;
1496
+ visible: boolean;
1497
+ metadata: import("zod").JSONType;
1498
+ id: `window_${string}`;
1499
+ type: "window";
1500
+ position: [number, number, number];
1501
+ rotation: [number, number, number];
1502
+ width: number;
1503
+ height: number;
1504
+ openingKind: "window" | "opening";
1505
+ windowType: "sliding" | "fixed" | "casement" | "awning" | "hopper" | "single-hung" | "double-hung" | "bay" | "bow" | "louvered";
1506
+ operationState: number;
1507
+ awningDirection: "up" | "down";
1508
+ casementStyle: "french" | "single";
1509
+ hingesSide: "right" | "left";
1510
+ openingShape: "rectangle" | "rounded" | "arch";
1511
+ openingRadiusMode: "all" | "individual";
1512
+ openingCornerRadii: [number, number, number, number];
1513
+ cornerRadius: number;
1514
+ archHeight: number;
1515
+ openingRevealRadius: number;
1516
+ frameThickness: number;
1517
+ frameDepth: number;
1518
+ columnRatios: number[];
1519
+ rowRatios: number[];
1520
+ columnDividerThickness: number;
1521
+ rowDividerThickness: number;
1522
+ sill: boolean;
1523
+ sillDepth: number;
1524
+ sillThickness: number;
1525
+ name?: string | undefined;
1526
+ camera?: {
1527
+ position: [number, number, number];
1528
+ target: [number, number, number];
1529
+ mode: "perspective" | "orthographic";
1530
+ fov?: number | undefined;
1531
+ zoom?: number | undefined;
1532
+ } | undefined;
1533
+ material?: {
1534
+ id?: string | undefined;
1535
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1536
+ properties?: {
1537
+ color: string;
1538
+ roughness: number;
1539
+ metalness: number;
1540
+ opacity: number;
1541
+ transparent: boolean;
1542
+ side: "front" | "back" | "double";
1543
+ } | undefined;
1544
+ texture?: {
1545
+ url: string;
1546
+ repeat?: [number, number] | undefined;
1547
+ scale?: number | undefined;
1548
+ } | undefined;
1549
+ } | undefined;
1550
+ slots?: Record<string, string> | undefined;
1551
+ side?: "front" | "back" | undefined;
1552
+ wallId?: string | undefined;
1553
+ roofSegmentId?: string | undefined;
1554
+ roofFace?: "front" | "back" | "right" | "left" | undefined;
1555
+ } | {
1556
+ object: "node";
1557
+ parentId: string | null;
1558
+ visible: boolean;
1559
+ metadata: import("zod").JSONType;
1560
+ id: `door_${string}`;
1561
+ type: "door";
1562
+ position: [number, number, number];
1563
+ rotation: [number, number, number];
1564
+ width: number;
1565
+ height: number;
1566
+ doorCategory: "interior" | "garage";
1567
+ doorType: "double" | "hinged" | "french" | "folding" | "pocket" | "barn" | "sliding" | "garage-sectional" | "garage-rollup" | "garage-tiltup";
1568
+ leafCount: 4 | 1 | 2 | 3;
1569
+ operationState: number;
1570
+ slideDirection: "right" | "left";
1571
+ trackStyle: "visible" | "none" | "pocket" | "overhead";
1572
+ garagePanelCount: number;
1573
+ openingKind: "door" | "opening";
1574
+ openingShape: "rectangle" | "rounded" | "arch";
1575
+ openingRadiusMode: "all" | "individual";
1576
+ openingTopRadii: [number, number];
1577
+ cornerRadius: number;
1578
+ archHeight: number;
1579
+ openingRevealRadius: number;
1580
+ frameThickness: number;
1581
+ frameDepth: number;
1582
+ threshold: boolean;
1583
+ thresholdHeight: number;
1584
+ hingesSide: "right" | "left";
1585
+ swingDirection: "inward" | "outward";
1586
+ swingAngle: number;
1587
+ segments: {
1588
+ type: "glass" | "panel" | "empty";
1589
+ heightRatio: number;
1590
+ columnRatios: number[];
1591
+ dividerThickness: number;
1592
+ panelDepth: number;
1593
+ panelInset: number;
1594
+ }[];
1595
+ handle: boolean;
1596
+ handleHeight: number;
1597
+ handleSide: "right" | "left";
1598
+ contentPadding: [number, number];
1599
+ doorCloser: boolean;
1600
+ panicBar: boolean;
1601
+ panicBarHeight: number;
1602
+ name?: string | undefined;
1603
+ camera?: {
1604
+ position: [number, number, number];
1605
+ target: [number, number, number];
1606
+ mode: "perspective" | "orthographic";
1607
+ fov?: number | undefined;
1608
+ zoom?: number | undefined;
1609
+ } | undefined;
1610
+ material?: {
1611
+ id?: string | undefined;
1612
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1613
+ properties?: {
1614
+ color: string;
1615
+ roughness: number;
1616
+ metalness: number;
1617
+ opacity: number;
1618
+ transparent: boolean;
1619
+ side: "front" | "back" | "double";
1620
+ } | undefined;
1621
+ texture?: {
1622
+ url: string;
1623
+ repeat?: [number, number] | undefined;
1624
+ scale?: number | undefined;
1625
+ } | undefined;
1626
+ } | undefined;
1627
+ slots?: Record<string, string> | undefined;
1628
+ side?: "front" | "back" | undefined;
1629
+ wallId?: string | undefined;
1630
+ roofSegmentId?: string | undefined;
1631
+ roofFace?: "front" | "back" | "right" | "left" | undefined;
1632
+ } | {
1633
+ object: "node";
1634
+ parentId: string | null;
1635
+ visible: boolean;
1636
+ metadata: import("zod").JSONType;
1637
+ id: `rvent_${string}`;
1638
+ type: "ridge-vent";
1639
+ position: [number, number, number];
1640
+ rotation: number;
1641
+ length: number;
1642
+ width: number;
1643
+ height: number;
1644
+ style: "metal" | "standard" | "shingled";
1645
+ endCaps: boolean;
1646
+ name?: string | undefined;
1647
+ camera?: {
1648
+ position: [number, number, number];
1649
+ target: [number, number, number];
1650
+ mode: "perspective" | "orthographic";
1651
+ fov?: number | undefined;
1652
+ zoom?: number | undefined;
1653
+ } | undefined;
1654
+ material?: {
1655
+ id?: string | undefined;
1656
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1657
+ properties?: {
1658
+ color: string;
1659
+ roughness: number;
1660
+ metalness: number;
1661
+ opacity: number;
1662
+ transparent: boolean;
1663
+ side: "front" | "back" | "double";
1664
+ } | undefined;
1665
+ texture?: {
1666
+ url: string;
1667
+ repeat?: [number, number] | undefined;
1668
+ scale?: number | undefined;
1669
+ } | undefined;
1670
+ } | undefined;
1671
+ materialPreset?: string | undefined;
1672
+ roofSegmentId?: string | undefined;
1673
+ } | {
1674
+ object: "node";
1675
+ parentId: string | null;
1676
+ visible: boolean;
1677
+ metadata: import("zod").JSONType;
1678
+ id: `tvent_${string}`;
1679
+ type: "turbine-vent";
1680
+ materialPreset: string;
1681
+ position: [number, number, number];
1682
+ rotation: number;
1683
+ diameter: number;
1684
+ height: number;
1685
+ neckHeight: number;
1686
+ baseOverhang: number;
1687
+ vaneCount: number;
1688
+ spinSpeed: number;
1689
+ style: "globe" | "cylinder";
1690
+ name?: string | undefined;
1691
+ camera?: {
1692
+ position: [number, number, number];
1693
+ target: [number, number, number];
1694
+ mode: "perspective" | "orthographic";
1695
+ fov?: number | undefined;
1696
+ zoom?: number | undefined;
1697
+ } | undefined;
1698
+ material?: {
1699
+ id?: string | undefined;
1700
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1701
+ properties?: {
1702
+ color: string;
1703
+ roughness: number;
1704
+ metalness: number;
1705
+ opacity: number;
1706
+ transparent: boolean;
1707
+ side: "front" | "back" | "double";
1708
+ } | undefined;
1709
+ texture?: {
1710
+ url: string;
1711
+ repeat?: [number, number] | undefined;
1712
+ scale?: number | undefined;
1713
+ } | undefined;
1714
+ } | undefined;
1715
+ roofSegmentId?: string | undefined;
1716
+ } | {
1717
+ object: "node";
1718
+ parentId: string | null;
1719
+ visible: boolean;
1720
+ metadata: import("zod").JSONType;
1721
+ id: `cupola_${string}`;
1722
+ type: "cupola";
1723
+ materialPreset: string;
1724
+ position: [number, number, number];
1725
+ rotation: number;
1726
+ width: number;
1727
+ depth: number;
1728
+ height: number;
1729
+ roofStyle: "dome" | "pyramid";
1730
+ finial: boolean;
1731
+ name?: string | undefined;
1732
+ camera?: {
1733
+ position: [number, number, number];
1734
+ target: [number, number, number];
1735
+ mode: "perspective" | "orthographic";
1736
+ fov?: number | undefined;
1737
+ zoom?: number | undefined;
1738
+ } | undefined;
1739
+ material?: {
1740
+ id?: string | undefined;
1741
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1742
+ properties?: {
1743
+ color: string;
1744
+ roughness: number;
1745
+ metalness: number;
1746
+ opacity: number;
1747
+ transparent: boolean;
1748
+ side: "front" | "back" | "double";
1749
+ } | undefined;
1750
+ texture?: {
1751
+ url: string;
1752
+ repeat?: [number, number] | undefined;
1753
+ scale?: number | undefined;
1754
+ } | undefined;
1755
+ } | undefined;
1756
+ roofSegmentId?: string | undefined;
1757
+ } | {
1758
+ object: "node";
1759
+ parentId: string | null;
1760
+ visible: boolean;
1761
+ metadata: import("zod").JSONType;
1762
+ id: `eyebrow-vent_${string}`;
1763
+ type: "eyebrow-vent";
1764
+ materialPreset: string;
1765
+ position: [number, number, number];
1766
+ rotation: number;
1767
+ width: number;
1768
+ depth: number;
1769
+ height: number;
1770
+ style: "scoop" | "half-round" | "slant-box";
1771
+ louverCount: number;
1772
+ backRatio: number;
1773
+ name?: string | undefined;
1774
+ camera?: {
1775
+ position: [number, number, number];
1776
+ target: [number, number, number];
1777
+ mode: "perspective" | "orthographic";
1778
+ fov?: number | undefined;
1779
+ zoom?: number | undefined;
1780
+ } | undefined;
1781
+ material?: {
1782
+ id?: string | undefined;
1783
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1784
+ properties?: {
1785
+ color: string;
1786
+ roughness: number;
1787
+ metalness: number;
1788
+ opacity: number;
1789
+ transparent: boolean;
1790
+ side: "front" | "back" | "double";
1791
+ } | undefined;
1792
+ texture?: {
1793
+ url: string;
1794
+ repeat?: [number, number] | undefined;
1795
+ scale?: number | undefined;
1796
+ } | undefined;
1797
+ } | undefined;
1798
+ roofSegmentId?: string | undefined;
1799
+ } | {
1800
+ object: "node";
1801
+ parentId: string | null;
1802
+ visible: boolean;
1803
+ metadata: import("zod").JSONType;
1804
+ id: `gutter_${string}`;
1805
+ type: "gutter";
1806
+ materialPreset: string;
1807
+ position: [number, number, number];
1808
+ rotation: number;
1809
+ length: number;
1810
+ size: number;
1811
+ thickness: number;
1812
+ profile: "box" | "half-round" | "k-style";
1813
+ endCapLeft: boolean;
1814
+ endCapRight: boolean;
1815
+ hangerStyle: "none" | "strap";
1816
+ hangerSpacing: number;
1817
+ outlets: {
1818
+ id: string;
1819
+ offset: number;
1820
+ diameter: number;
1821
+ }[];
1822
+ name?: string | undefined;
1823
+ camera?: {
1824
+ position: [number, number, number];
1825
+ target: [number, number, number];
1826
+ mode: "perspective" | "orthographic";
1827
+ fov?: number | undefined;
1828
+ zoom?: number | undefined;
1829
+ } | undefined;
1830
+ material?: {
1831
+ id?: string | undefined;
1832
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1833
+ properties?: {
1834
+ color: string;
1835
+ roughness: number;
1836
+ metalness: number;
1837
+ opacity: number;
1838
+ transparent: boolean;
1839
+ side: "front" | "back" | "double";
1840
+ } | undefined;
1841
+ texture?: {
1842
+ url: string;
1843
+ repeat?: [number, number] | undefined;
1844
+ scale?: number | undefined;
1845
+ } | undefined;
1846
+ } | undefined;
1847
+ roofSegmentId?: string | undefined;
1848
+ } | {
1849
+ object: "node";
1850
+ parentId: string | null;
1851
+ visible: boolean;
1852
+ metadata: import("zod").JSONType;
1853
+ id: `chimney_${string}`;
1854
+ type: "chimney";
1855
+ position: [number, number, number];
1856
+ rotation: number;
1857
+ bodyShape: "round" | "square";
1858
+ bodyHollowDepth: number;
1859
+ bodyHollowMargin: number;
1860
+ width: number;
1861
+ depth: number;
1862
+ heightAboveRidge: number;
1863
+ cutoutOffset: number;
1864
+ cornerBevel: number;
1865
+ cap: boolean;
1866
+ capShape: "flat" | "none" | "stepped" | "sloped";
1867
+ capOverhang: number;
1868
+ capThickness: number;
1869
+ flueCount: number;
1870
+ flueShape: "round" | "square";
1871
+ flueHeight: number;
1872
+ flueDiameter: number;
1873
+ flueSpacing: number;
1874
+ flueWallThickness: number;
1875
+ shoulderStyle: "tapered" | "none" | "corbeled";
1876
+ shoulderHeight: number;
1877
+ shoulderExtent: number;
1878
+ bandStyle: "double" | "none" | "single";
1879
+ bandHeight: number;
1880
+ bandExtent: number;
1881
+ bandOffset: number;
1882
+ cricketStyle: "none" | "simple";
1883
+ cricketLength: number;
1884
+ cricketHeight: number;
1885
+ cricketSide: "front" | "back";
1886
+ panelStyle: "rectangular" | "none";
1887
+ panelDepth: number;
1888
+ panelHeight: number;
1889
+ panelOffsetTop: number;
1890
+ panelMargin: number;
1891
+ name?: string | undefined;
1892
+ camera?: {
1893
+ position: [number, number, number];
1894
+ target: [number, number, number];
1895
+ mode: "perspective" | "orthographic";
1896
+ fov?: number | undefined;
1897
+ zoom?: number | undefined;
1898
+ } | undefined;
1899
+ material?: {
1900
+ id?: string | undefined;
1901
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1902
+ properties?: {
1903
+ color: string;
1904
+ roughness: number;
1905
+ metalness: number;
1906
+ opacity: number;
1907
+ transparent: boolean;
1908
+ side: "front" | "back" | "double";
1909
+ } | undefined;
1910
+ texture?: {
1911
+ url: string;
1912
+ repeat?: [number, number] | undefined;
1913
+ scale?: number | undefined;
1914
+ } | undefined;
1915
+ } | undefined;
1916
+ materialPreset?: string | undefined;
1917
+ topMaterial?: {
1918
+ id?: string | undefined;
1919
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1920
+ properties?: {
1921
+ color: string;
1922
+ roughness: number;
1923
+ metalness: number;
1924
+ opacity: number;
1925
+ transparent: boolean;
1926
+ side: "front" | "back" | "double";
1927
+ } | undefined;
1928
+ texture?: {
1929
+ url: string;
1930
+ repeat?: [number, number] | undefined;
1931
+ scale?: number | undefined;
1932
+ } | undefined;
1933
+ } | undefined;
1934
+ topMaterialPreset?: string | undefined;
1935
+ roofSegmentId?: string | undefined;
1936
+ } | {
1937
+ object: "node";
1938
+ parentId: string | null;
1939
+ visible: boolean;
1940
+ metadata: import("zod").JSONType;
1941
+ id: `solarpanel_${string}`;
1942
+ type: "solar-panel";
1943
+ position: [number, number, number];
1944
+ rotation: number;
1945
+ rows: number;
1946
+ columns: number;
1947
+ panelWidth: number;
1948
+ panelHeight: number;
1949
+ gapX: number;
1950
+ gapY: number;
1951
+ mountingType: "flush" | "tilted";
1952
+ tiltAngle: number;
1953
+ standoffHeight: number;
1954
+ frameThickness: number;
1955
+ frameDepth: number;
1956
+ name?: string | undefined;
1957
+ camera?: {
1958
+ position: [number, number, number];
1959
+ target: [number, number, number];
1960
+ mode: "perspective" | "orthographic";
1961
+ fov?: number | undefined;
1962
+ zoom?: number | undefined;
1963
+ } | undefined;
1964
+ material?: {
1965
+ id?: string | undefined;
1966
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1967
+ properties?: {
1968
+ color: string;
1969
+ roughness: number;
1970
+ metalness: number;
1971
+ opacity: number;
1972
+ transparent: boolean;
1973
+ side: "front" | "back" | "double";
1974
+ } | undefined;
1975
+ texture?: {
1976
+ url: string;
1977
+ repeat?: [number, number] | undefined;
1978
+ scale?: number | undefined;
1979
+ } | undefined;
1980
+ } | undefined;
1981
+ materialPreset?: string | undefined;
1982
+ panelMaterial?: {
1983
+ id?: string | undefined;
1984
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1985
+ properties?: {
1986
+ color: string;
1987
+ roughness: number;
1988
+ metalness: number;
1989
+ opacity: number;
1990
+ transparent: boolean;
1991
+ side: "front" | "back" | "double";
1992
+ } | undefined;
1993
+ texture?: {
1994
+ url: string;
1995
+ repeat?: [number, number] | undefined;
1996
+ scale?: number | undefined;
1997
+ } | undefined;
1998
+ } | undefined;
1999
+ panelMaterialPreset?: string | undefined;
2000
+ panelTypePreset?: "residential" | "residential-large" | "compact" | "frameless" | undefined;
2001
+ roofSegmentId?: string | undefined;
2002
+ surfaceNormal?: [number, number, number] | undefined;
2003
+ } | {
2004
+ object: "node";
2005
+ parentId: string | null;
2006
+ visible: boolean;
2007
+ metadata: import("zod").JSONType;
2008
+ id: `skylight_${string}`;
2009
+ type: "skylight";
2010
+ position: [number, number, number];
2011
+ rotation: number;
2012
+ width: number;
2013
+ height: number;
2014
+ frameThickness: number;
2015
+ frameDepth: number;
2016
+ skylightType: "flat" | "sliding" | "opening" | "walk-on" | "lantern";
2017
+ glassThickness: number;
2018
+ lanternHeight: number;
2019
+ lanternTopScale: number;
2020
+ openingAngle: number;
2021
+ openingSide: "right" | "left" | "top" | "bottom";
2022
+ operationState: number;
2023
+ motorHousing: boolean;
2024
+ slideFraction: number;
2025
+ slideDirection: "z" | "x";
2026
+ trackWidth: number;
2027
+ motorHousingSize: number;
2028
+ curb: boolean;
2029
+ curbHeight: number;
2030
+ cutoutOffset: number;
2031
+ name?: string | undefined;
2032
+ camera?: {
2033
+ position: [number, number, number];
2034
+ target: [number, number, number];
2035
+ mode: "perspective" | "orthographic";
2036
+ fov?: number | undefined;
2037
+ zoom?: number | undefined;
2038
+ } | undefined;
2039
+ material?: {
2040
+ id?: string | undefined;
2041
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2042
+ properties?: {
2043
+ color: string;
2044
+ roughness: number;
2045
+ metalness: number;
2046
+ opacity: number;
2047
+ transparent: boolean;
2048
+ side: "front" | "back" | "double";
2049
+ } | undefined;
2050
+ texture?: {
2051
+ url: string;
2052
+ repeat?: [number, number] | undefined;
2053
+ scale?: number | undefined;
2054
+ } | undefined;
2055
+ } | undefined;
2056
+ materialPreset?: string | undefined;
2057
+ glassMaterial?: {
2058
+ id?: string | undefined;
2059
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2060
+ properties?: {
2061
+ color: string;
2062
+ roughness: number;
2063
+ metalness: number;
2064
+ opacity: number;
2065
+ transparent: boolean;
2066
+ side: "front" | "back" | "double";
2067
+ } | undefined;
2068
+ texture?: {
2069
+ url: string;
2070
+ repeat?: [number, number] | undefined;
2071
+ scale?: number | undefined;
2072
+ } | undefined;
2073
+ } | undefined;
2074
+ glassMaterialPreset?: string | undefined;
2075
+ roofSegmentId?: string | undefined;
2076
+ surfaceNormal?: [number, number, number] | undefined;
2077
+ } | {
2078
+ object: "node";
2079
+ parentId: string | null;
2080
+ visible: boolean;
2081
+ metadata: import("zod").JSONType;
2082
+ id: `dormer_${string}`;
2083
+ type: "dormer";
2084
+ position: [number, number, number];
2085
+ rotation: number;
2086
+ width: number;
2087
+ depth: number;
2088
+ height: number;
2089
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
2090
+ roofHeight: number;
2091
+ wallSkirtHeight: number;
2092
+ windowWidth: number;
2093
+ windowHeight: number;
2094
+ windowOffsetX: number;
2095
+ windowOffsetY: number;
2096
+ windowFrameThickness: number;
2097
+ windowFrameDepth: number;
2098
+ windowColumns: number;
2099
+ windowRows: number;
2100
+ windowDividerThickness: number;
2101
+ windowShape: "rectangle" | "rounded" | "arch";
2102
+ windowArchHeight: number;
2103
+ windowCornerRadii: [number, number, number, number];
2104
+ windowSill: boolean;
2105
+ windowSillDepth: number;
2106
+ windowSillThickness: number;
2107
+ name?: string | undefined;
2108
+ camera?: {
2109
+ position: [number, number, number];
2110
+ target: [number, number, number];
2111
+ mode: "perspective" | "orthographic";
2112
+ fov?: number | undefined;
2113
+ zoom?: number | undefined;
2114
+ } | undefined;
2115
+ material?: {
2116
+ id?: string | undefined;
2117
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2118
+ properties?: {
2119
+ color: string;
2120
+ roughness: number;
2121
+ metalness: number;
2122
+ opacity: number;
2123
+ transparent: boolean;
2124
+ side: "front" | "back" | "double";
2125
+ } | undefined;
2126
+ texture?: {
2127
+ url: string;
2128
+ repeat?: [number, number] | undefined;
2129
+ scale?: number | undefined;
2130
+ } | undefined;
2131
+ } | undefined;
2132
+ materialPreset?: string | undefined;
2133
+ topMaterial?: {
2134
+ id?: string | undefined;
2135
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2136
+ properties?: {
2137
+ color: string;
2138
+ roughness: number;
2139
+ metalness: number;
2140
+ opacity: number;
2141
+ transparent: boolean;
2142
+ side: "front" | "back" | "double";
2143
+ } | undefined;
2144
+ texture?: {
2145
+ url: string;
2146
+ repeat?: [number, number] | undefined;
2147
+ scale?: number | undefined;
2148
+ } | undefined;
2149
+ } | undefined;
2150
+ topMaterialPreset?: string | undefined;
2151
+ sideMaterial?: {
2152
+ id?: string | undefined;
2153
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2154
+ properties?: {
2155
+ color: string;
2156
+ roughness: number;
2157
+ metalness: number;
2158
+ opacity: number;
2159
+ transparent: boolean;
2160
+ side: "front" | "back" | "double";
2161
+ } | undefined;
2162
+ texture?: {
2163
+ url: string;
2164
+ repeat?: [number, number] | undefined;
2165
+ scale?: number | undefined;
2166
+ } | undefined;
2167
+ } | undefined;
2168
+ sideMaterialPreset?: string | undefined;
2169
+ wallMaterial?: {
2170
+ id?: string | undefined;
2171
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2172
+ properties?: {
2173
+ color: string;
2174
+ roughness: number;
2175
+ metalness: number;
2176
+ opacity: number;
2177
+ transparent: boolean;
2178
+ side: "front" | "back" | "double";
2179
+ } | undefined;
2180
+ texture?: {
2181
+ url: string;
2182
+ repeat?: [number, number] | undefined;
2183
+ scale?: number | undefined;
2184
+ } | undefined;
2185
+ } | undefined;
2186
+ wallMaterialPreset?: string | undefined;
2187
+ roofSegmentId?: string | undefined;
2188
+ } | {
2189
+ object: "node";
2190
+ parentId: string | null;
2191
+ visible: boolean;
2192
+ metadata: import("zod").JSONType;
2193
+ id: `downspout_${string}`;
2194
+ type: "downspout";
2195
+ materialPreset: string;
2196
+ length: number;
2197
+ diameter: number;
2198
+ standoff: number;
2199
+ shape: "round" | "auto" | "rect";
2200
+ strapStyle: "none" | "band";
2201
+ strapSpacing: number;
2202
+ terminal: "straight" | "splash" | "kickout";
2203
+ name?: string | undefined;
2204
+ camera?: {
2205
+ position: [number, number, number];
2206
+ target: [number, number, number];
2207
+ mode: "perspective" | "orthographic";
2208
+ fov?: number | undefined;
2209
+ zoom?: number | undefined;
2210
+ } | undefined;
2211
+ material?: {
2212
+ id?: string | undefined;
2213
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
2214
+ properties?: {
2215
+ color: string;
2216
+ roughness: number;
2217
+ metalness: number;
2218
+ opacity: number;
2219
+ transparent: boolean;
2220
+ side: "front" | "back" | "double";
2221
+ } | undefined;
2222
+ texture?: {
2223
+ url: string;
2224
+ repeat?: [number, number] | undefined;
2225
+ scale?: number | undefined;
2226
+ } | undefined;
2227
+ } | undefined;
2228
+ gutterId?: string | undefined;
2229
+ outletId?: string | undefined;
2230
+ } | {
2231
+ object: "node";
2232
+ parentId: string | null;
2233
+ visible: boolean;
2234
+ metadata: import("zod").JSONType;
2235
+ id: `duct-segment_${string}`;
2236
+ type: "duct-segment";
2237
+ path: [number, number, number][];
2238
+ shape: "round" | "rect" | "oval";
2239
+ diameter: number;
2240
+ width: number;
2241
+ height: number;
2242
+ roll: number;
2243
+ ductMaterial: "spiral" | "sheet-metal" | "flex" | "duct-board";
2244
+ seamDetail: boolean;
2245
+ insulated: boolean;
2246
+ insulationR: number;
2247
+ system: "supply" | "return";
2248
+ name?: string | undefined;
2249
+ camera?: {
2250
+ position: [number, number, number];
2251
+ target: [number, number, number];
2252
+ mode: "perspective" | "orthographic";
2253
+ fov?: number | undefined;
2254
+ zoom?: number | undefined;
2255
+ } | undefined;
2256
+ slots?: Record<string, string> | undefined;
2257
+ } | {
2258
+ object: "node";
2259
+ parentId: string | null;
2260
+ visible: boolean;
2261
+ metadata: import("zod").JSONType;
2262
+ id: `duct-fitting_${string}`;
2263
+ type: "duct-fitting";
2264
+ position: [number, number, number];
2265
+ rotation: [number, number, number];
2266
+ fittingType: "elbow" | "tee" | "cross" | "reducer" | "transition";
2267
+ shape: "round" | "rect" | "oval";
2268
+ width: number;
2269
+ height: number;
2270
+ shape2: "round" | "rect" | "oval";
2271
+ width2: number;
2272
+ height2: number;
2273
+ angle: number;
2274
+ branchAngle: number;
2275
+ diameter: number;
2276
+ diameter2: number;
2277
+ ductMaterial: "sheet-metal" | "flex" | "duct-board";
2278
+ system: "supply" | "return";
2279
+ name?: string | undefined;
2280
+ camera?: {
2281
+ position: [number, number, number];
2282
+ target: [number, number, number];
2283
+ mode: "perspective" | "orthographic";
2284
+ fov?: number | undefined;
2285
+ zoom?: number | undefined;
2286
+ } | undefined;
2287
+ slots?: Record<string, string> | undefined;
2288
+ } | {
2289
+ object: "node";
2290
+ parentId: string | null;
2291
+ visible: boolean;
2292
+ metadata: import("zod").JSONType;
2293
+ id: `duct-terminal_${string}`;
2294
+ type: "duct-terminal";
2295
+ position: [number, number, number];
2296
+ rotation: number;
2297
+ terminalType: "supply-register" | "diffuser" | "return-grille";
2298
+ mount: "wall" | "ceiling" | "floor";
2299
+ width: number;
2300
+ depth: number;
2301
+ collarShape: "round" | "rect" | "oval";
2302
+ collarDiameter: number;
2303
+ collarWidth: number;
2304
+ collarHeight: number;
2305
+ name?: string | undefined;
2306
+ camera?: {
2307
+ position: [number, number, number];
2308
+ target: [number, number, number];
2309
+ mode: "perspective" | "orthographic";
2310
+ fov?: number | undefined;
2311
+ zoom?: number | undefined;
2312
+ } | undefined;
2313
+ } | {
2314
+ object: "node";
2315
+ parentId: string | null;
2316
+ visible: boolean;
2317
+ metadata: import("zod").JSONType;
2318
+ id: `hvac-equipment_${string}`;
2319
+ type: "hvac-equipment";
2320
+ position: [number, number, number];
2321
+ rotation: number;
2322
+ equipmentType: "furnace" | "air-handler" | "condenser";
2323
+ width: number;
2324
+ depth: number;
2325
+ height: number;
2326
+ supplyShape: "round" | "rect" | "oval";
2327
+ returnShape: "round" | "rect" | "oval";
2328
+ supplyDiameter: number;
2329
+ returnDiameter: number;
2330
+ supplyWidth: number;
2331
+ supplyHeight: number;
2332
+ returnWidth: number;
2333
+ returnHeight: number;
2334
+ name?: string | undefined;
2335
+ camera?: {
2336
+ position: [number, number, number];
2337
+ target: [number, number, number];
2338
+ mode: "perspective" | "orthographic";
2339
+ fov?: number | undefined;
2340
+ zoom?: number | undefined;
2341
+ } | undefined;
2342
+ } | {
2343
+ object: "node";
2344
+ parentId: string | null;
2345
+ visible: boolean;
2346
+ metadata: import("zod").JSONType;
2347
+ id: `lineset_${string}`;
2348
+ type: "lineset";
2349
+ path: [number, number, number][];
2350
+ suctionDiameter: number;
2351
+ liquidDiameter: number;
2352
+ insulated: boolean;
2353
+ name?: string | undefined;
2354
+ camera?: {
2355
+ position: [number, number, number];
2356
+ target: [number, number, number];
2357
+ mode: "perspective" | "orthographic";
2358
+ fov?: number | undefined;
2359
+ zoom?: number | undefined;
2360
+ } | undefined;
2361
+ } | {
2362
+ object: "node";
2363
+ parentId: string | null;
2364
+ visible: boolean;
2365
+ metadata: import("zod").JSONType;
2366
+ id: `liquid-line_${string}`;
2367
+ type: "liquid-line";
2368
+ path: [number, number, number][];
2369
+ diameter: number;
2370
+ name?: string | undefined;
2371
+ camera?: {
2372
+ position: [number, number, number];
2373
+ target: [number, number, number];
2374
+ mode: "perspective" | "orthographic";
2375
+ fov?: number | undefined;
2376
+ zoom?: number | undefined;
2377
+ } | undefined;
2378
+ } | {
2379
+ object: "node";
2380
+ parentId: string | null;
2381
+ visible: boolean;
2382
+ metadata: import("zod").JSONType;
2383
+ id: `pipe-segment_${string}`;
2384
+ type: "pipe-segment";
2385
+ path: [number, number, number][];
2386
+ diameter: number;
2387
+ pipeMaterial: "pvc" | "abs" | "cast-iron";
2388
+ system: "waste" | "vent";
2389
+ name?: string | undefined;
2390
+ camera?: {
2391
+ position: [number, number, number];
2392
+ target: [number, number, number];
2393
+ mode: "perspective" | "orthographic";
2394
+ fov?: number | undefined;
2395
+ zoom?: number | undefined;
2396
+ } | undefined;
2397
+ } | {
2398
+ object: "node";
2399
+ parentId: string | null;
2400
+ visible: boolean;
2401
+ metadata: import("zod").JSONType;
2402
+ id: `pipe-fitting_${string}`;
2403
+ type: "pipe-fitting";
2404
+ position: [number, number, number];
2405
+ rotation: [number, number, number];
2406
+ fittingType: "elbow" | "cross" | "wye" | "sanitary-tee";
2407
+ angle: number;
2408
+ diameter: number;
2409
+ diameter2: number;
2410
+ pipeMaterial: "pvc" | "abs" | "cast-iron";
2411
+ system: "waste" | "vent";
2412
+ name?: string | undefined;
2413
+ camera?: {
2414
+ position: [number, number, number];
2415
+ target: [number, number, number];
2416
+ mode: "perspective" | "orthographic";
2417
+ fov?: number | undefined;
2418
+ zoom?: number | undefined;
2419
+ } | undefined;
2420
+ } | {
2421
+ object: "node";
2422
+ parentId: string | null;
2423
+ visible: boolean;
2424
+ metadata: import("zod").JSONType;
2425
+ id: `pipe-trap_${string}`;
2426
+ type: "pipe-trap";
2427
+ position: [number, number, number];
2428
+ rotation: number;
2429
+ diameter: number;
2430
+ pipeMaterial: "pvc" | "abs" | "cast-iron";
2431
+ armLengthM: number;
2432
+ name?: string | undefined;
2433
+ camera?: {
2434
+ position: [number, number, number];
2435
+ target: [number, number, number];
2436
+ mode: "perspective" | "orthographic";
2437
+ fov?: number | undefined;
2438
+ zoom?: number | undefined;
2439
+ } | undefined;
2440
+ }>;
2441
+ export declare function createSurfaceOpeningPreviewController(): {
2442
+ previewSurfaceIds: Set<`bvent_${string}` | `elevator_${string}` | `item_${string}` | `ceiling_${string}` | `column_${string}` | `fence_${string}` | `guide_${string}` | `site_${string}` | `building_${string}` | `level_${string}` | `wall_${string}` | `door_${string}` | `window_${string}` | `zone_${string}` | `slab_${string}` | `roof_${string}` | `rseg_${string}` | `stair_${string}` | `sseg_${string}` | `scan_${string}` | `measurement_${string}` | `spawn_${string}` | `shelf_${string}` | `cabinet_${string}` | `cabinet-module_${string}` | `rvent_${string}` | `tvent_${string}` | `cupola_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `chimney_${string}` | `solarpanel_${string}` | `skylight_${string}` | `dormer_${string}` | `downspout_${string}` | `duct-segment_${string}` | `duct-fitting_${string}` | `duct-terminal_${string}` | `hvac-equipment_${string}` | `lineset_${string}` | `liquid-line_${string}` | `pipe-segment_${string}` | `pipe-fitting_${string}` | `pipe-trap_${string}`>;
2443
+ apply(updates: SurfaceOpeningUpdate[]): void;
2444
+ clear(): void;
2445
+ };
2446
+ export {};
2447
+ //# sourceMappingURL=stair-opening-preview.d.ts.map