@pascal-app/core 0.9.1 → 1.0.0-beta.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 (378) hide show
  1. package/README.md +17 -10
  2. package/dist/events/bus.d.ts +49 -2
  3. package/dist/events/bus.d.ts.map +1 -1
  4. package/dist/hooks/scene-registry/item-clip-registry.d.ts +18 -0
  5. package/dist/hooks/scene-registry/item-clip-registry.d.ts.map +1 -0
  6. package/dist/hooks/scene-registry/item-clip-registry.js +10 -0
  7. package/dist/hooks/scene-registry/scene-registry.d.ts +8 -1
  8. package/dist/hooks/scene-registry/scene-registry.d.ts.map +1 -1
  9. package/dist/hooks/scene-registry/scene-registry.js +27 -1
  10. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +17 -1
  11. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  12. package/dist/hooks/spatial-grid/floor-placed-elevation.js +61 -8
  13. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +135 -28
  14. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  15. package/dist/hooks/spatial-grid/spatial-grid-manager.js +427 -271
  16. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +46 -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 +208 -9
  19. package/dist/hooks/spatial-grid/support-host-id.d.ts +3 -0
  20. package/dist/hooks/spatial-grid/support-host-id.d.ts.map +1 -0
  21. package/dist/hooks/spatial-grid/support-host-id.js +2 -0
  22. package/dist/hooks/spatial-grid/support-host-patch.d.ts +51 -0
  23. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -0
  24. package/dist/hooks/spatial-grid/support-host-patch.js +164 -0
  25. package/dist/index.d.ts +33 -11
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +32 -10
  28. package/dist/lib/level-name.d.ts +4 -0
  29. package/dist/lib/level-name.d.ts.map +1 -0
  30. package/dist/lib/level-name.js +10 -0
  31. package/dist/lib/measurement-geometry.d.ts +23 -0
  32. package/dist/lib/measurement-geometry.d.ts.map +1 -0
  33. package/dist/lib/measurement-geometry.js +249 -0
  34. package/dist/lib/polygon-geometry.d.ts +0 -1
  35. package/dist/lib/polygon-geometry.d.ts.map +1 -1
  36. package/dist/lib/polygon-geometry.js +0 -18
  37. package/dist/lib/selection-proxy.d.ts +4 -0
  38. package/dist/lib/selection-proxy.d.ts.map +1 -0
  39. package/dist/lib/selection-proxy.js +12 -0
  40. package/dist/lib/slab-polygon.d.ts +31 -2
  41. package/dist/lib/slab-polygon.d.ts.map +1 -1
  42. package/dist/lib/slab-polygon.js +557 -31
  43. package/dist/lib/slots.d.ts +14 -0
  44. package/dist/lib/slots.d.ts.map +1 -0
  45. package/dist/lib/slots.js +26 -0
  46. package/dist/lib/space-detection.d.ts +40 -6
  47. package/dist/lib/space-detection.d.ts.map +1 -1
  48. package/dist/lib/space-detection.js +574 -192
  49. package/dist/lib/terrain-brush.d.ts +163 -0
  50. package/dist/lib/terrain-brush.d.ts.map +1 -0
  51. package/dist/lib/terrain-brush.js +359 -0
  52. package/dist/lib/terrain-codec.d.ts +51 -0
  53. package/dist/lib/terrain-codec.d.ts.map +1 -0
  54. package/dist/lib/terrain-codec.js +167 -0
  55. package/dist/lib/terrain-field.d.ts +150 -0
  56. package/dist/lib/terrain-field.d.ts.map +1 -0
  57. package/dist/lib/terrain-field.js +248 -0
  58. package/dist/lib/terrain-raycast.d.ts +44 -0
  59. package/dist/lib/terrain-raycast.d.ts.map +1 -0
  60. package/dist/lib/terrain-raycast.js +188 -0
  61. package/dist/lib/terrain-source.d.ts +60 -0
  62. package/dist/lib/terrain-source.d.ts.map +1 -0
  63. package/dist/lib/terrain-source.js +90 -0
  64. package/dist/lib/terrain-support.d.ts +60 -0
  65. package/dist/lib/terrain-support.d.ts.map +1 -0
  66. package/dist/lib/terrain-support.js +150 -0
  67. package/dist/lib/wall-distance.d.ts +60 -0
  68. package/dist/lib/wall-distance.d.ts.map +1 -0
  69. package/dist/lib/wall-distance.js +85 -0
  70. package/dist/lib/zone-quantities.d.ts +21 -0
  71. package/dist/lib/zone-quantities.d.ts.map +1 -0
  72. package/dist/lib/zone-quantities.js +428 -0
  73. package/dist/material-library.d.ts +28 -1
  74. package/dist/material-library.d.ts.map +1 -1
  75. package/dist/material-library.js +2233 -441
  76. package/dist/registry/handles.d.ts +91 -3
  77. package/dist/registry/handles.d.ts.map +1 -1
  78. package/dist/registry/index.d.ts +3 -3
  79. package/dist/registry/index.d.ts.map +1 -1
  80. package/dist/registry/index.js +1 -1
  81. package/dist/registry/registry.d.ts +46 -3
  82. package/dist/registry/registry.d.ts.map +1 -1
  83. package/dist/registry/registry.js +82 -1
  84. package/dist/registry/subtree.d.ts.map +1 -1
  85. package/dist/registry/subtree.js +8 -1
  86. package/dist/registry/types.d.ts +781 -39
  87. package/dist/registry/types.d.ts.map +1 -1
  88. package/dist/schema/index.d.ts +27 -8
  89. package/dist/schema/index.d.ts.map +1 -1
  90. package/dist/schema/index.js +23 -6
  91. package/dist/schema/material.d.ts +3 -2
  92. package/dist/schema/material.d.ts.map +1 -1
  93. package/dist/schema/material.js +7 -5
  94. package/dist/schema/nodes/box-vent.d.ts +2 -2
  95. package/dist/schema/nodes/cabinet.d.ts +536 -0
  96. package/dist/schema/nodes/cabinet.d.ts.map +1 -0
  97. package/dist/schema/nodes/cabinet.js +139 -0
  98. package/dist/schema/nodes/ceiling.d.ts +4 -3
  99. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  100. package/dist/schema/nodes/ceiling.js +11 -1
  101. package/dist/schema/nodes/chimney.d.ts +4 -4
  102. package/dist/schema/nodes/column.d.ts +4 -2
  103. package/dist/schema/nodes/column.d.ts.map +1 -1
  104. package/dist/schema/nodes/column.js +5 -0
  105. package/dist/schema/nodes/construction-dimension.d.ts +195 -0
  106. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -0
  107. package/dist/schema/nodes/construction-dimension.js +151 -0
  108. package/dist/schema/nodes/cupola.d.ts +2 -2
  109. package/dist/schema/nodes/door.d.ts +42 -5
  110. package/dist/schema/nodes/door.d.ts.map +1 -1
  111. package/dist/schema/nodes/door.js +32 -0
  112. package/dist/schema/nodes/dormer.d.ts +8 -8
  113. package/dist/schema/nodes/dormer.js +1 -1
  114. package/dist/schema/nodes/downspout.d.ts +2 -2
  115. package/dist/schema/nodes/duct-fitting.d.ts +91 -0
  116. package/dist/schema/nodes/duct-fitting.d.ts.map +1 -0
  117. package/dist/schema/nodes/duct-fitting.js +92 -0
  118. package/dist/schema/nodes/duct-segment.d.ts +61 -0
  119. package/dist/schema/nodes/duct-segment.d.ts.map +1 -0
  120. package/dist/schema/nodes/duct-segment.js +73 -0
  121. package/dist/schema/nodes/duct-terminal.d.ts +58 -0
  122. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -0
  123. package/dist/schema/nodes/duct-terminal.js +53 -0
  124. package/dist/schema/nodes/elevator.d.ts +3 -2
  125. package/dist/schema/nodes/elevator.d.ts.map +1 -1
  126. package/dist/schema/nodes/elevator.js +3 -0
  127. package/dist/schema/nodes/eyebrow-vent.d.ts +2 -2
  128. package/dist/schema/nodes/fence.d.ts +20 -2
  129. package/dist/schema/nodes/fence.d.ts.map +1 -1
  130. package/dist/schema/nodes/fence.js +33 -2
  131. package/dist/schema/nodes/gutter.d.ts +2 -2
  132. package/dist/schema/nodes/hvac-equipment.d.ts +64 -0
  133. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -0
  134. package/dist/schema/nodes/hvac-equipment.js +57 -0
  135. package/dist/schema/nodes/item.d.ts +9 -0
  136. package/dist/schema/nodes/item.d.ts.map +1 -1
  137. package/dist/schema/nodes/item.js +24 -0
  138. package/dist/schema/nodes/level.d.ts +2 -1
  139. package/dist/schema/nodes/level.d.ts.map +1 -1
  140. package/dist/schema/nodes/level.js +12 -31
  141. package/dist/schema/nodes/lineset.d.ts +42 -0
  142. package/dist/schema/nodes/lineset.d.ts.map +1 -0
  143. package/dist/schema/nodes/lineset.js +38 -0
  144. package/dist/schema/nodes/liquid-line.d.ts +34 -0
  145. package/dist/schema/nodes/liquid-line.d.ts.map +1 -0
  146. package/dist/schema/nodes/liquid-line.js +24 -0
  147. package/dist/schema/nodes/measurement.d.ts +306 -0
  148. package/dist/schema/nodes/measurement.d.ts.map +1 -0
  149. package/dist/schema/nodes/measurement.js +87 -0
  150. package/dist/schema/nodes/pipe-fitting.d.ts +56 -0
  151. package/dist/schema/nodes/pipe-fitting.d.ts.map +1 -0
  152. package/dist/schema/nodes/pipe-fitting.js +45 -0
  153. package/dist/schema/nodes/pipe-segment.d.ts +48 -0
  154. package/dist/schema/nodes/pipe-segment.d.ts.map +1 -0
  155. package/dist/schema/nodes/pipe-segment.js +36 -0
  156. package/dist/schema/nodes/pipe-trap.d.ts +43 -0
  157. package/dist/schema/nodes/pipe-trap.d.ts.map +1 -0
  158. package/dist/schema/nodes/pipe-trap.js +36 -0
  159. package/dist/schema/nodes/ridge-vent.d.ts +18 -3
  160. package/dist/schema/nodes/ridge-vent.d.ts.map +1 -1
  161. package/dist/schema/nodes/ridge-vent.js +221 -3
  162. package/dist/schema/nodes/roof-segment-shape.d.ts +90 -0
  163. package/dist/schema/nodes/roof-segment-shape.d.ts.map +1 -0
  164. package/dist/schema/nodes/roof-segment-shape.js +318 -0
  165. package/dist/schema/nodes/roof-segment-walls.d.ts +101 -0
  166. package/dist/schema/nodes/roof-segment-walls.d.ts.map +1 -0
  167. package/dist/schema/nodes/roof-segment-walls.js +330 -0
  168. package/dist/schema/nodes/roof-segment.d.ts +84 -8
  169. package/dist/schema/nodes/roof-segment.d.ts.map +1 -1
  170. package/dist/schema/nodes/roof-segment.js +290 -5
  171. package/dist/schema/nodes/roof.d.ts +8 -8
  172. package/dist/schema/nodes/shelf.d.ts +4 -2
  173. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  174. package/dist/schema/nodes/shelf.js +8 -0
  175. package/dist/schema/nodes/site.d.ts +9 -0
  176. package/dist/schema/nodes/site.d.ts.map +1 -1
  177. package/dist/schema/nodes/site.js +8 -6
  178. package/dist/schema/nodes/skylight.d.ts +10 -10
  179. package/dist/schema/nodes/slab.d.ts +8 -2
  180. package/dist/schema/nodes/slab.d.ts.map +1 -1
  181. package/dist/schema/nodes/slab.js +18 -2
  182. package/dist/schema/nodes/solar-panel.d.ts +4 -4
  183. package/dist/schema/nodes/spawn.d.ts +1 -0
  184. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  185. package/dist/schema/nodes/spawn.js +2 -0
  186. package/dist/schema/nodes/stair-segment.d.ts +4 -4
  187. package/dist/schema/nodes/stair.d.ts +16 -13
  188. package/dist/schema/nodes/stair.d.ts.map +1 -1
  189. package/dist/schema/nodes/stair.js +11 -1
  190. package/dist/schema/nodes/structural-grid.d.ts +27 -0
  191. package/dist/schema/nodes/structural-grid.d.ts.map +1 -0
  192. package/dist/schema/nodes/structural-grid.js +17 -0
  193. package/dist/schema/nodes/turbine-vent.d.ts +2 -2
  194. package/dist/schema/nodes/wall.d.ts +248 -6
  195. package/dist/schema/nodes/wall.d.ts.map +1 -1
  196. package/dist/schema/nodes/wall.js +266 -0
  197. package/dist/schema/nodes/window.d.ts +40 -3
  198. package/dist/schema/nodes/window.d.ts.map +1 -1
  199. package/dist/schema/nodes/window.js +30 -0
  200. package/dist/schema/nodes/zone.d.ts +22 -0
  201. package/dist/schema/nodes/zone.d.ts.map +1 -1
  202. package/dist/schema/nodes/zone.js +21 -0
  203. package/dist/schema/scene-material.d.ts +41 -0
  204. package/dist/schema/scene-material.d.ts.map +1 -0
  205. package/dist/schema/scene-material.js +9 -0
  206. package/dist/schema/terrain.d.ts +28 -0
  207. package/dist/schema/terrain.d.ts.map +1 -0
  208. package/dist/schema/terrain.js +30 -0
  209. package/dist/schema/types.d.ts +1300 -97
  210. package/dist/schema/types.d.ts.map +1 -1
  211. package/dist/schema/types.js +27 -0
  212. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts +80 -0
  213. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -0
  214. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.js +89 -0
  215. package/dist/services/alignment-anchors.d.ts.map +1 -1
  216. package/dist/services/alignment-anchors.js +30 -1
  217. package/dist/services/alignment.d.ts +5 -0
  218. package/dist/services/alignment.d.ts.map +1 -1
  219. package/dist/services/alignment.js +2 -0
  220. package/dist/services/hosting.d.ts +8 -0
  221. package/dist/services/hosting.d.ts.map +1 -1
  222. package/dist/services/hosting.js +13 -4
  223. package/dist/services/index.d.ts +9 -2
  224. package/dist/services/index.d.ts.map +1 -1
  225. package/dist/services/index.js +9 -2
  226. package/dist/services/level-height.d.ts +27 -0
  227. package/dist/services/level-height.d.ts.map +1 -0
  228. package/dist/services/level-height.js +94 -0
  229. package/dist/services/opening-guides.d.ts +141 -0
  230. package/dist/services/opening-guides.d.ts.map +1 -0
  231. package/dist/services/opening-guides.js +267 -0
  232. package/dist/services/port-connectivity.d.ts +115 -0
  233. package/dist/services/port-connectivity.d.ts.map +1 -0
  234. package/dist/services/port-connectivity.js +300 -0
  235. package/dist/services/riser-diagram.d.ts +40 -0
  236. package/dist/services/riser-diagram.d.ts.map +1 -0
  237. package/dist/services/riser-diagram.js +110 -0
  238. package/dist/services/snap.d.ts +9 -1
  239. package/dist/services/snap.d.ts.map +1 -1
  240. package/dist/services/snap.js +21 -1
  241. package/dist/services/storey.d.ts +103 -0
  242. package/dist/services/storey.d.ts.map +1 -0
  243. package/dist/services/storey.js +296 -0
  244. package/dist/services/system-graph.d.ts +30 -0
  245. package/dist/services/system-graph.d.ts.map +1 -0
  246. package/dist/services/system-graph.js +164 -0
  247. package/dist/services/validate-dwv.d.ts +32 -0
  248. package/dist/services/validate-dwv.d.ts.map +1 -0
  249. package/dist/services/validate-dwv.js +118 -0
  250. package/dist/store/actions/node-actions.d.ts.map +1 -1
  251. package/dist/store/actions/node-actions.js +141 -4
  252. package/dist/store/history-control.d.ts +31 -0
  253. package/dist/store/history-control.d.ts.map +1 -1
  254. package/dist/store/history-control.js +130 -0
  255. package/dist/store/use-live-terrain.d.ts +65 -0
  256. package/dist/store/use-live-terrain.d.ts.map +1 -0
  257. package/dist/store/use-live-terrain.js +31 -0
  258. package/dist/store/use-live-transforms.d.ts +8 -0
  259. package/dist/store/use-live-transforms.d.ts.map +1 -1
  260. package/dist/store/use-scene.d.ts +47 -3
  261. package/dist/store/use-scene.d.ts.map +1 -1
  262. package/dist/store/use-scene.js +992 -55
  263. package/dist/systems/elevator/elevator-opening-system.d.ts +1 -0
  264. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  265. package/dist/systems/elevator/elevator-opening-system.js +27 -21
  266. package/dist/systems/elevator/elevator-service.d.ts +0 -2
  267. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  268. package/dist/systems/elevator/elevator-service.js +2 -24
  269. package/dist/systems/fence/fence-centerline.d.ts +12 -0
  270. package/dist/systems/fence/fence-centerline.d.ts.map +1 -0
  271. package/dist/systems/fence/fence-centerline.js +37 -0
  272. package/dist/systems/fence/fence-spline.d.ts +39 -0
  273. package/dist/systems/fence/fence-spline.d.ts.map +1 -0
  274. package/dist/systems/fence/fence-spline.js +196 -0
  275. package/dist/systems/slab/slab-placement.d.ts +11 -0
  276. package/dist/systems/slab/slab-placement.d.ts.map +1 -0
  277. package/dist/systems/slab/slab-placement.js +14 -0
  278. package/dist/systems/slab/slab-support.d.ts +137 -0
  279. package/dist/systems/slab/slab-support.d.ts.map +1 -0
  280. package/dist/systems/slab/slab-support.js +557 -0
  281. package/dist/systems/stair/stair-footprint.d.ts.map +1 -1
  282. package/dist/systems/stair/stair-footprint.js +21 -11
  283. package/dist/systems/stair/stair-opening-preview.d.ts +1300 -505
  284. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  285. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  286. package/dist/systems/stair/stair-opening-sync.js +19 -33
  287. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  288. package/dist/systems/stair/stair-opening-system.js +32 -4
  289. package/dist/systems/stair/stair-rise.d.ts +22 -0
  290. package/dist/systems/stair/stair-rise.d.ts.map +1 -0
  291. package/dist/systems/stair/stair-rise.js +79 -0
  292. package/dist/systems/wall/wall-curve.d.ts +10 -0
  293. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  294. package/dist/systems/wall/wall-curve.js +1 -1
  295. package/dist/systems/wall/wall-mitering.d.ts.map +1 -1
  296. package/dist/systems/wall/wall-mitering.js +44 -8
  297. package/dist/systems/wall/wall-top.d.ts +40 -0
  298. package/dist/systems/wall/wall-top.d.ts.map +1 -0
  299. package/dist/systems/wall/wall-top.js +46 -0
  300. package/dist/utils/clone-scene-graph.d.ts +1 -0
  301. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  302. package/dist/utils/clone-scene-graph.js +56 -5
  303. package/dist/utils/heal-scene-graph.d.ts +18 -0
  304. package/dist/utils/heal-scene-graph.d.ts.map +1 -0
  305. package/dist/utils/heal-scene-graph.js +106 -0
  306. package/dist/validation/validate-build-json.d.ts +3 -0
  307. package/dist/validation/validate-build-json.d.ts.map +1 -1
  308. package/dist/validation/validate-build-json.js +90 -5
  309. package/package.json +4 -4
  310. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +0 -2
  311. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +0 -1
  312. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +0 -273
  313. package/dist/lib/space-detection-pause.test.d.ts +0 -2
  314. package/dist/lib/space-detection-pause.test.d.ts.map +0 -1
  315. package/dist/lib/space-detection-pause.test.js +0 -42
  316. package/dist/lib/space-detection.test.d.ts +0 -2
  317. package/dist/lib/space-detection.test.d.ts.map +0 -1
  318. package/dist/lib/space-detection.test.js +0 -77
  319. package/dist/registry/registry.test.d.ts +0 -2
  320. package/dist/registry/registry.test.d.ts.map +0 -1
  321. package/dist/registry/registry.test.js +0 -183
  322. package/dist/registry/relations-resolver.test.d.ts +0 -2
  323. package/dist/registry/relations-resolver.test.d.ts.map +0 -1
  324. package/dist/registry/relations-resolver.test.js +0 -183
  325. package/dist/registry/scene-api.test.d.ts +0 -2
  326. package/dist/registry/scene-api.test.d.ts.map +0 -1
  327. package/dist/registry/scene-api.test.js +0 -183
  328. package/dist/registry/subtree.test.d.ts +0 -2
  329. package/dist/registry/subtree.test.d.ts.map +0 -1
  330. package/dist/registry/subtree.test.js +0 -133
  331. package/dist/schema/asset-url.test.d.ts +0 -2
  332. package/dist/schema/asset-url.test.d.ts.map +0 -1
  333. package/dist/schema/asset-url.test.js +0 -134
  334. package/dist/services/alignment-anchors.test.d.ts +0 -2
  335. package/dist/services/alignment-anchors.test.d.ts.map +0 -1
  336. package/dist/services/alignment-anchors.test.js +0 -383
  337. package/dist/services/alignment.test.d.ts +0 -2
  338. package/dist/services/alignment.test.d.ts.map +0 -1
  339. package/dist/services/alignment.test.js +0 -92
  340. package/dist/services/drag-session.test.d.ts +0 -2
  341. package/dist/services/drag-session.test.d.ts.map +0 -1
  342. package/dist/services/drag-session.test.js +0 -219
  343. package/dist/services/hosting.test.d.ts +0 -2
  344. package/dist/services/hosting.test.d.ts.map +0 -1
  345. package/dist/services/hosting.test.js +0 -199
  346. package/dist/services/movement.test.d.ts +0 -2
  347. package/dist/services/movement.test.d.ts.map +0 -1
  348. package/dist/services/movement.test.js +0 -133
  349. package/dist/services/single-undo-dance.test.d.ts +0 -2
  350. package/dist/services/single-undo-dance.test.d.ts.map +0 -1
  351. package/dist/services/single-undo-dance.test.js +0 -210
  352. package/dist/services/snap.test.d.ts +0 -2
  353. package/dist/services/snap.test.d.ts.map +0 -1
  354. package/dist/services/snap.test.js +0 -95
  355. package/dist/store/actions/node-mutation-sanitize.test.d.ts +0 -2
  356. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +0 -1
  357. package/dist/store/actions/node-mutation-sanitize.test.js +0 -147
  358. package/dist/store/actions/reparent.test.d.ts +0 -2
  359. package/dist/store/actions/reparent.test.d.ts.map +0 -1
  360. package/dist/store/actions/reparent.test.js +0 -212
  361. package/dist/store/use-scene-elevator-migration.test.d.ts +0 -2
  362. package/dist/store/use-scene-elevator-migration.test.d.ts.map +0 -1
  363. package/dist/store/use-scene-elevator-migration.test.js +0 -109
  364. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +0 -2
  365. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +0 -1
  366. package/dist/systems/elevator/elevator-opening-sync.test.js +0 -146
  367. package/dist/systems/elevator/elevator-runtime.test.d.ts +0 -2
  368. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +0 -1
  369. package/dist/systems/elevator/elevator-runtime.test.js +0 -64
  370. package/dist/systems/stair/stair-opening-preview.test.d.ts +0 -2
  371. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +0 -1
  372. package/dist/systems/stair/stair-opening-preview.test.js +0 -80
  373. package/dist/systems/stair/stair-opening-sync.test.d.ts +0 -2
  374. package/dist/systems/stair/stair-opening-sync.test.d.ts.map +0 -1
  375. package/dist/systems/stair/stair-opening-sync.test.js +0 -446
  376. package/dist/utils/clone-scene-graph.test.d.ts +0 -2
  377. package/dist/utils/clone-scene-graph.test.d.ts.map +0 -1
  378. package/dist/utils/clone-scene-graph.test.js +0 -59
