@pascal-app/core 0.7.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (318) hide show
  1. package/dist/events/bus.d.ts +47 -18
  2. package/dist/events/bus.d.ts.map +1 -1
  3. package/dist/events/bus.js +1 -1
  4. package/dist/hooks/scene-registry/scene-registry.d.ts +6 -22
  5. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  6. package/dist/hooks/scene-registry/scene-registry.js +33 -26
  7. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +14 -0
  8. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -0
  9. package/dist/hooks/spatial-grid/floor-placed-elevation.js +51 -0
  10. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +2 -0
  11. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +1 -0
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +273 -0
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +13 -2
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  15. package/dist/hooks/spatial-grid/spatial-grid-manager.js +95 -9
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +28 -1
  17. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  18. package/dist/hooks/spatial-grid/spatial-grid-sync.js +91 -18
  19. package/dist/index.d.ts +22 -4
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +19 -2
  22. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  23. package/dist/lib/polygon-relations.d.ts +10 -0
  24. package/dist/lib/polygon-relations.d.ts.map +1 -0
  25. package/dist/lib/polygon-relations.js +73 -0
  26. package/dist/lib/space-detection-pause.test.d.ts +2 -0
  27. package/dist/lib/space-detection-pause.test.d.ts.map +1 -0
  28. package/dist/lib/space-detection-pause.test.js +42 -0
  29. package/dist/lib/space-detection.d.ts +30 -1
  30. package/dist/lib/space-detection.d.ts.map +1 -1
  31. package/dist/lib/space-detection.js +222 -41
  32. package/dist/lib/space-detection.test.d.ts +2 -0
  33. package/dist/lib/space-detection.test.d.ts.map +1 -0
  34. package/dist/lib/space-detection.test.js +77 -0
  35. package/dist/material-library.d.ts +1 -1
  36. package/dist/material-library.d.ts.map +1 -1
  37. package/dist/material-library.js +1957 -141
  38. package/dist/registry/__bench__/relations-resolver.bench.d.ts +15 -0
  39. package/dist/registry/__bench__/relations-resolver.bench.d.ts.map +1 -0
  40. package/dist/registry/__bench__/relations-resolver.bench.js +170 -0
  41. package/dist/registry/handles.d.ts +321 -0
  42. package/dist/registry/handles.d.ts.map +1 -0
  43. package/dist/registry/handles.js +24 -0
  44. package/dist/registry/index.d.ts +7 -0
  45. package/dist/registry/index.d.ts.map +1 -0
  46. package/dist/registry/index.js +4 -0
  47. package/dist/registry/registry.d.ts +93 -0
  48. package/dist/registry/registry.d.ts.map +1 -0
  49. package/dist/registry/registry.js +201 -0
  50. package/dist/registry/registry.test.d.ts +2 -0
  51. package/dist/registry/registry.test.d.ts.map +1 -0
  52. package/dist/registry/registry.test.js +183 -0
  53. package/dist/registry/relations-resolver.d.ts +42 -0
  54. package/dist/registry/relations-resolver.d.ts.map +1 -0
  55. package/dist/registry/relations-resolver.js +77 -0
  56. package/dist/registry/relations-resolver.test.d.ts +2 -0
  57. package/dist/registry/relations-resolver.test.d.ts.map +1 -0
  58. package/dist/registry/relations-resolver.test.js +183 -0
  59. package/dist/registry/scene-api.d.ts +44 -0
  60. package/dist/registry/scene-api.d.ts.map +1 -0
  61. package/dist/registry/scene-api.js +111 -0
  62. package/dist/registry/scene-api.test.d.ts +2 -0
  63. package/dist/registry/scene-api.test.d.ts.map +1 -0
  64. package/dist/registry/scene-api.test.js +183 -0
  65. package/dist/registry/subtree.d.ts +67 -0
  66. package/dist/registry/subtree.d.ts.map +1 -0
  67. package/dist/registry/subtree.js +119 -0
  68. package/dist/registry/subtree.test.d.ts +2 -0
  69. package/dist/registry/subtree.test.d.ts.map +1 -0
  70. package/dist/registry/subtree.test.js +133 -0
  71. package/dist/registry/types.d.ts +1420 -0
  72. package/dist/registry/types.d.ts.map +1 -0
  73. package/dist/registry/types.js +1 -0
  74. package/dist/schema/asset-url.test.js +0 -4
  75. package/dist/schema/index.d.ts +17 -2
  76. package/dist/schema/index.d.ts.map +1 -1
  77. package/dist/schema/index.js +17 -3
  78. package/dist/schema/material.d.ts +12 -2
  79. package/dist/schema/material.d.ts.map +1 -1
  80. package/dist/schema/material.js +10 -0
  81. package/dist/schema/nodes/box-vent.d.ts +74 -0
  82. package/dist/schema/nodes/box-vent.d.ts.map +1 -0
  83. package/dist/schema/nodes/box-vent.js +63 -0
  84. package/dist/schema/nodes/building.d.ts +1 -1
  85. package/dist/schema/nodes/building.d.ts.map +1 -1
  86. package/dist/schema/nodes/building.js +3 -2
  87. package/dist/schema/nodes/ceiling.d.ts +3 -1
  88. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  89. package/dist/schema/nodes/ceiling.js +1 -1
  90. package/dist/schema/nodes/chimney.d.ts +158 -0
  91. package/dist/schema/nodes/chimney.d.ts.map +1 -0
  92. package/dist/schema/nodes/chimney.js +67 -0
  93. package/dist/schema/nodes/column.d.ts +598 -6
  94. package/dist/schema/nodes/column.d.ts.map +1 -1
  95. package/dist/schema/nodes/column.js +586 -6
  96. package/dist/schema/nodes/cupola.d.ts +66 -0
  97. package/dist/schema/nodes/cupola.d.ts.map +1 -0
  98. package/dist/schema/nodes/cupola.js +28 -0
  99. package/dist/schema/nodes/door.d.ts +1 -1
  100. package/dist/schema/nodes/dormer.d.ts +228 -0
  101. package/dist/schema/nodes/dormer.d.ts.map +1 -0
  102. package/dist/schema/nodes/dormer.js +119 -0
  103. package/dist/schema/nodes/downspout.d.ts +75 -0
  104. package/dist/schema/nodes/downspout.d.ts.map +1 -0
  105. package/dist/schema/nodes/downspout.js +63 -0
  106. package/dist/schema/nodes/elevator.d.ts +105 -0
  107. package/dist/schema/nodes/elevator.d.ts.map +1 -0
  108. package/dist/schema/nodes/elevator.js +54 -0
  109. package/dist/schema/nodes/eyebrow-vent.d.ts +68 -0
  110. package/dist/schema/nodes/eyebrow-vent.d.ts.map +1 -0
  111. package/dist/schema/nodes/eyebrow-vent.js +40 -0
  112. package/dist/schema/nodes/fence.d.ts +3 -2
  113. package/dist/schema/nodes/fence.d.ts.map +1 -1
  114. package/dist/schema/nodes/fence.js +4 -2
  115. package/dist/schema/nodes/gutter.d.ts +84 -0
  116. package/dist/schema/nodes/gutter.d.ts.map +1 -0
  117. package/dist/schema/nodes/gutter.js +76 -0
  118. package/dist/schema/nodes/item.d.ts +16 -0
  119. package/dist/schema/nodes/item.d.ts.map +1 -1
  120. package/dist/schema/nodes/item.js +21 -0
  121. package/dist/schema/nodes/level.d.ts +1 -1
  122. package/dist/schema/nodes/level.d.ts.map +1 -1
  123. package/dist/schema/nodes/level.js +2 -0
  124. package/dist/schema/nodes/ridge-vent.d.ts +67 -0
  125. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -0
  126. package/dist/schema/nodes/ridge-vent.js +30 -0
  127. package/dist/schema/nodes/roof-segment.d.ts +198 -4
  128. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  129. package/dist/schema/nodes/roof-segment.js +254 -3
  130. package/dist/schema/nodes/roof.d.ts +6 -6
  131. package/dist/schema/nodes/roof.d.ts.map +1 -1
  132. package/dist/schema/nodes/roof.js +9 -21
  133. package/dist/schema/nodes/shelf.d.ts +105 -0
  134. package/dist/schema/nodes/shelf.d.ts.map +1 -0
  135. package/dist/schema/nodes/shelf.js +84 -0
  136. package/dist/schema/nodes/site.d.ts +1 -116
  137. package/dist/schema/nodes/site.d.ts.map +1 -1
  138. package/dist/schema/nodes/site.js +2 -6
  139. package/dist/schema/nodes/skylight.d.ts +279 -0
  140. package/dist/schema/nodes/skylight.d.ts.map +1 -0
  141. package/dist/schema/nodes/skylight.js +152 -0
  142. package/dist/schema/nodes/slab.d.ts +3 -1
  143. package/dist/schema/nodes/slab.d.ts.map +1 -1
  144. package/dist/schema/nodes/slab.js +1 -1
  145. package/dist/schema/nodes/solar-panel.d.ts +117 -0
  146. package/dist/schema/nodes/solar-panel.d.ts.map +1 -0
  147. package/dist/schema/nodes/solar-panel.js +47 -0
  148. package/dist/schema/nodes/stair-segment.d.ts +1 -1
  149. package/dist/schema/nodes/stair.d.ts +6 -6
  150. package/dist/schema/nodes/stair.d.ts.map +1 -1
  151. package/dist/schema/nodes/stair.js +9 -7
  152. package/dist/schema/nodes/surface-hole-metadata.d.ts +2 -0
  153. package/dist/schema/nodes/surface-hole-metadata.d.ts.map +1 -1
  154. package/dist/schema/nodes/surface-hole-metadata.js +3 -1
  155. package/dist/schema/nodes/turbine-vent.d.ts +68 -0
  156. package/dist/schema/nodes/turbine-vent.d.ts.map +1 -0
  157. package/dist/schema/nodes/turbine-vent.js +41 -0
  158. package/dist/schema/nodes/wall.d.ts +3 -3
  159. package/dist/schema/nodes/window.d.ts +1 -1
  160. package/dist/schema/types.d.ts +1448 -236
  161. package/dist/schema/types.d.ts.map +1 -1
  162. package/dist/schema/types.js +26 -0
  163. package/dist/services/alignment-anchors.d.ts +100 -0
  164. package/dist/services/alignment-anchors.d.ts.map +1 -0
  165. package/dist/services/alignment-anchors.js +283 -0
  166. package/dist/services/alignment-anchors.test.d.ts +2 -0
  167. package/dist/services/alignment-anchors.test.d.ts.map +1 -0
  168. package/dist/services/alignment-anchors.test.js +383 -0
  169. package/dist/services/alignment.d.ts +126 -0
  170. package/dist/services/alignment.d.ts.map +1 -0
  171. package/dist/services/alignment.js +169 -0
  172. package/dist/services/alignment.test.d.ts +2 -0
  173. package/dist/services/alignment.test.d.ts.map +1 -0
  174. package/dist/services/alignment.test.js +92 -0
  175. package/dist/services/drag-session.d.ts +47 -0
  176. package/dist/services/drag-session.d.ts.map +1 -0
  177. package/dist/services/drag-session.js +100 -0
  178. package/dist/services/drag-session.test.d.ts +2 -0
  179. package/dist/services/drag-session.test.d.ts.map +1 -0
  180. package/dist/services/drag-session.test.js +219 -0
  181. package/dist/services/hosting.d.ts +80 -0
  182. package/dist/services/hosting.d.ts.map +1 -0
  183. package/dist/services/hosting.js +122 -0
  184. package/dist/services/hosting.test.d.ts +2 -0
  185. package/dist/services/hosting.test.d.ts.map +1 -0
  186. package/dist/services/hosting.test.js +199 -0
  187. package/dist/services/index.d.ts +7 -0
  188. package/dist/services/index.d.ts.map +1 -0
  189. package/dist/services/index.js +6 -0
  190. package/dist/services/movement.d.ts +48 -0
  191. package/dist/services/movement.d.ts.map +1 -0
  192. package/dist/services/movement.js +65 -0
  193. package/dist/services/movement.test.d.ts +2 -0
  194. package/dist/services/movement.test.d.ts.map +1 -0
  195. package/dist/services/movement.test.js +133 -0
  196. package/dist/services/single-undo-dance.test.d.ts +2 -0
  197. package/dist/services/single-undo-dance.test.d.ts.map +1 -0
  198. package/dist/services/single-undo-dance.test.js +210 -0
  199. package/dist/services/snap.d.ts +72 -0
  200. package/dist/services/snap.d.ts.map +1 -0
  201. package/dist/services/snap.js +120 -0
  202. package/dist/services/snap.test.d.ts +2 -0
  203. package/dist/services/snap.test.d.ts.map +1 -0
  204. package/dist/services/snap.test.js +95 -0
  205. package/dist/solar-panel-presets.d.ts +17 -0
  206. package/dist/solar-panel-presets.d.ts.map +1 -0
  207. package/dist/solar-panel-presets.js +43 -0
  208. package/dist/store/actions/node-actions.d.ts +14 -2
  209. package/dist/store/actions/node-actions.d.ts.map +1 -1
  210. package/dist/store/actions/node-actions.js +499 -20
  211. package/dist/store/actions/node-mutation-sanitize.test.d.ts +2 -0
  212. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +1 -0
  213. package/dist/store/actions/node-mutation-sanitize.test.js +147 -0
  214. package/dist/store/actions/reparent.test.d.ts +2 -0
  215. package/dist/store/actions/reparent.test.d.ts.map +1 -0
  216. package/dist/store/actions/reparent.test.js +212 -0
  217. package/dist/store/use-interactive.d.ts +39 -0
  218. package/dist/store/use-interactive.d.ts.map +1 -1
  219. package/dist/store/use-interactive.js +75 -0
  220. package/dist/store/use-live-node-overrides.d.ts +22 -0
  221. package/dist/store/use-live-node-overrides.d.ts.map +1 -0
  222. package/dist/store/use-live-node-overrides.js +59 -0
  223. package/dist/store/use-scene-elevator-migration.test.d.ts +2 -0
  224. package/dist/store/use-scene-elevator-migration.test.d.ts.map +1 -0
  225. package/dist/store/use-scene-elevator-migration.test.js +109 -0
  226. package/dist/store/use-scene.d.ts +11 -0
  227. package/dist/store/use-scene.d.ts.map +1 -1
  228. package/dist/store/use-scene.js +207 -11
  229. package/dist/systems/elevator/elevator-dispatch.d.ts +12 -0
  230. package/dist/systems/elevator/elevator-dispatch.d.ts.map +1 -0
  231. package/dist/systems/elevator/elevator-dispatch.js +57 -0
  232. package/dist/systems/elevator/elevator-geometry.d.ts +15 -0
  233. package/dist/systems/elevator/elevator-geometry.d.ts.map +1 -0
  234. package/dist/systems/elevator/elevator-geometry.js +50 -0
  235. package/dist/systems/elevator/elevator-opening-sync.d.ts +6 -0
  236. package/dist/systems/elevator/elevator-opening-sync.d.ts.map +1 -0
  237. package/dist/systems/elevator/elevator-opening-sync.js +218 -0
  238. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +2 -0
  239. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +1 -0
  240. package/dist/systems/elevator/elevator-opening-sync.test.js +146 -0
  241. package/dist/systems/elevator/elevator-opening-system.d.ts +2 -0
  242. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -0
  243. package/dist/systems/elevator/elevator-opening-system.js +48 -0
  244. package/dist/systems/elevator/elevator-runtime-system.d.ts +2 -0
  245. package/dist/systems/elevator/elevator-runtime-system.d.ts.map +1 -0
  246. package/dist/systems/elevator/elevator-runtime-system.js +8 -0
  247. package/dist/systems/elevator/elevator-runtime.d.ts +18 -0
  248. package/dist/systems/elevator/elevator-runtime.d.ts.map +1 -0
  249. package/dist/systems/elevator/elevator-runtime.js +225 -0
  250. package/dist/systems/elevator/elevator-runtime.test.d.ts +2 -0
  251. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +1 -0
  252. package/dist/systems/elevator/elevator-runtime.test.js +64 -0
  253. package/dist/systems/elevator/elevator-service.d.ts +19 -0
  254. package/dist/systems/elevator/elevator-service.d.ts.map +1 -0
  255. package/dist/systems/elevator/elevator-service.js +111 -0
  256. package/dist/systems/stair/stair-footprint.d.ts +44 -0
  257. package/dist/systems/stair/stair-footprint.d.ts.map +1 -0
  258. package/dist/systems/stair/stair-footprint.js +168 -0
  259. package/dist/systems/stair/stair-opening-preview.d.ts +1777 -0
  260. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -0
  261. package/dist/systems/stair/stair-opening-preview.js +93 -0
  262. package/dist/systems/stair/stair-opening-preview.test.d.ts +2 -0
  263. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +1 -0
  264. package/dist/systems/stair/stair-opening-preview.test.js +80 -0
  265. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  266. package/dist/systems/stair/stair-opening-sync.js +183 -185
  267. package/dist/systems/stair/stair-opening-sync.test.js +385 -4
  268. package/dist/systems/stair/stair-opening-system.d.ts +2 -0
  269. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -0
  270. package/dist/systems/stair/stair-opening-system.js +104 -0
  271. package/dist/systems/wall/wall-curve.d.ts +1 -1
  272. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  273. package/dist/systems/wall/wall-curve.js +1 -1
  274. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  275. package/dist/systems/wall/wall-mitering.js +2 -6
  276. package/dist/systems/wall/wall-move.d.ts +48 -0
  277. package/dist/systems/wall/wall-move.d.ts.map +1 -0
  278. package/dist/systems/wall/wall-move.js +193 -0
  279. package/dist/utils/clone-scene-graph.d.ts +6 -4
  280. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  281. package/dist/utils/clone-scene-graph.js +6 -4
  282. package/dist/utils/clone-scene-graph.test.d.ts +2 -0
  283. package/dist/utils/clone-scene-graph.test.d.ts.map +1 -0
  284. package/dist/utils/clone-scene-graph.test.js +59 -0
  285. package/dist/validation/validate-build-json.d.ts +43 -0
  286. package/dist/validation/validate-build-json.d.ts.map +1 -0
  287. package/dist/validation/validate-build-json.js +227 -0
  288. package/package.json +11 -3
  289. package/dist/materials.d.ts +0 -10
  290. package/dist/materials.d.ts.map +0 -1
  291. package/dist/materials.js +0 -22
  292. package/dist/systems/ceiling/ceiling-system.d.ts +0 -8
  293. package/dist/systems/ceiling/ceiling-system.d.ts.map +0 -1
  294. package/dist/systems/ceiling/ceiling-system.js +0 -92
  295. package/dist/systems/door/door-system.d.ts +0 -2
  296. package/dist/systems/door/door-system.d.ts.map +0 -1
  297. package/dist/systems/door/door-system.js +0 -195
  298. package/dist/systems/fence/fence-system.d.ts +0 -2
  299. package/dist/systems/fence/fence-system.d.ts.map +0 -1
  300. package/dist/systems/fence/fence-system.js +0 -187
  301. package/dist/systems/item/item-system.d.ts +0 -2
  302. package/dist/systems/item/item-system.d.ts.map +0 -1
  303. package/dist/systems/item/item-system.js +0 -48
  304. package/dist/systems/roof/roof-system.d.ts +0 -16
  305. package/dist/systems/roof/roof-system.d.ts.map +0 -1
  306. package/dist/systems/roof/roof-system.js +0 -797
  307. package/dist/systems/slab/slab-system.d.ts +0 -8
  308. package/dist/systems/slab/slab-system.d.ts.map +0 -1
  309. package/dist/systems/slab/slab-system.js +0 -214
  310. package/dist/systems/stair/stair-system.d.ts +0 -2
  311. package/dist/systems/stair/stair-system.d.ts.map +0 -1
  312. package/dist/systems/stair/stair-system.js +0 -776
  313. package/dist/systems/wall/wall-system.d.ts +0 -12
  314. package/dist/systems/wall/wall-system.d.ts.map +0 -1
  315. package/dist/systems/wall/wall-system.js +0 -455
  316. package/dist/systems/window/window-system.d.ts +0 -2
  317. package/dist/systems/window/window-system.d.ts.map +0 -1
  318. package/dist/systems/window/window-system.js +0 -131