@@ -1,5 +1,128 @@
1
1
  import { z } from 'zod';
2
2
  import { MaterialSchema } from '../material';
3
+ export declare const WallTreatmentSide: z.ZodEnum<{
4
+ interior: "interior";
5
+ exterior: "exterior";
6
+ both: "both";
7
+ }>;
8
+ export type WallTreatmentSide = z.infer<typeof WallTreatmentSide>;
9
+ export declare const WallTrimProfile: z.ZodEnum<{
10
+ flat: "flat";
11
+ bevel: "bevel";
12
+ triangle: "triangle";
13
+ cove: "cove";
14
+ bullnose: "bullnose";
15
+ "base-modern": "base-modern";
16
+ "base-colonial": "base-colonial";
17
+ "base-shoe": "base-shoe";
18
+ "base-ogee": "base-ogee";
19
+ "crown-cove": "crown-cove";
20
+ "crown-ogee": "crown-ogee";
21
+ "crown-craftsman": "crown-craftsman";
22
+ "crown-layered": "crown-layered";
23
+ "rail-rounded": "rail-rounded";
24
+ "rail-ogee": "rail-ogee";
25
+ "rail-picture": "rail-picture";
26
+ "rail-stepped": "rail-stepped";
27
+ }>;
28
+ export type WallTrimProfile = z.infer<typeof WallTrimProfile>;
29
+ export declare const WallTrimConfig: z.ZodObject<{
30
+ enabled: z.ZodDefault<z.ZodBoolean>;
31
+ sides: z.ZodDefault<z.ZodEnum<{
32
+ interior: "interior";
33
+ exterior: "exterior";
34
+ both: "both";
35
+ }>>;
36
+ height: z.ZodDefault<z.ZodNumber>;
37
+ proud: z.ZodDefault<z.ZodNumber>;
38
+ profile: z.ZodDefault<z.ZodEnum<{
39
+ flat: "flat";
40
+ bevel: "bevel";
41
+ triangle: "triangle";
42
+ cove: "cove";
43
+ bullnose: "bullnose";
44
+ "base-modern": "base-modern";
45
+ "base-colonial": "base-colonial";
46
+ "base-shoe": "base-shoe";
47
+ "base-ogee": "base-ogee";
48
+ "crown-cove": "crown-cove";
49
+ "crown-ogee": "crown-ogee";
50
+ "crown-craftsman": "crown-craftsman";
51
+ "crown-layered": "crown-layered";
52
+ "rail-rounded": "rail-rounded";
53
+ "rail-ogee": "rail-ogee";
54
+ "rail-picture": "rail-picture";
55
+ "rail-stepped": "rail-stepped";
56
+ }>>;
57
+ offsetY: z.ZodOptional<z.ZodNumber>;
58
+ }, z.core.$strip>;
59
+ export type WallTrimConfig = z.infer<typeof WallTrimConfig>;
60
+ export declare const WALL_SKIRTING_DEFAULT: WallTrimConfig;
61
+ export declare const WALL_CROWN_DEFAULT: WallTrimConfig;
62
+ export declare const WALL_CHAIR_RAIL_DEFAULT: WallTrimConfig;
63
+ export declare const WALL_TRIM_DEFAULTS: {
64
+ readonly skirting: {
65
+ enabled: boolean;
66
+ sides: "interior" | "exterior" | "both";
67
+ height: number;
68
+ proud: number;
69
+ 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";
70
+ offsetY?: number | undefined;
71
+ };
72
+ readonly crown: {
73
+ enabled: boolean;
74
+ sides: "interior" | "exterior" | "both";
75
+ height: number;
76
+ proud: number;
77
+ 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";
78
+ offsetY?: number | undefined;
79
+ };
80
+ readonly chairRail: {
81
+ enabled: boolean;
82
+ sides: "interior" | "exterior" | "both";
83
+ height: number;
84
+ proud: number;
85
+ 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";
86
+ offsetY?: number | undefined;
87
+ };
88
+ };
89
+ export declare const WallFaceBandConfig: z.ZodPreprocess<z.ZodObject<{
90
+ enabled: z.ZodDefault<z.ZodBoolean>;
91
+ count: z.ZodDefault<z.ZodNumber>;
92
+ lowerHeight: z.ZodDefault<z.ZodNumber>;
93
+ middleHeight: z.ZodDefault<z.ZodNumber>;
94
+ upperHeight: z.ZodDefault<z.ZodNumber>;
95
+ }, z.core.$strip>>;
96
+ export type WallFaceBandConfig = z.infer<typeof WallFaceBandConfig>;
97
+ export declare const WALL_FACE_BAND_DEFAULT: WallFaceBandConfig;
98
+ export declare const WALL_SKIRTING_SLOT_DEFAULT = "library:preset-softwhite";
99
+ export declare const WALL_CROWN_SLOT_DEFAULT = "library:preset-white";
100
+ export declare const WALL_CHAIR_RAIL_SLOT_DEFAULT = "library:preset-cream";
101
+ export declare const WALL_FACE_BAND_SOLID_SLOT_DEFAULTS: {
102
+ readonly lower: "library:preset-white";
103
+ readonly middle: "library:preset-lightgrey";
104
+ readonly upper: "library:preset-greige";
105
+ readonly top: "library:preset-softwhite";
106
+ };
107
+ export declare const WALL_SURFACE_SLOT_DEFAULTS: {
108
+ readonly interior: "library:concrete-drywall";
109
+ readonly exterior: "library:concrete-drywall";
110
+ readonly lowerInterior: "library:concrete-drywall";
111
+ readonly middleInterior: "library:concrete-drywall";
112
+ readonly upperInterior: "library:concrete-drywall";
113
+ readonly topInterior: "library:concrete-drywall";
114
+ readonly lowerExterior: "library:concrete-drywall";
115
+ readonly middleExterior: "library:concrete-drywall";
116
+ readonly upperExterior: "library:concrete-drywall";
117
+ readonly topExterior: "library:concrete-drywall";
118
+ readonly skirtingInterior: "library:preset-softwhite";
119
+ readonly skirtingExterior: "library:preset-softwhite";
120
+ readonly crownInterior: "library:preset-white";
121
+ readonly crownExterior: "library:preset-white";
122
+ readonly chairRailInterior: "library:preset-cream";
123
+ readonly chairRailExterior: "library:preset-cream";
124
+ };
125
+ export type WallSurfaceSlotId = keyof typeof WALL_SURFACE_SLOT_DEFAULTS;
3
126
  export declare const WallNode: z.ZodObject<{
4
127
  object: z.ZodDefault<z.ZodLiteral<"node">>;
5
128
  name: z.ZodOptional<z.ZodString>;
@@ -21,7 +144,7 @@ export declare const WallNode: z.ZodObject<{
21
144
  children: z.ZodDefault<z.ZodArray<z.ZodUnion<readonly [z.ZodDefault<z.ZodTemplateLiteral<`item_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`door_${string}`>>, z.ZodDefault<z.ZodTemplateLiteral<`window_${string}`>>]>>>;
22
145
  material: z.ZodOptional<z.ZodObject<{
23
146
  id: z.ZodOptional<z.ZodString>;
24
- preset: z.ZodOptional<z.ZodEnum<{
147
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
25
148
  custom: "custom";
26
149
  white: "white";
27
150
  brick: "brick";
@@ -32,7 +155,7 @@ export declare const WallNode: z.ZodObject<{
32
155
  plaster: "plaster";
33
156
  tile: "tile";
34
157
  marble: "marble";
35
- }>>;
158
+ }>>>;
36
159
  properties: z.ZodOptional<z.ZodObject<{
37
160
  color: z.ZodDefault<z.ZodString>;
38
161
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -54,7 +177,7 @@ export declare const WallNode: z.ZodObject<{
54
177
  materialPreset: z.ZodOptional<z.ZodString>;
55
178
  interiorMaterial: z.ZodOptional<z.ZodObject<{
56
179
  id: z.ZodOptional<z.ZodString>;
57
- preset: z.ZodOptional<z.ZodEnum<{
180
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
58
181
  custom: "custom";
59
182
  white: "white";
60
183
  brick: "brick";
@@ -65,7 +188,7 @@ export declare const WallNode: z.ZodObject<{
65
188
  plaster: "plaster";
66
189
  tile: "tile";
67
190
  marble: "marble";
68
- }>>;
191
+ }>>>;
69
192
  properties: z.ZodOptional<z.ZodObject<{
70
193
  color: z.ZodDefault<z.ZodString>;
71
194
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -87,7 +210,7 @@ export declare const WallNode: z.ZodObject<{
87
210
  interiorMaterialPreset: z.ZodOptional<z.ZodString>;
88
211
  exteriorMaterial: z.ZodOptional<z.ZodObject<{
89
212
  id: z.ZodOptional<z.ZodString>;
90
- preset: z.ZodOptional<z.ZodEnum<{
213
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
91
214
  custom: "custom";
92
215
  white: "white";
93
216
  brick: "brick";
@@ -98,7 +221,7 @@ export declare const WallNode: z.ZodObject<{
98
221
  plaster: "plaster";
99
222
  tile: "tile";
100
223
  marble: "marble";
101
- }>>;
224
+ }>>>;
102
225
  properties: z.ZodOptional<z.ZodObject<{
103
226
  color: z.ZodDefault<z.ZodString>;
104
227
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -118,9 +241,110 @@ export declare const WallNode: z.ZodObject<{
118
241
  }, z.core.$strip>>;
119
242
  }, z.core.$strip>>;
120
243
  exteriorMaterialPreset: z.ZodOptional<z.ZodString>;
244
+ slots: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
121
245
  thickness: z.ZodOptional<z.ZodNumber>;
122
246
  height: z.ZodOptional<z.ZodNumber>;
123
247
  curveOffset: z.ZodOptional<z.ZodNumber>;
248
+ supportSlabId: z.ZodOptional<z.ZodString>;
249
+ supportOffset: z.ZodOptional<z.ZodNumber>;
250
+ fillToTerrain: z.ZodOptional<z.ZodBoolean>;
251
+ faceBands: z.ZodOptional<z.ZodPreprocess<z.ZodObject<{
252
+ enabled: z.ZodDefault<z.ZodBoolean>;
253
+ count: z.ZodDefault<z.ZodNumber>;
254
+ lowerHeight: z.ZodDefault<z.ZodNumber>;
255
+ middleHeight: z.ZodDefault<z.ZodNumber>;
256
+ upperHeight: z.ZodDefault<z.ZodNumber>;
257
+ }, z.core.$strip>>>;
258
+ skirting: z.ZodOptional<z.ZodObject<{
259
+ enabled: z.ZodDefault<z.ZodBoolean>;
260
+ sides: z.ZodDefault<z.ZodEnum<{
261
+ interior: "interior";
262
+ exterior: "exterior";
263
+ both: "both";
264
+ }>>;
265
+ height: z.ZodDefault<z.ZodNumber>;
266
+ proud: z.ZodDefault<z.ZodNumber>;
267
+ profile: z.ZodDefault<z.ZodEnum<{
268
+ flat: "flat";
269
+ bevel: "bevel";
270
+ triangle: "triangle";
271
+ cove: "cove";
272
+ bullnose: "bullnose";
273
+ "base-modern": "base-modern";
274
+ "base-colonial": "base-colonial";
275
+ "base-shoe": "base-shoe";
276
+ "base-ogee": "base-ogee";
277
+ "crown-cove": "crown-cove";
278
+ "crown-ogee": "crown-ogee";
279
+ "crown-craftsman": "crown-craftsman";
280
+ "crown-layered": "crown-layered";
281
+ "rail-rounded": "rail-rounded";
282
+ "rail-ogee": "rail-ogee";
283
+ "rail-picture": "rail-picture";
284
+ "rail-stepped": "rail-stepped";
285
+ }>>;
286
+ offsetY: z.ZodOptional<z.ZodNumber>;
287
+ }, z.core.$strip>>;
288
+ crown: z.ZodOptional<z.ZodObject<{
289
+ enabled: z.ZodDefault<z.ZodBoolean>;
290
+ sides: z.ZodDefault<z.ZodEnum<{
291
+ interior: "interior";
292
+ exterior: "exterior";
293
+ both: "both";
294
+ }>>;
295
+ height: z.ZodDefault<z.ZodNumber>;
296
+ proud: z.ZodDefault<z.ZodNumber>;
297
+ profile: z.ZodDefault<z.ZodEnum<{
298
+ flat: "flat";
299
+ bevel: "bevel";
300
+ triangle: "triangle";
301
+ cove: "cove";
302
+ bullnose: "bullnose";
303
+ "base-modern": "base-modern";
304
+ "base-colonial": "base-colonial";
305
+ "base-shoe": "base-shoe";
306
+ "base-ogee": "base-ogee";
307
+ "crown-cove": "crown-cove";
308
+ "crown-ogee": "crown-ogee";
309
+ "crown-craftsman": "crown-craftsman";
310
+ "crown-layered": "crown-layered";
311
+ "rail-rounded": "rail-rounded";
312
+ "rail-ogee": "rail-ogee";
313
+ "rail-picture": "rail-picture";
314
+ "rail-stepped": "rail-stepped";
315
+ }>>;
316
+ offsetY: z.ZodOptional<z.ZodNumber>;
317
+ }, z.core.$strip>>;
318
+ chairRail: z.ZodOptional<z.ZodObject<{
319
+ enabled: z.ZodDefault<z.ZodBoolean>;
320
+ sides: z.ZodDefault<z.ZodEnum<{
321
+ interior: "interior";
322
+ exterior: "exterior";
323
+ both: "both";
324
+ }>>;
325
+ height: z.ZodDefault<z.ZodNumber>;
326
+ proud: z.ZodDefault<z.ZodNumber>;
327
+ profile: z.ZodDefault<z.ZodEnum<{
328
+ flat: "flat";
329
+ bevel: "bevel";
330
+ triangle: "triangle";
331
+ cove: "cove";
332
+ bullnose: "bullnose";
333
+ "base-modern": "base-modern";
334
+ "base-colonial": "base-colonial";
335
+ "base-shoe": "base-shoe";
336
+ "base-ogee": "base-ogee";
337
+ "crown-cove": "crown-cove";
338
+ "crown-ogee": "crown-ogee";
339
+ "crown-craftsman": "crown-craftsman";
340
+ "crown-layered": "crown-layered";
341
+ "rail-rounded": "rail-rounded";
342
+ "rail-ogee": "rail-ogee";
343
+ "rail-picture": "rail-picture";
344
+ "rail-stepped": "rail-stepped";
345
+ }>>;
346
+ offsetY: z.ZodOptional<z.ZodNumber>;
347
+ }, z.core.$strip>>;
124
348
  start: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
125
349
  end: z.ZodTuple<[z.ZodNumber, z.ZodNumber], null>;
126
350
  frontSide: z.ZodDefault<z.ZodEnum<{
@@ -136,6 +360,24 @@ export declare const WallNode: z.ZodObject<{
136
360
  }, z.core.$strip>;
137
361
  export type WallNode = z.infer<typeof WallNode>;
138
362
  export type WallSurfaceSide = 'interior' | 'exterior';
363
+ export type WallFaceBand = 'lower' | 'middle' | 'upper' | 'top';
364
+ export type WallBandSurfaceSlotId = 'lowerInterior' | 'middleInterior' | 'upperInterior' | 'topInterior' | 'lowerExterior' | 'middleExterior' | 'upperExterior' | 'topExterior';
365
+ export declare const WALL_SLOT_DEFAULT: Record<WallSurfaceSide, string>;
366
+ export declare function getWallFaceBandConfig(wall: Pick<WallNode, 'height' | 'faceBands'>, effectiveWallHeight: number): {
367
+ enabled: boolean;
368
+ count: number;
369
+ lowerHeight: number;
370
+ middleHeight: number;
371
+ upperHeight: number;
372
+ lowerTop: number;
373
+ middleTop: number;
374
+ upperTop: number;
375
+ };
376
+ export declare function getWallFaceBandForHeight(wall: Pick<WallNode, 'height' | 'faceBands'>, y: number, effectiveWallHeight: number): WallFaceBand;
377
+ export declare function getWallBandSlotId(side: WallSurfaceSide, band: WallFaceBand): WallBandSurfaceSlotId;
378
+ export declare function buildWallFaceBandCountPatch(wall: Pick<WallNode, 'faceBands' | 'slots'>, count: number): Pick<WallNode, 'faceBands' | 'slots'>;
379
+ export declare function buildEnabledWallFaceBandPatch(wall: Pick<WallNode, 'faceBands' | 'slots'>): Pick<WallNode, 'faceBands' | 'slots'>;
380
+ export declare function getWallSurfaceSideFromBandSlot(slotId: string): WallSurfaceSide | null;
139
381
  export type WallSurfaceMaterialSpec = {
140
382
  material?: z.infer<typeof MaterialSchema>;
141
383
  materialPreset?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"wall.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/wall.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAK5C,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAmCpB,CAAA;AACD,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,QAAQ,CAAC,CAAA;AAE/C,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,UAAU,CAAA;AAErD,MAAM,MAAM,uBAAuB,GAAG;IACpC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;IACzC,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,KAAK,yBAAyB,GAAG;IAC/B,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;IACzC,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,gBAAgB,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;IACjD,sBAAsB,CAAC,EAAE,MAAM,CAAA;IAC/B,gBAAgB,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAA;IACjD,sBAAsB,CAAC,EAAE,MAAM,CAAA;CAChC,CAAA;AAuBD,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,yBAAyB,EAC/B,IAAI,EAAE,eAAe,GACpB,uBAAuB,CAUzB;AAED,wBAAgB,+BAA+B,CAAC,IAAI,EAAE,uBAAuB,GAAG,MAAM,CAKrF"}
1
+ {"version":3,"file":"wall.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/wall.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,109 @@ import { MaterialSchema } from '../material';
5
5
  import { DoorNode } from './door';
6
6
  import { ItemNode } from './item';
7
7
  import { WindowNode } from './window';
8
+ export const WallTreatmentSide = z.enum(['interior', 'exterior', 'both']);
9
+ export const WallTrimProfile = z.enum([
10
+ 'flat',
11
+ 'bevel',
12
+ 'triangle',
13
+ 'cove',
14
+ 'bullnose',
15
+ 'base-modern',
16
+ 'base-colonial',
17
+ 'base-shoe',
18
+ 'base-ogee',
19
+ 'crown-cove',
20
+ 'crown-ogee',
21
+ 'crown-craftsman',
22
+ 'crown-layered',
23
+ 'rail-rounded',
24
+ 'rail-ogee',
25
+ 'rail-picture',
26
+ 'rail-stepped',
27
+ ]);
28
+ export const WallTrimConfig = z.object({
29
+ enabled: z.boolean().default(false),
30
+ sides: WallTreatmentSide.default('both'),
31
+ height: z.number().default(0.1),
32
+ proud: z.number().default(0.015),
33
+ profile: WallTrimProfile.default('flat'),
34
+ offsetY: z.number().optional(),
35
+ });
36
+ export const WALL_SKIRTING_DEFAULT = {
37
+ enabled: false,
38
+ sides: 'both',
39
+ height: 0.12,
40
+ proud: 0.02,
41
+ profile: 'flat',
42
+ };
43
+ export const WALL_CROWN_DEFAULT = {
44
+ enabled: false,
45
+ sides: 'both',
46
+ height: 0.12,
47
+ proud: 0.055,
48
+ profile: 'flat',
49
+ };
50
+ export const WALL_CHAIR_RAIL_DEFAULT = {
51
+ enabled: false,
52
+ sides: 'both',
53
+ height: 0.055,
54
+ proud: 0.026,
55
+ profile: 'flat',
56
+ offsetY: 0.9,
57
+ };
58
+ export const WALL_TRIM_DEFAULTS = {
59
+ skirting: WALL_SKIRTING_DEFAULT,
60
+ crown: WALL_CROWN_DEFAULT,
61
+ chairRail: WALL_CHAIR_RAIL_DEFAULT,
62
+ };
63
+ const WallFaceBandConfigShape = z.object({
64
+ enabled: z.boolean().default(false),
65
+ count: z.number().int().min(1).max(4).default(1),
66
+ lowerHeight: z.number().default(0.84),
67
+ middleHeight: z.number().default(0.61),
68
+ upperHeight: z.number().default(0.61),
69
+ });
70
+ export const WallFaceBandConfig = z.preprocess((value) => {
71
+ if (value && typeof value === 'object' && !Array.isArray(value) && !('count' in value)) {
72
+ const enabled = value.enabled === true;
73
+ return { ...value, count: enabled ? 3 : 1 };
74
+ }
75
+ return value;
76
+ }, WallFaceBandConfigShape);
77
+ export const WALL_FACE_BAND_DEFAULT = {
78
+ enabled: false,
79
+ count: 1,
80
+ lowerHeight: 0.84,
81
+ middleHeight: 0.61,
82
+ upperHeight: 0.61,
83
+ };
84
+ export const WALL_SKIRTING_SLOT_DEFAULT = 'library:preset-softwhite';
85
+ export const WALL_CROWN_SLOT_DEFAULT = 'library:preset-white';
86
+ export const WALL_CHAIR_RAIL_SLOT_DEFAULT = 'library:preset-cream';
87
+ export const WALL_FACE_BAND_SOLID_SLOT_DEFAULTS = {
88
+ lower: 'library:preset-white',
89
+ middle: 'library:preset-lightgrey',
90
+ upper: 'library:preset-greige',
91
+ top: 'library:preset-softwhite',
92
+ };
93
+ export const WALL_SURFACE_SLOT_DEFAULTS = {
94
+ interior: 'library:concrete-drywall',
95
+ exterior: 'library:concrete-drywall',
96
+ lowerInterior: 'library:concrete-drywall',
97
+ middleInterior: 'library:concrete-drywall',
98
+ upperInterior: 'library:concrete-drywall',
99
+ topInterior: 'library:concrete-drywall',
100
+ lowerExterior: 'library:concrete-drywall',
101
+ middleExterior: 'library:concrete-drywall',
102
+ upperExterior: 'library:concrete-drywall',
103
+ topExterior: 'library:concrete-drywall',
104
+ skirtingInterior: WALL_SKIRTING_SLOT_DEFAULT,
105
+ skirtingExterior: WALL_SKIRTING_SLOT_DEFAULT,
106
+ crownInterior: WALL_CROWN_SLOT_DEFAULT,
107
+ crownExterior: WALL_CROWN_SLOT_DEFAULT,
108
+ chairRailInterior: WALL_CHAIR_RAIL_SLOT_DEFAULT,
109
+ chairRailExterior: WALL_CHAIR_RAIL_SLOT_DEFAULT,
110
+ };
8
111
  export const WallNode = BaseNode.extend({
9
112
  id: objectId('wall'),
10
113
  type: nodeType('wall'),
@@ -19,9 +122,28 @@ export const WallNode = BaseNode.extend({
19
122
  interiorMaterialPreset: z.string().optional(),
20
123
  exteriorMaterial: MaterialSchema.optional(),
21
124
  exteriorMaterialPreset: z.string().optional(),
125
+ // Per-slot material overrides on the unified slot model, mirroring
126
+ // `SlabNode.slots`. Key = slot id (`interior` / `exterior`), value = a
127
+ // `MaterialRef` (`library:<id>` / `scene:<id>`). Absent = the declared slot
128
+ // default (`WALL_SLOT_DEFAULT`). The legacy `*Material*` fields above are
129
+ // read only by the load migration that moves them into `slots`; delete them
130
+ // in a follow-up once migrated scenes are the norm.
131
+ slots: z.record(z.string(), z.string()).optional(),
22
132
  thickness: z.number().optional(),
23
133
  height: z.number().optional(),
24
134
  curveOffset: z.number().optional(),
135
+ // Persisted slab-support host — see ItemNode.supportSlabId for the rules.
136
+ supportSlabId: z.string().optional(),
137
+ // Vertical offset from the elected support surface. Ground-hosted chained
138
+ // walls use this to preserve one construction plane without copying terrain.
139
+ supportOffset: z.number().finite().optional(),
140
+ // Extend downward from the authored wall base to the terrain while keeping
141
+ // the wall body height and top unchanged.
142
+ fillToTerrain: z.boolean().optional(),
143
+ faceBands: WallFaceBandConfig.optional(),
144
+ skirting: WallTrimConfig.optional(),
145
+ crown: WallTrimConfig.optional(),
146
+ chairRail: WallTrimConfig.optional(),
25
147
  // e.g., start/end points for path
26
148
  start: z.tuple([z.number(), z.number()]),
27
149
  end: z.tuple([z.number(), z.number()]),
@@ -32,6 +154,7 @@ export const WallNode = BaseNode.extend({
32
154
  Wall node - used to represent a wall in the building
33
155
  - thickness: thickness in meters
34
156
  - height: height in meters
157
+ - fillToTerrain: extends the wall downward to the terrain without changing its authored height
35
158
  - curveOffset: midpoint sagitta offset used to bend the wall into an arc
36
159
  - start: start point of the wall in level coordinate system
37
160
  - end: end point of the wall in level coordinate system
@@ -39,6 +162,149 @@ export const WallNode = BaseNode.extend({
39
162
  - frontSide: whether the front side faces interior, exterior, or unknown
40
163
  - backSide: whether the back side faces interior, exterior, or unknown
41
164
  `);
165
+ // Declared default appearance for an unpainted wall face in colored mode —
166
+ // visual parity with the retired DEFAULT_WALL_MATERIAL. Lives in core so the
167
+ // slot declaration (nodes) and the material resolver (viewer) share one value.
168
+ // May be a `#rrggbb` colour or a `library:<id>` ref. Textures-off still
169
+ // collapses to the themed wall role (the escape hatch).
170
+ export const WALL_SLOT_DEFAULT = {
171
+ interior: WALL_SURFACE_SLOT_DEFAULTS.interior,
172
+ exterior: WALL_SURFACE_SLOT_DEFAULTS.exterior,
173
+ };
174
+ export function getWallFaceBandConfig(wall, effectiveWallHeight) {
175
+ const wallHeight = Math.max(0, effectiveWallHeight);
176
+ const raw = { ...WALL_FACE_BAND_DEFAULT, ...(wall.faceBands ?? {}) };
177
+ const count = raw.enabled ? Math.max(1, Math.min(4, Math.round(raw.count ?? 3))) : 1;
178
+ const lowerHeight = count >= 2 ? Math.max(0, Math.min(wallHeight, raw.lowerHeight)) : 0;
179
+ const middleHeight = count >= 3 ? Math.max(0, Math.min(wallHeight - lowerHeight, raw.middleHeight)) : 0;
180
+ const upperHeight = count >= 4 ? Math.max(0, Math.min(wallHeight - lowerHeight - middleHeight, raw.upperHeight)) : 0;
181
+ return {
182
+ enabled: raw.enabled && count > 1,
183
+ count,
184
+ lowerHeight,
185
+ middleHeight,
186
+ upperHeight,
187
+ lowerTop: lowerHeight,
188
+ middleTop: lowerHeight + middleHeight,
189
+ upperTop: lowerHeight + middleHeight + upperHeight,
190
+ };
191
+ }
192
+ export function getWallFaceBandForHeight(wall, y, effectiveWallHeight) {
193
+ const bands = getWallFaceBandConfig(wall, effectiveWallHeight);
194
+ if (!bands.enabled)
195
+ return 'upper';
196
+ if (y < bands.lowerTop)
197
+ return 'lower';
198
+ if (y < bands.middleTop)
199
+ return 'middle';
200
+ if (bands.count >= 4 && y < bands.upperTop)
201
+ return 'upper';
202
+ if (bands.count >= 4)
203
+ return 'top';
204
+ return 'upper';
205
+ }
206
+ export function getWallBandSlotId(side, band) {
207
+ const suffix = side === 'interior' ? 'Interior' : 'Exterior';
208
+ return `${band}${suffix}`;
209
+ }
210
+ const WALL_FACE_BAND_SLOTS_BY_SIDE = {
211
+ interior: ['lowerInterior', 'middleInterior', 'upperInterior', 'topInterior'],
212
+ exterior: ['lowerExterior', 'middleExterior', 'upperExterior', 'topExterior'],
213
+ };
214
+ function getWallFaceBandSlotsForCount(side, count) {
215
+ if (count <= 1)
216
+ return [];
217
+ if (side === 'interior') {
218
+ if (count === 2)
219
+ return ['lowerInterior', 'upperInterior'];
220
+ if (count === 3)
221
+ return ['lowerInterior', 'middleInterior', 'upperInterior'];
222
+ return ['lowerInterior', 'middleInterior', 'upperInterior', 'topInterior'];
223
+ }
224
+ if (count === 2)
225
+ return ['lowerExterior', 'upperExterior'];
226
+ if (count === 3)
227
+ return ['lowerExterior', 'middleExterior', 'upperExterior'];
228
+ return ['lowerExterior', 'middleExterior', 'upperExterior', 'topExterior'];
229
+ }
230
+ function getWallFaceBandDefaultSlot(slotId) {
231
+ if (slotId.startsWith('lower'))
232
+ return WALL_FACE_BAND_SOLID_SLOT_DEFAULTS.lower;
233
+ if (slotId.startsWith('middle'))
234
+ return WALL_FACE_BAND_SOLID_SLOT_DEFAULTS.middle;
235
+ if (slotId.startsWith('top'))
236
+ return WALL_FACE_BAND_SOLID_SLOT_DEFAULTS.top;
237
+ return WALL_FACE_BAND_SOLID_SLOT_DEFAULTS.upper;
238
+ }
239
+ function getWallFaceTopBandSlot(side, count) {
240
+ const slots = getWallFaceBandSlotsForCount(side, count);
241
+ return slots[slots.length - 1] ?? null;
242
+ }
243
+ export function buildWallFaceBandCountPatch(wall, count) {
244
+ const slots = { ...(wall.slots ?? {}) };
245
+ const nextCount = Math.max(1, Math.min(4, Math.round(count)));
246
+ const previousCount = wall.faceBands?.enabled
247
+ ? Math.max(1, Math.min(4, Math.round(wall.faceBands.count ?? 3)))
248
+ : 1;
249
+ for (const side of ['interior', 'exterior']) {
250
+ const nextSlots = getWallFaceBandSlotsForCount(side, nextCount);
251
+ const activeSlots = new Set(nextSlots);
252
+ const previouslyActiveSlots = new Set(getWallFaceBandSlotsForCount(side, previousCount));
253
+ const previousTopSlot = getWallFaceTopBandSlot(side, previousCount);
254
+ const nextTopSlot = getWallFaceTopBandSlot(side, nextCount);
255
+ const topMaterial = (previousTopSlot ? slots[previousTopSlot] : undefined) ??
256
+ slots[side] ??
257
+ WALL_SURFACE_SLOT_DEFAULTS[side];
258
+ for (const slotId of WALL_FACE_BAND_SLOTS_BY_SIDE[side]) {
259
+ if (activeSlots.has(slotId)) {
260
+ if (slotId === nextTopSlot) {
261
+ slots[slotId] = topMaterial;
262
+ continue;
263
+ }
264
+ const wasActive = previouslyActiveSlots.has(slotId);
265
+ const wasPreviousTop = slotId === previousTopSlot;
266
+ if (!wasActive || wasPreviousTop || !slots[slotId]) {
267
+ slots[slotId] = getWallFaceBandDefaultSlot(slotId);
268
+ }
269
+ }
270
+ else {
271
+ delete slots[slotId];
272
+ }
273
+ }
274
+ }
275
+ return {
276
+ faceBands: {
277
+ ...WALL_FACE_BAND_DEFAULT,
278
+ ...(wall.faceBands ?? {}),
279
+ enabled: nextCount > 1,
280
+ count: nextCount,
281
+ lowerHeight: wall.faceBands?.lowerHeight ?? WALL_FACE_BAND_DEFAULT.lowerHeight,
282
+ middleHeight: wall.faceBands?.middleHeight ?? WALL_FACE_BAND_DEFAULT.middleHeight,
283
+ upperHeight: wall.faceBands?.upperHeight ?? WALL_FACE_BAND_DEFAULT.upperHeight,
284
+ },
285
+ slots,
286
+ };
287
+ }
288
+ export function buildEnabledWallFaceBandPatch(wall) {
289
+ return buildWallFaceBandCountPatch(wall, 2);
290
+ }
291
+ export function getWallSurfaceSideFromBandSlot(slotId) {
292
+ if (slotId === 'interior' || slotId === 'exterior')
293
+ return slotId;
294
+ if (slotId === 'lowerInterior' ||
295
+ slotId === 'middleInterior' ||
296
+ slotId === 'upperInterior' ||
297
+ slotId === 'topInterior') {
298
+ return 'interior';
299
+ }
300
+ if (slotId === 'lowerExterior' ||
301
+ slotId === 'middleExterior' ||
302
+ slotId === 'upperExterior' ||
303
+ slotId === 'topExterior') {
304
+ return 'exterior';
305
+ }
306
+ return null;
307
+ }
42
308
  function getConfiguredWallSurfaceMaterial(wall, side) {
43
309
  if (side === 'interior') {
44
310
  return {