@@ -0,0 +1,1777 @@
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
+ shaftWidth?: number | undefined;
110
+ shaftDepth?: number | undefined;
111
+ servedLevelIds?: string[] | undefined;
112
+ } | {
113
+ object: "node";
114
+ parentId: string | null;
115
+ visible: boolean;
116
+ metadata: import("zod").JSONType;
117
+ id: `item_${string}`;
118
+ type: "item";
119
+ position: [number, number, number];
120
+ rotation: [number, number, number];
121
+ scale: [number, number, number];
122
+ children: `item_${string}`[];
123
+ asset: {
124
+ id: string;
125
+ category: string;
126
+ name: string;
127
+ thumbnail: string;
128
+ source: "library" | "community" | "mine";
129
+ src: string;
130
+ dimensions: [number, number, number];
131
+ offset: [number, number, number];
132
+ rotation: [number, number, number];
133
+ scale: [number, number, number];
134
+ floorPlanUrl?: string | undefined;
135
+ isDraft?: boolean | undefined;
136
+ attachTo?: "wall" | "ceiling" | "wall-side" | undefined;
137
+ recessed?: boolean | undefined;
138
+ tags?: string[] | undefined;
139
+ functionTags?: string[] | undefined;
140
+ surface?: {
141
+ height: number;
142
+ } | undefined;
143
+ interactive?: {
144
+ controls: ({
145
+ kind: "toggle";
146
+ label?: string | undefined;
147
+ default?: boolean | undefined;
148
+ } | {
149
+ kind: "slider";
150
+ label: string;
151
+ min: number;
152
+ max: number;
153
+ step: number;
154
+ displayMode: "slider" | "stepper" | "dial";
155
+ unit?: string | undefined;
156
+ default?: number | undefined;
157
+ } | {
158
+ kind: "temperature";
159
+ label: string;
160
+ min: number;
161
+ max: number;
162
+ unit: "C" | "F";
163
+ default?: number | undefined;
164
+ })[];
165
+ effects: ({
166
+ kind: "animation";
167
+ clips: {
168
+ on?: string | undefined;
169
+ off?: string | undefined;
170
+ loop?: string | undefined;
171
+ };
172
+ } | {
173
+ kind: "light";
174
+ color: string;
175
+ intensityRange: [number, number];
176
+ offset: [number, number, number];
177
+ distance?: number | undefined;
178
+ })[];
179
+ } | undefined;
180
+ };
181
+ name?: string | undefined;
182
+ camera?: {
183
+ position: [number, number, number];
184
+ target: [number, number, number];
185
+ mode: "perspective" | "orthographic";
186
+ fov?: number | undefined;
187
+ zoom?: number | undefined;
188
+ } | undefined;
189
+ side?: "front" | "back" | undefined;
190
+ wallId?: string | undefined;
191
+ wallT?: number | undefined;
192
+ collectionIds?: `collection_${string}`[] | undefined;
193
+ } | {
194
+ object: "node";
195
+ parentId: string | null;
196
+ visible: boolean;
197
+ metadata: import("zod").JSONType;
198
+ id: `ceiling_${string}`;
199
+ type: "ceiling";
200
+ children: `item_${string}`[];
201
+ polygon: [number, number][];
202
+ holes: [number, number][][];
203
+ holeMetadata: {
204
+ source: "stair" | "elevator" | "manual";
205
+ stairId?: string | undefined;
206
+ elevatorId?: string | undefined;
207
+ }[];
208
+ height: number;
209
+ autoFromWalls: boolean;
210
+ name?: string | undefined;
211
+ camera?: {
212
+ position: [number, number, number];
213
+ target: [number, number, number];
214
+ mode: "perspective" | "orthographic";
215
+ fov?: number | undefined;
216
+ zoom?: number | undefined;
217
+ } | undefined;
218
+ material?: {
219
+ id?: string | undefined;
220
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
221
+ properties?: {
222
+ color: string;
223
+ roughness: number;
224
+ metalness: number;
225
+ opacity: number;
226
+ transparent: boolean;
227
+ side: "front" | "back" | "double";
228
+ } | undefined;
229
+ texture?: {
230
+ url: string;
231
+ repeat?: [number, number] | undefined;
232
+ scale?: number | undefined;
233
+ } | undefined;
234
+ } | undefined;
235
+ materialPreset?: string | undefined;
236
+ } | {
237
+ object: "node";
238
+ parentId: string | null;
239
+ visible: boolean;
240
+ metadata: import("zod").JSONType;
241
+ id: `column_${string}`;
242
+ type: "column";
243
+ position: [number, number, number];
244
+ rotation: number;
245
+ style: "plain" | "faceted" | "fluted" | "lathe-turned" | "dravidian-carved" | "cluster";
246
+ crossSection: "round" | "square" | "rectangular" | "octagonal" | "sixteen-sided";
247
+ height: number;
248
+ radius: number;
249
+ width: number;
250
+ depth: number;
251
+ edgeSoftness: number;
252
+ baseHeight: number;
253
+ capitalHeight: number;
254
+ shaftProfile: "straight" | "tapered" | "bulged" | "baluster" | "hourglass";
255
+ shaftTaper: number;
256
+ shaftBulge: number;
257
+ shaftStartScale: number;
258
+ shaftEndScale: number;
259
+ shaftSegmentCount: number;
260
+ shaftTwistStep: number;
261
+ shaftCornerRadius: number;
262
+ shaftDetail: "fluted" | "lathe-turned" | "none" | "spiral" | "panelled";
263
+ baseStyle: "none" | "simple-square" | "round-rings" | "square-plinth" | "stepped-square" | "lotus" | "ribbed-lotus" | "panelled-pedestal";
264
+ baseWidthScale: number;
265
+ baseDepthScale: number;
266
+ baseTierCount: number;
267
+ baseStepSpread: number;
268
+ basePlinthHeightRatio: number;
269
+ baseRoundBandScale: number;
270
+ baseNeckScale: number;
271
+ baseRoundBandCount: number;
272
+ baseRibCount: number;
273
+ baseCarvingLevel: number;
274
+ basePanelInset: number;
275
+ capitalStyle: "none" | "simple" | "simple-slab" | "rounded" | "stepped" | "doric" | "volute" | "ionic-volute" | "leaf-carved" | "corinthian-leaf" | "south-indian-bracket" | "wood-bracket";
276
+ capitalWidthScale: number;
277
+ capitalDepthScale: number;
278
+ capitalTierCount: number;
279
+ capitalStepSpread: number;
280
+ capitalBandCount: number;
281
+ voluteSize: number;
282
+ voluteCount: number;
283
+ leafCount: number;
284
+ leafRows: number;
285
+ bracketDepth: number;
286
+ bracketTierCount: number;
287
+ pendantCount: number;
288
+ capitalCarvingLevel: number;
289
+ ringCount: number;
290
+ ringPlacement: "ends" | "even" | "top" | "bottom";
291
+ ringThickness: number;
292
+ ringSpread: number;
293
+ fluteCount: number;
294
+ fluteDepth: number;
295
+ fluteWidth: number;
296
+ spiralTwist: number;
297
+ spiralRibCount: number;
298
+ panelCount: number;
299
+ panelInsetDepth: number;
300
+ panelShape: "rectangle" | "arched" | "diamond";
301
+ latheRingCount: number;
302
+ latheRingSpacing: "ends" | "even" | "top" | "bottom";
303
+ carvingLevel: number;
304
+ carvingPlacement: "shaft" | "base" | "capital" | "all";
305
+ lowerBandEnabled: boolean;
306
+ lowerBandHeight: number;
307
+ lowerBandCarvingLevel: number;
308
+ dentilCount: number;
309
+ beadCount: number;
310
+ supportStyle: "vertical" | "a-frame" | "y-frame" | "v-frame" | "x-brace" | "k-brace" | "single-strut" | "tripod" | "trestle" | "portal-frame" | "box-frame";
311
+ braceWidth: number;
312
+ braceDepth: number;
313
+ braceBottomSpread: number;
314
+ braceTopSpread: number;
315
+ bracePlateEnabled: boolean;
316
+ name?: string | undefined;
317
+ camera?: {
318
+ position: [number, number, number];
319
+ target: [number, number, number];
320
+ mode: "perspective" | "orthographic";
321
+ fov?: number | undefined;
322
+ zoom?: number | undefined;
323
+ } | undefined;
324
+ material?: {
325
+ id?: string | undefined;
326
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
327
+ properties?: {
328
+ color: string;
329
+ roughness: number;
330
+ metalness: number;
331
+ opacity: number;
332
+ transparent: boolean;
333
+ side: "front" | "back" | "double";
334
+ } | undefined;
335
+ texture?: {
336
+ url: string;
337
+ repeat?: [number, number] | undefined;
338
+ scale?: number | undefined;
339
+ } | undefined;
340
+ } | undefined;
341
+ materialPreset?: string | undefined;
342
+ } | {
343
+ object: "node";
344
+ parentId: string | null;
345
+ visible: boolean;
346
+ metadata: import("zod").JSONType;
347
+ id: `fence_${string}`;
348
+ type: "fence";
349
+ start: [number, number];
350
+ end: [number, number];
351
+ height: number;
352
+ thickness: number;
353
+ baseHeight: number;
354
+ postSpacing: number;
355
+ postSize: number;
356
+ topRailHeight: number;
357
+ groundClearance: number;
358
+ edgeInset: number;
359
+ baseStyle: "floating" | "grounded";
360
+ showInfill: boolean;
361
+ color: string;
362
+ style: "slat" | "rail" | "privacy";
363
+ name?: string | undefined;
364
+ camera?: {
365
+ position: [number, number, number];
366
+ target: [number, number, number];
367
+ mode: "perspective" | "orthographic";
368
+ fov?: number | undefined;
369
+ zoom?: number | undefined;
370
+ } | undefined;
371
+ material?: {
372
+ id?: string | undefined;
373
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
374
+ properties?: {
375
+ color: string;
376
+ roughness: number;
377
+ metalness: number;
378
+ opacity: number;
379
+ transparent: boolean;
380
+ side: "front" | "back" | "double";
381
+ } | undefined;
382
+ texture?: {
383
+ url: string;
384
+ repeat?: [number, number] | undefined;
385
+ scale?: number | undefined;
386
+ } | undefined;
387
+ } | undefined;
388
+ materialPreset?: string | undefined;
389
+ curveOffset?: number | undefined;
390
+ } | {
391
+ object: "node";
392
+ parentId: string | null;
393
+ visible: boolean;
394
+ metadata: import("zod").JSONType;
395
+ id: `guide_${string}`;
396
+ type: "guide";
397
+ url: string;
398
+ position: [number, number, number];
399
+ rotation: [number, number, number];
400
+ scale: number;
401
+ opacity: number;
402
+ scaleReference: {
403
+ start: [number, number];
404
+ end: [number, number];
405
+ realLengthMeters: number;
406
+ measuredLengthUnits: number;
407
+ metersPerUnit: number;
408
+ label: string;
409
+ } | null;
410
+ name?: string | undefined;
411
+ camera?: {
412
+ position: [number, number, number];
413
+ target: [number, number, number];
414
+ mode: "perspective" | "orthographic";
415
+ fov?: number | undefined;
416
+ zoom?: number | undefined;
417
+ } | undefined;
418
+ } | {
419
+ object: "node";
420
+ parentId: string | null;
421
+ visible: boolean;
422
+ metadata: import("zod").JSONType;
423
+ id: `rseg_${string}`;
424
+ type: "roof-segment";
425
+ position: [number, number, number];
426
+ rotation: number;
427
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
428
+ width: number;
429
+ depth: number;
430
+ wallHeight: number;
431
+ pitch: number;
432
+ wallThickness: number;
433
+ deckThickness: number;
434
+ overhang: number;
435
+ shingleThickness: number;
436
+ gambrelLowerWidthRatio: number;
437
+ gambrelLowerHeightRatio: number;
438
+ mansardSteepWidthRatio: number;
439
+ mansardSteepHeightRatio: number;
440
+ dutchHipWidthRatio: number;
441
+ dutchHipHeightRatio: number;
442
+ children: string[];
443
+ name?: string | undefined;
444
+ camera?: {
445
+ position: [number, number, number];
446
+ target: [number, number, number];
447
+ mode: "perspective" | "orthographic";
448
+ fov?: number | undefined;
449
+ zoom?: number | undefined;
450
+ } | undefined;
451
+ material?: {
452
+ id?: string | undefined;
453
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
454
+ properties?: {
455
+ color: string;
456
+ roughness: number;
457
+ metalness: number;
458
+ opacity: number;
459
+ transparent: boolean;
460
+ side: "front" | "back" | "double";
461
+ } | undefined;
462
+ texture?: {
463
+ url: string;
464
+ repeat?: [number, number] | undefined;
465
+ scale?: number | undefined;
466
+ } | undefined;
467
+ } | undefined;
468
+ materialPreset?: string | undefined;
469
+ topMaterial?: {
470
+ id?: string | undefined;
471
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
472
+ properties?: {
473
+ color: string;
474
+ roughness: number;
475
+ metalness: number;
476
+ opacity: number;
477
+ transparent: boolean;
478
+ side: "front" | "back" | "double";
479
+ } | undefined;
480
+ texture?: {
481
+ url: string;
482
+ repeat?: [number, number] | undefined;
483
+ scale?: number | undefined;
484
+ } | undefined;
485
+ } | undefined;
486
+ topMaterialPreset?: string | undefined;
487
+ edgeMaterial?: {
488
+ id?: string | undefined;
489
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
490
+ properties?: {
491
+ color: string;
492
+ roughness: number;
493
+ metalness: number;
494
+ opacity: number;
495
+ transparent: boolean;
496
+ side: "front" | "back" | "double";
497
+ } | undefined;
498
+ texture?: {
499
+ url: string;
500
+ repeat?: [number, number] | undefined;
501
+ scale?: number | undefined;
502
+ } | undefined;
503
+ } | undefined;
504
+ edgeMaterialPreset?: string | undefined;
505
+ wallMaterial?: {
506
+ id?: string | undefined;
507
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
508
+ properties?: {
509
+ color: string;
510
+ roughness: number;
511
+ metalness: number;
512
+ opacity: number;
513
+ transparent: boolean;
514
+ side: "front" | "back" | "double";
515
+ } | undefined;
516
+ texture?: {
517
+ url: string;
518
+ repeat?: [number, number] | undefined;
519
+ scale?: number | undefined;
520
+ } | undefined;
521
+ } | undefined;
522
+ wallMaterialPreset?: string | undefined;
523
+ } | {
524
+ object: "node";
525
+ parentId: string | null;
526
+ visible: boolean;
527
+ metadata: import("zod").JSONType;
528
+ id: `roof_${string}`;
529
+ type: "roof";
530
+ position: [number, number, number];
531
+ rotation: number;
532
+ children: `rseg_${string}`[];
533
+ name?: string | undefined;
534
+ camera?: {
535
+ position: [number, number, number];
536
+ target: [number, number, number];
537
+ mode: "perspective" | "orthographic";
538
+ fov?: number | undefined;
539
+ zoom?: number | undefined;
540
+ } | undefined;
541
+ material?: {
542
+ id?: string | undefined;
543
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
544
+ properties?: {
545
+ color: string;
546
+ roughness: number;
547
+ metalness: number;
548
+ opacity: number;
549
+ transparent: boolean;
550
+ side: "front" | "back" | "double";
551
+ } | undefined;
552
+ texture?: {
553
+ url: string;
554
+ repeat?: [number, number] | undefined;
555
+ scale?: number | undefined;
556
+ } | undefined;
557
+ } | undefined;
558
+ materialPreset?: string | undefined;
559
+ topMaterial?: {
560
+ id?: string | undefined;
561
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
562
+ properties?: {
563
+ color: string;
564
+ roughness: number;
565
+ metalness: number;
566
+ opacity: number;
567
+ transparent: boolean;
568
+ side: "front" | "back" | "double";
569
+ } | undefined;
570
+ texture?: {
571
+ url: string;
572
+ repeat?: [number, number] | undefined;
573
+ scale?: number | undefined;
574
+ } | undefined;
575
+ } | undefined;
576
+ topMaterialPreset?: string | undefined;
577
+ edgeMaterial?: {
578
+ id?: string | undefined;
579
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
580
+ properties?: {
581
+ color: string;
582
+ roughness: number;
583
+ metalness: number;
584
+ opacity: number;
585
+ transparent: boolean;
586
+ side: "front" | "back" | "double";
587
+ } | undefined;
588
+ texture?: {
589
+ url: string;
590
+ repeat?: [number, number] | undefined;
591
+ scale?: number | undefined;
592
+ } | undefined;
593
+ } | undefined;
594
+ edgeMaterialPreset?: string | undefined;
595
+ wallMaterial?: {
596
+ id?: string | undefined;
597
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
598
+ properties?: {
599
+ color: string;
600
+ roughness: number;
601
+ metalness: number;
602
+ opacity: number;
603
+ transparent: boolean;
604
+ side: "front" | "back" | "double";
605
+ } | undefined;
606
+ texture?: {
607
+ url: string;
608
+ repeat?: [number, number] | undefined;
609
+ scale?: number | undefined;
610
+ } | undefined;
611
+ } | undefined;
612
+ wallMaterialPreset?: string | undefined;
613
+ } | {
614
+ object: "node";
615
+ parentId: string | null;
616
+ visible: boolean;
617
+ metadata: import("zod").JSONType;
618
+ id: `scan_${string}`;
619
+ type: "scan";
620
+ url: string;
621
+ position: [number, number, number];
622
+ rotation: [number, number, number];
623
+ scale: number;
624
+ opacity: number;
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
+ } | {
634
+ object: "node";
635
+ parentId: string | null;
636
+ visible: boolean;
637
+ metadata: import("zod").JSONType;
638
+ id: `shelf_${string}`;
639
+ type: "shelf";
640
+ children: `item_${string}`[];
641
+ position: [number, number, number];
642
+ rotation: [number, number, number];
643
+ width: number;
644
+ depth: number;
645
+ thickness: number;
646
+ height: number;
647
+ style: "wall-shelf" | "bookshelf" | "open-rack" | "cubby";
648
+ rows: number;
649
+ columns: number;
650
+ withBack: boolean;
651
+ withSides: boolean;
652
+ withBottom: boolean;
653
+ bracketStyle: "minimal" | "industrial" | "hidden";
654
+ name?: string | undefined;
655
+ camera?: {
656
+ position: [number, number, number];
657
+ target: [number, number, number];
658
+ mode: "perspective" | "orthographic";
659
+ fov?: number | undefined;
660
+ zoom?: number | undefined;
661
+ } | undefined;
662
+ material?: {
663
+ id?: string | undefined;
664
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
665
+ properties?: {
666
+ color: string;
667
+ roughness: number;
668
+ metalness: number;
669
+ opacity: number;
670
+ transparent: boolean;
671
+ side: "front" | "back" | "double";
672
+ } | undefined;
673
+ texture?: {
674
+ url: string;
675
+ repeat?: [number, number] | undefined;
676
+ scale?: number | undefined;
677
+ } | undefined;
678
+ } | undefined;
679
+ materialPreset?: string | undefined;
680
+ } | {
681
+ object: "node";
682
+ parentId: string | null;
683
+ visible: boolean;
684
+ metadata: import("zod").JSONType;
685
+ id: `slab_${string}`;
686
+ type: "slab";
687
+ polygon: [number, number][];
688
+ holes: [number, number][][];
689
+ holeMetadata: {
690
+ source: "stair" | "elevator" | "manual";
691
+ stairId?: string | undefined;
692
+ elevatorId?: string | undefined;
693
+ }[];
694
+ elevation: number;
695
+ autoFromWalls: boolean;
696
+ name?: string | undefined;
697
+ camera?: {
698
+ position: [number, number, number];
699
+ target: [number, number, number];
700
+ mode: "perspective" | "orthographic";
701
+ fov?: number | undefined;
702
+ zoom?: number | undefined;
703
+ } | undefined;
704
+ material?: {
705
+ id?: string | undefined;
706
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
707
+ properties?: {
708
+ color: string;
709
+ roughness: number;
710
+ metalness: number;
711
+ opacity: number;
712
+ transparent: boolean;
713
+ side: "front" | "back" | "double";
714
+ } | undefined;
715
+ texture?: {
716
+ url: string;
717
+ repeat?: [number, number] | undefined;
718
+ scale?: number | undefined;
719
+ } | undefined;
720
+ } | undefined;
721
+ materialPreset?: string | undefined;
722
+ } | {
723
+ object: "node";
724
+ parentId: string | null;
725
+ visible: boolean;
726
+ metadata: import("zod").JSONType;
727
+ id: `spawn_${string}`;
728
+ type: "spawn";
729
+ position: [number, number, number];
730
+ rotation: number;
731
+ name?: string | undefined;
732
+ camera?: {
733
+ position: [number, number, number];
734
+ target: [number, number, number];
735
+ mode: "perspective" | "orthographic";
736
+ fov?: number | undefined;
737
+ zoom?: number | undefined;
738
+ } | undefined;
739
+ } | {
740
+ object: "node";
741
+ parentId: string | null;
742
+ visible: boolean;
743
+ metadata: import("zod").JSONType;
744
+ id: `sseg_${string}`;
745
+ type: "stair-segment";
746
+ position: [number, number, number];
747
+ rotation: number;
748
+ segmentType: "stair" | "landing";
749
+ width: number;
750
+ length: number;
751
+ height: number;
752
+ stepCount: number;
753
+ attachmentSide: "front" | "left" | "right";
754
+ fillToFloor: boolean;
755
+ thickness: number;
756
+ name?: string | undefined;
757
+ camera?: {
758
+ position: [number, number, number];
759
+ target: [number, number, number];
760
+ mode: "perspective" | "orthographic";
761
+ fov?: number | undefined;
762
+ zoom?: number | undefined;
763
+ } | undefined;
764
+ material?: {
765
+ id?: string | undefined;
766
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
767
+ properties?: {
768
+ color: string;
769
+ roughness: number;
770
+ metalness: number;
771
+ opacity: number;
772
+ transparent: boolean;
773
+ side: "front" | "back" | "double";
774
+ } | undefined;
775
+ texture?: {
776
+ url: string;
777
+ repeat?: [number, number] | undefined;
778
+ scale?: number | undefined;
779
+ } | undefined;
780
+ } | undefined;
781
+ materialPreset?: string | undefined;
782
+ } | {
783
+ object: "node";
784
+ parentId: string | null;
785
+ visible: boolean;
786
+ metadata: import("zod").JSONType;
787
+ id: `stair_${string}`;
788
+ type: "stair";
789
+ position: [number, number, number];
790
+ rotation: number;
791
+ stairType: "straight" | "spiral" | "curved";
792
+ fromLevelId: string | null;
793
+ toLevelId: string | null;
794
+ slabOpeningMode: "none" | "destination";
795
+ openingOffset: number;
796
+ width: number;
797
+ totalRise: number;
798
+ stepCount: number;
799
+ thickness: number;
800
+ fillToFloor: boolean;
801
+ innerRadius: number;
802
+ sweepAngle: number;
803
+ topLandingMode: "none" | "integrated";
804
+ topLandingDepth: number;
805
+ showCenterColumn: boolean;
806
+ showStepSupports: boolean;
807
+ railingMode: "none" | "left" | "right" | "both";
808
+ railingHeight: number;
809
+ children: `sseg_${string}`[];
810
+ name?: string | undefined;
811
+ camera?: {
812
+ position: [number, number, number];
813
+ target: [number, number, number];
814
+ mode: "perspective" | "orthographic";
815
+ fov?: number | undefined;
816
+ zoom?: number | undefined;
817
+ } | undefined;
818
+ material?: {
819
+ id?: string | undefined;
820
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
821
+ properties?: {
822
+ color: string;
823
+ roughness: number;
824
+ metalness: number;
825
+ opacity: number;
826
+ transparent: boolean;
827
+ side: "front" | "back" | "double";
828
+ } | undefined;
829
+ texture?: {
830
+ url: string;
831
+ repeat?: [number, number] | undefined;
832
+ scale?: number | undefined;
833
+ } | undefined;
834
+ } | undefined;
835
+ materialPreset?: string | undefined;
836
+ railingMaterial?: {
837
+ id?: string | undefined;
838
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
839
+ properties?: {
840
+ color: string;
841
+ roughness: number;
842
+ metalness: number;
843
+ opacity: number;
844
+ transparent: boolean;
845
+ side: "front" | "back" | "double";
846
+ } | undefined;
847
+ texture?: {
848
+ url: string;
849
+ repeat?: [number, number] | undefined;
850
+ scale?: number | undefined;
851
+ } | undefined;
852
+ } | undefined;
853
+ railingMaterialPreset?: string | undefined;
854
+ treadMaterial?: {
855
+ id?: string | undefined;
856
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
857
+ properties?: {
858
+ color: string;
859
+ roughness: number;
860
+ metalness: number;
861
+ opacity: number;
862
+ transparent: boolean;
863
+ side: "front" | "back" | "double";
864
+ } | undefined;
865
+ texture?: {
866
+ url: string;
867
+ repeat?: [number, number] | undefined;
868
+ scale?: number | undefined;
869
+ } | undefined;
870
+ } | undefined;
871
+ treadMaterialPreset?: string | undefined;
872
+ sideMaterial?: {
873
+ id?: string | undefined;
874
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
875
+ properties?: {
876
+ color: string;
877
+ roughness: number;
878
+ metalness: number;
879
+ opacity: number;
880
+ transparent: boolean;
881
+ side: "front" | "back" | "double";
882
+ } | undefined;
883
+ texture?: {
884
+ url: string;
885
+ repeat?: [number, number] | undefined;
886
+ scale?: number | undefined;
887
+ } | undefined;
888
+ } | undefined;
889
+ sideMaterialPreset?: string | undefined;
890
+ } | {
891
+ object: "node";
892
+ parentId: string | null;
893
+ visible: boolean;
894
+ metadata: import("zod").JSONType;
895
+ id: `door_${string}`;
896
+ type: "door";
897
+ position: [number, number, number];
898
+ rotation: [number, number, number];
899
+ width: number;
900
+ height: number;
901
+ doorCategory: "interior" | "garage";
902
+ doorType: "double" | "hinged" | "french" | "folding" | "pocket" | "barn" | "sliding" | "garage-sectional" | "garage-rollup" | "garage-tiltup";
903
+ leafCount: 4 | 1 | 2 | 3;
904
+ operationState: number;
905
+ slideDirection: "left" | "right";
906
+ trackStyle: "visible" | "none" | "pocket" | "overhead";
907
+ garagePanelCount: number;
908
+ openingKind: "door" | "opening";
909
+ openingShape: "rectangle" | "rounded" | "arch";
910
+ openingRadiusMode: "all" | "individual";
911
+ openingTopRadii: [number, number];
912
+ cornerRadius: number;
913
+ archHeight: number;
914
+ openingRevealRadius: number;
915
+ frameThickness: number;
916
+ frameDepth: number;
917
+ threshold: boolean;
918
+ thresholdHeight: number;
919
+ hingesSide: "left" | "right";
920
+ swingDirection: "inward" | "outward";
921
+ swingAngle: number;
922
+ segments: {
923
+ type: "glass" | "panel" | "empty";
924
+ heightRatio: number;
925
+ columnRatios: number[];
926
+ dividerThickness: number;
927
+ panelDepth: number;
928
+ panelInset: number;
929
+ }[];
930
+ handle: boolean;
931
+ handleHeight: number;
932
+ handleSide: "left" | "right";
933
+ contentPadding: [number, number];
934
+ doorCloser: boolean;
935
+ panicBar: boolean;
936
+ panicBarHeight: number;
937
+ name?: string | undefined;
938
+ camera?: {
939
+ position: [number, number, number];
940
+ target: [number, number, number];
941
+ mode: "perspective" | "orthographic";
942
+ fov?: number | undefined;
943
+ zoom?: number | undefined;
944
+ } | undefined;
945
+ material?: {
946
+ id?: string | undefined;
947
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
948
+ properties?: {
949
+ color: string;
950
+ roughness: number;
951
+ metalness: number;
952
+ opacity: number;
953
+ transparent: boolean;
954
+ side: "front" | "back" | "double";
955
+ } | undefined;
956
+ texture?: {
957
+ url: string;
958
+ repeat?: [number, number] | undefined;
959
+ scale?: number | undefined;
960
+ } | undefined;
961
+ } | undefined;
962
+ side?: "front" | "back" | undefined;
963
+ wallId?: string | undefined;
964
+ } | {
965
+ object: "node";
966
+ parentId: string | null;
967
+ visible: boolean;
968
+ metadata: import("zod").JSONType;
969
+ id: `window_${string}`;
970
+ type: "window";
971
+ position: [number, number, number];
972
+ rotation: [number, number, number];
973
+ width: number;
974
+ height: number;
975
+ openingKind: "window" | "opening";
976
+ windowType: "sliding" | "fixed" | "casement" | "awning" | "hopper" | "single-hung" | "double-hung" | "bay" | "bow" | "louvered";
977
+ operationState: number;
978
+ awningDirection: "up" | "down";
979
+ casementStyle: "french" | "single";
980
+ hingesSide: "left" | "right";
981
+ openingShape: "rectangle" | "rounded" | "arch";
982
+ openingRadiusMode: "all" | "individual";
983
+ openingCornerRadii: [number, number, number, number];
984
+ cornerRadius: number;
985
+ archHeight: number;
986
+ openingRevealRadius: number;
987
+ frameThickness: number;
988
+ frameDepth: number;
989
+ columnRatios: number[];
990
+ rowRatios: number[];
991
+ columnDividerThickness: number;
992
+ rowDividerThickness: number;
993
+ sill: boolean;
994
+ sillDepth: number;
995
+ sillThickness: number;
996
+ name?: string | undefined;
997
+ camera?: {
998
+ position: [number, number, number];
999
+ target: [number, number, number];
1000
+ mode: "perspective" | "orthographic";
1001
+ fov?: number | undefined;
1002
+ zoom?: number | undefined;
1003
+ } | undefined;
1004
+ material?: {
1005
+ id?: string | undefined;
1006
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1007
+ properties?: {
1008
+ color: string;
1009
+ roughness: number;
1010
+ metalness: number;
1011
+ opacity: number;
1012
+ transparent: boolean;
1013
+ side: "front" | "back" | "double";
1014
+ } | undefined;
1015
+ texture?: {
1016
+ url: string;
1017
+ repeat?: [number, number] | undefined;
1018
+ scale?: number | undefined;
1019
+ } | undefined;
1020
+ } | undefined;
1021
+ side?: "front" | "back" | undefined;
1022
+ wallId?: string | undefined;
1023
+ } | {
1024
+ object: "node";
1025
+ parentId: string | null;
1026
+ visible: boolean;
1027
+ metadata: import("zod").JSONType;
1028
+ id: `wall_${string}`;
1029
+ type: "wall";
1030
+ children: (`item_${string}` | `door_${string}` | `window_${string}`)[];
1031
+ start: [number, number];
1032
+ end: [number, number];
1033
+ frontSide: "unknown" | "interior" | "exterior";
1034
+ backSide: "unknown" | "interior" | "exterior";
1035
+ name?: string | undefined;
1036
+ camera?: {
1037
+ position: [number, number, number];
1038
+ target: [number, number, number];
1039
+ mode: "perspective" | "orthographic";
1040
+ fov?: number | undefined;
1041
+ zoom?: number | undefined;
1042
+ } | undefined;
1043
+ material?: {
1044
+ id?: string | undefined;
1045
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1046
+ properties?: {
1047
+ color: string;
1048
+ roughness: number;
1049
+ metalness: number;
1050
+ opacity: number;
1051
+ transparent: boolean;
1052
+ side: "front" | "back" | "double";
1053
+ } | undefined;
1054
+ texture?: {
1055
+ url: string;
1056
+ repeat?: [number, number] | undefined;
1057
+ scale?: number | undefined;
1058
+ } | undefined;
1059
+ } | undefined;
1060
+ materialPreset?: string | undefined;
1061
+ interiorMaterial?: {
1062
+ id?: string | undefined;
1063
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1064
+ properties?: {
1065
+ color: string;
1066
+ roughness: number;
1067
+ metalness: number;
1068
+ opacity: number;
1069
+ transparent: boolean;
1070
+ side: "front" | "back" | "double";
1071
+ } | undefined;
1072
+ texture?: {
1073
+ url: string;
1074
+ repeat?: [number, number] | undefined;
1075
+ scale?: number | undefined;
1076
+ } | undefined;
1077
+ } | undefined;
1078
+ interiorMaterialPreset?: string | undefined;
1079
+ exteriorMaterial?: {
1080
+ id?: string | undefined;
1081
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1082
+ properties?: {
1083
+ color: string;
1084
+ roughness: number;
1085
+ metalness: number;
1086
+ opacity: number;
1087
+ transparent: boolean;
1088
+ side: "front" | "back" | "double";
1089
+ } | undefined;
1090
+ texture?: {
1091
+ url: string;
1092
+ repeat?: [number, number] | undefined;
1093
+ scale?: number | undefined;
1094
+ } | undefined;
1095
+ } | undefined;
1096
+ exteriorMaterialPreset?: string | undefined;
1097
+ thickness?: number | undefined;
1098
+ height?: number | undefined;
1099
+ curveOffset?: number | undefined;
1100
+ } | {
1101
+ object: "node";
1102
+ parentId: string | null;
1103
+ visible: boolean;
1104
+ id: `zone_${string}`;
1105
+ type: "zone";
1106
+ name: string;
1107
+ polygon: [number, number][];
1108
+ color: string;
1109
+ metadata: import("zod").JSONType;
1110
+ camera?: {
1111
+ position: [number, number, number];
1112
+ target: [number, number, number];
1113
+ mode: "perspective" | "orthographic";
1114
+ fov?: number | undefined;
1115
+ zoom?: number | undefined;
1116
+ } | undefined;
1117
+ } | {
1118
+ object: "node";
1119
+ parentId: string | null;
1120
+ visible: boolean;
1121
+ metadata: import("zod").JSONType;
1122
+ id: `level_${string}`;
1123
+ type: "level";
1124
+ children: (`item_${string}` | `ceiling_${string}` | `column_${string}` | `fence_${string}` | `guide_${string}` | `roof_${string}` | `scan_${string}` | `shelf_${string}` | `slab_${string}` | `spawn_${string}` | `stair_${string}` | `wall_${string}` | `zone_${string}`)[];
1125
+ level: number;
1126
+ name?: string | undefined;
1127
+ camera?: {
1128
+ position: [number, number, number];
1129
+ target: [number, number, number];
1130
+ mode: "perspective" | "orthographic";
1131
+ fov?: number | undefined;
1132
+ zoom?: number | undefined;
1133
+ } | undefined;
1134
+ } | {
1135
+ object: "node";
1136
+ parentId: string | null;
1137
+ visible: boolean;
1138
+ metadata: import("zod").JSONType;
1139
+ id: `building_${string}`;
1140
+ type: "building";
1141
+ children: (`elevator_${string}` | `level_${string}`)[];
1142
+ position: [number, number, number];
1143
+ rotation: [number, number, number];
1144
+ name?: string | undefined;
1145
+ camera?: {
1146
+ position: [number, number, number];
1147
+ target: [number, number, number];
1148
+ mode: "perspective" | "orthographic";
1149
+ fov?: number | undefined;
1150
+ zoom?: number | undefined;
1151
+ } | undefined;
1152
+ } | {
1153
+ object: "node";
1154
+ parentId: string | null;
1155
+ visible: boolean;
1156
+ metadata: import("zod").JSONType;
1157
+ id: `chimney_${string}`;
1158
+ type: "chimney";
1159
+ position: [number, number, number];
1160
+ rotation: number;
1161
+ bodyShape: "round" | "square";
1162
+ bodyHollowDepth: number;
1163
+ bodyHollowMargin: number;
1164
+ width: number;
1165
+ depth: number;
1166
+ heightAboveRidge: number;
1167
+ cutoutOffset: number;
1168
+ cornerBevel: number;
1169
+ cap: boolean;
1170
+ capShape: "flat" | "none" | "stepped" | "sloped";
1171
+ capOverhang: number;
1172
+ capThickness: number;
1173
+ flueCount: number;
1174
+ flueShape: "round" | "square";
1175
+ flueHeight: number;
1176
+ flueDiameter: number;
1177
+ flueSpacing: number;
1178
+ flueWallThickness: number;
1179
+ shoulderStyle: "tapered" | "none" | "corbeled";
1180
+ shoulderHeight: number;
1181
+ shoulderExtent: number;
1182
+ bandStyle: "double" | "none" | "single";
1183
+ bandHeight: number;
1184
+ bandExtent: number;
1185
+ bandOffset: number;
1186
+ cricketStyle: "none" | "simple";
1187
+ cricketLength: number;
1188
+ cricketHeight: number;
1189
+ cricketSide: "front" | "back";
1190
+ panelStyle: "rectangular" | "none";
1191
+ panelDepth: number;
1192
+ panelHeight: number;
1193
+ panelOffsetTop: number;
1194
+ panelMargin: number;
1195
+ name?: string | undefined;
1196
+ camera?: {
1197
+ position: [number, number, number];
1198
+ target: [number, number, number];
1199
+ mode: "perspective" | "orthographic";
1200
+ fov?: number | undefined;
1201
+ zoom?: number | undefined;
1202
+ } | undefined;
1203
+ material?: {
1204
+ id?: string | undefined;
1205
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1206
+ properties?: {
1207
+ color: string;
1208
+ roughness: number;
1209
+ metalness: number;
1210
+ opacity: number;
1211
+ transparent: boolean;
1212
+ side: "front" | "back" | "double";
1213
+ } | undefined;
1214
+ texture?: {
1215
+ url: string;
1216
+ repeat?: [number, number] | undefined;
1217
+ scale?: number | undefined;
1218
+ } | undefined;
1219
+ } | undefined;
1220
+ materialPreset?: string | undefined;
1221
+ topMaterial?: {
1222
+ id?: string | undefined;
1223
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1224
+ properties?: {
1225
+ color: string;
1226
+ roughness: number;
1227
+ metalness: number;
1228
+ opacity: number;
1229
+ transparent: boolean;
1230
+ side: "front" | "back" | "double";
1231
+ } | undefined;
1232
+ texture?: {
1233
+ url: string;
1234
+ repeat?: [number, number] | undefined;
1235
+ scale?: number | undefined;
1236
+ } | undefined;
1237
+ } | undefined;
1238
+ topMaterialPreset?: string | undefined;
1239
+ roofSegmentId?: string | undefined;
1240
+ } | {
1241
+ object: "node";
1242
+ parentId: string | null;
1243
+ visible: boolean;
1244
+ metadata: import("zod").JSONType;
1245
+ id: `cupola_${string}`;
1246
+ type: "cupola";
1247
+ materialPreset: string;
1248
+ position: [number, number, number];
1249
+ rotation: number;
1250
+ width: number;
1251
+ depth: number;
1252
+ height: number;
1253
+ roofStyle: "dome" | "pyramid";
1254
+ finial: boolean;
1255
+ name?: string | undefined;
1256
+ camera?: {
1257
+ position: [number, number, number];
1258
+ target: [number, number, number];
1259
+ mode: "perspective" | "orthographic";
1260
+ fov?: number | undefined;
1261
+ zoom?: number | undefined;
1262
+ } | undefined;
1263
+ material?: {
1264
+ id?: string | undefined;
1265
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1266
+ properties?: {
1267
+ color: string;
1268
+ roughness: number;
1269
+ metalness: number;
1270
+ opacity: number;
1271
+ transparent: boolean;
1272
+ side: "front" | "back" | "double";
1273
+ } | undefined;
1274
+ texture?: {
1275
+ url: string;
1276
+ repeat?: [number, number] | undefined;
1277
+ scale?: number | undefined;
1278
+ } | undefined;
1279
+ } | undefined;
1280
+ roofSegmentId?: string | undefined;
1281
+ } | {
1282
+ object: "node";
1283
+ parentId: string | null;
1284
+ visible: boolean;
1285
+ metadata: import("zod").JSONType;
1286
+ id: `dormer_${string}`;
1287
+ type: "dormer";
1288
+ position: [number, number, number];
1289
+ rotation: number;
1290
+ width: number;
1291
+ depth: number;
1292
+ height: number;
1293
+ roofType: "flat" | "hip" | "gable" | "shed" | "gambrel" | "dutch" | "mansard";
1294
+ roofHeight: number;
1295
+ wallSkirtHeight: number;
1296
+ windowWidth: number;
1297
+ windowHeight: number;
1298
+ windowOffsetX: number;
1299
+ windowOffsetY: number;
1300
+ windowFrameThickness: number;
1301
+ windowFrameDepth: number;
1302
+ windowColumns: number;
1303
+ windowRows: number;
1304
+ windowDividerThickness: number;
1305
+ windowShape: "rectangle" | "rounded" | "arch";
1306
+ windowArchHeight: number;
1307
+ windowCornerRadii: [number, number, number, number];
1308
+ windowSill: boolean;
1309
+ windowSillDepth: number;
1310
+ windowSillThickness: number;
1311
+ name?: string | undefined;
1312
+ camera?: {
1313
+ position: [number, number, number];
1314
+ target: [number, number, number];
1315
+ mode: "perspective" | "orthographic";
1316
+ fov?: number | undefined;
1317
+ zoom?: number | undefined;
1318
+ } | undefined;
1319
+ material?: {
1320
+ id?: string | undefined;
1321
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1322
+ properties?: {
1323
+ color: string;
1324
+ roughness: number;
1325
+ metalness: number;
1326
+ opacity: number;
1327
+ transparent: boolean;
1328
+ side: "front" | "back" | "double";
1329
+ } | undefined;
1330
+ texture?: {
1331
+ url: string;
1332
+ repeat?: [number, number] | undefined;
1333
+ scale?: number | undefined;
1334
+ } | undefined;
1335
+ } | undefined;
1336
+ materialPreset?: string | undefined;
1337
+ topMaterial?: {
1338
+ id?: string | undefined;
1339
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1340
+ properties?: {
1341
+ color: string;
1342
+ roughness: number;
1343
+ metalness: number;
1344
+ opacity: number;
1345
+ transparent: boolean;
1346
+ side: "front" | "back" | "double";
1347
+ } | undefined;
1348
+ texture?: {
1349
+ url: string;
1350
+ repeat?: [number, number] | undefined;
1351
+ scale?: number | undefined;
1352
+ } | undefined;
1353
+ } | undefined;
1354
+ topMaterialPreset?: string | undefined;
1355
+ sideMaterial?: {
1356
+ id?: string | undefined;
1357
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1358
+ properties?: {
1359
+ color: string;
1360
+ roughness: number;
1361
+ metalness: number;
1362
+ opacity: number;
1363
+ transparent: boolean;
1364
+ side: "front" | "back" | "double";
1365
+ } | undefined;
1366
+ texture?: {
1367
+ url: string;
1368
+ repeat?: [number, number] | undefined;
1369
+ scale?: number | undefined;
1370
+ } | undefined;
1371
+ } | undefined;
1372
+ sideMaterialPreset?: string | undefined;
1373
+ wallMaterial?: {
1374
+ id?: string | undefined;
1375
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1376
+ properties?: {
1377
+ color: string;
1378
+ roughness: number;
1379
+ metalness: number;
1380
+ opacity: number;
1381
+ transparent: boolean;
1382
+ side: "front" | "back" | "double";
1383
+ } | undefined;
1384
+ texture?: {
1385
+ url: string;
1386
+ repeat?: [number, number] | undefined;
1387
+ scale?: number | undefined;
1388
+ } | undefined;
1389
+ } | undefined;
1390
+ wallMaterialPreset?: string | undefined;
1391
+ roofSegmentId?: string | undefined;
1392
+ } | {
1393
+ object: "node";
1394
+ parentId: string | null;
1395
+ visible: boolean;
1396
+ metadata: import("zod").JSONType;
1397
+ id: `downspout_${string}`;
1398
+ type: "downspout";
1399
+ materialPreset: string;
1400
+ length: number;
1401
+ diameter: number;
1402
+ standoff: number;
1403
+ shape: "round" | "auto" | "rect";
1404
+ strapStyle: "none" | "band";
1405
+ strapSpacing: number;
1406
+ terminal: "straight" | "splash" | "kickout";
1407
+ name?: string | undefined;
1408
+ camera?: {
1409
+ position: [number, number, number];
1410
+ target: [number, number, number];
1411
+ mode: "perspective" | "orthographic";
1412
+ fov?: number | undefined;
1413
+ zoom?: number | undefined;
1414
+ } | undefined;
1415
+ material?: {
1416
+ id?: string | undefined;
1417
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1418
+ properties?: {
1419
+ color: string;
1420
+ roughness: number;
1421
+ metalness: number;
1422
+ opacity: number;
1423
+ transparent: boolean;
1424
+ side: "front" | "back" | "double";
1425
+ } | undefined;
1426
+ texture?: {
1427
+ url: string;
1428
+ repeat?: [number, number] | undefined;
1429
+ scale?: number | undefined;
1430
+ } | undefined;
1431
+ } | undefined;
1432
+ gutterId?: string | undefined;
1433
+ outletId?: string | undefined;
1434
+ } | {
1435
+ object: "node";
1436
+ parentId: string | null;
1437
+ visible: boolean;
1438
+ metadata: import("zod").JSONType;
1439
+ id: `eyebrow-vent_${string}`;
1440
+ type: "eyebrow-vent";
1441
+ materialPreset: string;
1442
+ position: [number, number, number];
1443
+ rotation: number;
1444
+ width: number;
1445
+ depth: number;
1446
+ height: number;
1447
+ style: "scoop" | "half-round" | "slant-box";
1448
+ louverCount: number;
1449
+ backRatio: number;
1450
+ name?: string | undefined;
1451
+ camera?: {
1452
+ position: [number, number, number];
1453
+ target: [number, number, number];
1454
+ mode: "perspective" | "orthographic";
1455
+ fov?: number | undefined;
1456
+ zoom?: number | undefined;
1457
+ } | undefined;
1458
+ material?: {
1459
+ id?: string | undefined;
1460
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1461
+ properties?: {
1462
+ color: string;
1463
+ roughness: number;
1464
+ metalness: number;
1465
+ opacity: number;
1466
+ transparent: boolean;
1467
+ side: "front" | "back" | "double";
1468
+ } | undefined;
1469
+ texture?: {
1470
+ url: string;
1471
+ repeat?: [number, number] | undefined;
1472
+ scale?: number | undefined;
1473
+ } | undefined;
1474
+ } | undefined;
1475
+ roofSegmentId?: string | undefined;
1476
+ } | {
1477
+ object: "node";
1478
+ parentId: string | null;
1479
+ visible: boolean;
1480
+ metadata: import("zod").JSONType;
1481
+ id: `gutter_${string}`;
1482
+ type: "gutter";
1483
+ materialPreset: string;
1484
+ position: [number, number, number];
1485
+ rotation: number;
1486
+ length: number;
1487
+ size: number;
1488
+ thickness: number;
1489
+ profile: "box" | "half-round" | "k-style";
1490
+ endCapLeft: boolean;
1491
+ endCapRight: boolean;
1492
+ hangerStyle: "none" | "strap";
1493
+ hangerSpacing: number;
1494
+ outlets: {
1495
+ id: string;
1496
+ offset: number;
1497
+ diameter: number;
1498
+ }[];
1499
+ name?: string | undefined;
1500
+ camera?: {
1501
+ position: [number, number, number];
1502
+ target: [number, number, number];
1503
+ mode: "perspective" | "orthographic";
1504
+ fov?: number | undefined;
1505
+ zoom?: number | undefined;
1506
+ } | undefined;
1507
+ material?: {
1508
+ id?: string | undefined;
1509
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1510
+ properties?: {
1511
+ color: string;
1512
+ roughness: number;
1513
+ metalness: number;
1514
+ opacity: number;
1515
+ transparent: boolean;
1516
+ side: "front" | "back" | "double";
1517
+ } | undefined;
1518
+ texture?: {
1519
+ url: string;
1520
+ repeat?: [number, number] | undefined;
1521
+ scale?: number | undefined;
1522
+ } | undefined;
1523
+ } | undefined;
1524
+ roofSegmentId?: string | undefined;
1525
+ } | {
1526
+ object: "node";
1527
+ parentId: string | null;
1528
+ visible: boolean;
1529
+ metadata: import("zod").JSONType;
1530
+ id: `rvent_${string}`;
1531
+ type: "ridge-vent";
1532
+ materialPreset: string;
1533
+ position: [number, number, number];
1534
+ rotation: number;
1535
+ length: number;
1536
+ width: number;
1537
+ height: number;
1538
+ style: "metal" | "standard" | "shingled";
1539
+ endCaps: boolean;
1540
+ name?: string | undefined;
1541
+ camera?: {
1542
+ position: [number, number, number];
1543
+ target: [number, number, number];
1544
+ mode: "perspective" | "orthographic";
1545
+ fov?: number | undefined;
1546
+ zoom?: number | undefined;
1547
+ } | undefined;
1548
+ material?: {
1549
+ id?: string | undefined;
1550
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1551
+ properties?: {
1552
+ color: string;
1553
+ roughness: number;
1554
+ metalness: number;
1555
+ opacity: number;
1556
+ transparent: boolean;
1557
+ side: "front" | "back" | "double";
1558
+ } | undefined;
1559
+ texture?: {
1560
+ url: string;
1561
+ repeat?: [number, number] | undefined;
1562
+ scale?: number | undefined;
1563
+ } | undefined;
1564
+ } | undefined;
1565
+ roofSegmentId?: string | undefined;
1566
+ } | {
1567
+ object: "node";
1568
+ parentId: string | null;
1569
+ visible: boolean;
1570
+ metadata: import("zod").JSONType;
1571
+ id: `site_${string}`;
1572
+ type: "site";
1573
+ polygon: {
1574
+ type: "polygon";
1575
+ points: [number, number][];
1576
+ };
1577
+ children: string[];
1578
+ name?: string | undefined;
1579
+ camera?: {
1580
+ position: [number, number, number];
1581
+ target: [number, number, number];
1582
+ mode: "perspective" | "orthographic";
1583
+ fov?: number | undefined;
1584
+ zoom?: number | undefined;
1585
+ } | undefined;
1586
+ } | {
1587
+ object: "node";
1588
+ parentId: string | null;
1589
+ visible: boolean;
1590
+ metadata: import("zod").JSONType;
1591
+ id: `skylight_${string}`;
1592
+ type: "skylight";
1593
+ position: [number, number, number];
1594
+ rotation: number;
1595
+ width: number;
1596
+ height: number;
1597
+ frameThickness: number;
1598
+ frameDepth: number;
1599
+ skylightType: "flat" | "sliding" | "opening" | "walk-on" | "lantern";
1600
+ glassThickness: number;
1601
+ lanternHeight: number;
1602
+ lanternTopScale: number;
1603
+ openingAngle: number;
1604
+ openingSide: "top" | "bottom" | "left" | "right";
1605
+ operationState: number;
1606
+ motorHousing: boolean;
1607
+ slideFraction: number;
1608
+ slideDirection: "x" | "z";
1609
+ trackWidth: number;
1610
+ motorHousingSize: number;
1611
+ curb: boolean;
1612
+ curbHeight: number;
1613
+ cutoutOffset: number;
1614
+ name?: string | undefined;
1615
+ camera?: {
1616
+ position: [number, number, number];
1617
+ target: [number, number, number];
1618
+ mode: "perspective" | "orthographic";
1619
+ fov?: number | undefined;
1620
+ zoom?: number | undefined;
1621
+ } | undefined;
1622
+ material?: {
1623
+ id?: string | undefined;
1624
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1625
+ properties?: {
1626
+ color: string;
1627
+ roughness: number;
1628
+ metalness: number;
1629
+ opacity: number;
1630
+ transparent: boolean;
1631
+ side: "front" | "back" | "double";
1632
+ } | undefined;
1633
+ texture?: {
1634
+ url: string;
1635
+ repeat?: [number, number] | undefined;
1636
+ scale?: number | undefined;
1637
+ } | undefined;
1638
+ } | undefined;
1639
+ materialPreset?: string | undefined;
1640
+ glassMaterial?: {
1641
+ id?: string | undefined;
1642
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1643
+ properties?: {
1644
+ color: string;
1645
+ roughness: number;
1646
+ metalness: number;
1647
+ opacity: number;
1648
+ transparent: boolean;
1649
+ side: "front" | "back" | "double";
1650
+ } | undefined;
1651
+ texture?: {
1652
+ url: string;
1653
+ repeat?: [number, number] | undefined;
1654
+ scale?: number | undefined;
1655
+ } | undefined;
1656
+ } | undefined;
1657
+ glassMaterialPreset?: string | undefined;
1658
+ roofSegmentId?: string | undefined;
1659
+ surfaceNormal?: [number, number, number] | undefined;
1660
+ } | {
1661
+ object: "node";
1662
+ parentId: string | null;
1663
+ visible: boolean;
1664
+ metadata: import("zod").JSONType;
1665
+ id: `solarpanel_${string}`;
1666
+ type: "solar-panel";
1667
+ position: [number, number, number];
1668
+ rotation: number;
1669
+ rows: number;
1670
+ columns: number;
1671
+ panelWidth: number;
1672
+ panelHeight: number;
1673
+ gapX: number;
1674
+ gapY: number;
1675
+ mountingType: "flush" | "tilted";
1676
+ tiltAngle: number;
1677
+ standoffHeight: number;
1678
+ frameThickness: number;
1679
+ frameDepth: number;
1680
+ name?: string | undefined;
1681
+ camera?: {
1682
+ position: [number, number, number];
1683
+ target: [number, number, number];
1684
+ mode: "perspective" | "orthographic";
1685
+ fov?: number | undefined;
1686
+ zoom?: number | undefined;
1687
+ } | undefined;
1688
+ material?: {
1689
+ id?: string | undefined;
1690
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1691
+ properties?: {
1692
+ color: string;
1693
+ roughness: number;
1694
+ metalness: number;
1695
+ opacity: number;
1696
+ transparent: boolean;
1697
+ side: "front" | "back" | "double";
1698
+ } | undefined;
1699
+ texture?: {
1700
+ url: string;
1701
+ repeat?: [number, number] | undefined;
1702
+ scale?: number | undefined;
1703
+ } | undefined;
1704
+ } | undefined;
1705
+ materialPreset?: string | undefined;
1706
+ panelMaterial?: {
1707
+ id?: string | undefined;
1708
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1709
+ properties?: {
1710
+ color: string;
1711
+ roughness: number;
1712
+ metalness: number;
1713
+ opacity: number;
1714
+ transparent: boolean;
1715
+ side: "front" | "back" | "double";
1716
+ } | undefined;
1717
+ texture?: {
1718
+ url: string;
1719
+ repeat?: [number, number] | undefined;
1720
+ scale?: number | undefined;
1721
+ } | undefined;
1722
+ } | undefined;
1723
+ panelMaterialPreset?: string | undefined;
1724
+ panelTypePreset?: "residential" | "residential-large" | "compact" | "frameless" | undefined;
1725
+ roofSegmentId?: string | undefined;
1726
+ surfaceNormal?: [number, number, number] | undefined;
1727
+ } | {
1728
+ object: "node";
1729
+ parentId: string | null;
1730
+ visible: boolean;
1731
+ metadata: import("zod").JSONType;
1732
+ id: `tvent_${string}`;
1733
+ type: "turbine-vent";
1734
+ materialPreset: string;
1735
+ position: [number, number, number];
1736
+ rotation: number;
1737
+ diameter: number;
1738
+ height: number;
1739
+ neckHeight: number;
1740
+ baseOverhang: number;
1741
+ vaneCount: number;
1742
+ spinSpeed: number;
1743
+ style: "globe" | "cylinder";
1744
+ name?: string | undefined;
1745
+ camera?: {
1746
+ position: [number, number, number];
1747
+ target: [number, number, number];
1748
+ mode: "perspective" | "orthographic";
1749
+ fov?: number | undefined;
1750
+ zoom?: number | undefined;
1751
+ } | undefined;
1752
+ material?: {
1753
+ id?: string | undefined;
1754
+ preset?: "custom" | "white" | "brick" | "concrete" | "wood" | "glass" | "metal" | "plaster" | "tile" | "marble" | undefined;
1755
+ properties?: {
1756
+ color: string;
1757
+ roughness: number;
1758
+ metalness: number;
1759
+ opacity: number;
1760
+ transparent: boolean;
1761
+ side: "front" | "back" | "double";
1762
+ } | undefined;
1763
+ texture?: {
1764
+ url: string;
1765
+ repeat?: [number, number] | undefined;
1766
+ scale?: number | undefined;
1767
+ } | undefined;
1768
+ } | undefined;
1769
+ roofSegmentId?: string | undefined;
1770
+ }>;
1771
+ export declare function createSurfaceOpeningPreviewController(): {
1772
+ previewSurfaceIds: Set<`bvent_${string}` | `elevator_${string}` | `item_${string}` | `ceiling_${string}` | `column_${string}` | `fence_${string}` | `guide_${string}` | `rseg_${string}` | `roof_${string}` | `scan_${string}` | `shelf_${string}` | `slab_${string}` | `spawn_${string}` | `sseg_${string}` | `stair_${string}` | `door_${string}` | `window_${string}` | `wall_${string}` | `zone_${string}` | `level_${string}` | `building_${string}` | `chimney_${string}` | `cupola_${string}` | `dormer_${string}` | `downspout_${string}` | `eyebrow-vent_${string}` | `gutter_${string}` | `rvent_${string}` | `site_${string}` | `skylight_${string}` | `solarpanel_${string}` | `tvent_${string}`>;
1773
+ apply(updates: SurfaceOpeningUpdate[]): void;
1774
+ clear(): void;
1775
+ };
1776
+ export {};
1777
+ //# sourceMappingURL=stair-opening-preview.d.ts.map