@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
@@ -0,0 +1,330 @@
1
+ import { getDutchRoofMetrics, getSegmentSlopeFrame } from './roof-segment';
2
+ function getWallVolumeFrame(node) {
3
+ const { activeRh, tanTheta } = getSegmentSlopeFrame(node);
4
+ const wallThickness = node.wallThickness ?? 0.1;
5
+ const autoDrop = (wallThickness / 2) * tanTheta;
6
+ const wV = Math.max(0.01, node.width + wallThickness);
7
+ const dV = Math.max(0.01, node.depth + wallThickness);
8
+ const eaveY = Math.max(0.01, node.wallHeight - autoDrop);
9
+ let rh = activeRh;
10
+ if (activeRh > 0) {
11
+ rh = activeRh + autoDrop;
12
+ if (node.roofType === 'shed')
13
+ rh = activeRh + 2 * autoDrop;
14
+ }
15
+ return {
16
+ wV,
17
+ dV,
18
+ eaveY,
19
+ peakY: eaveY + Math.max(0.001, rh),
20
+ tanTheta,
21
+ hasSlope: activeRh > 0,
22
+ };
23
+ }
24
+ const FACE_NORMALS = {
25
+ front: [0, 0, 1],
26
+ back: [0, 0, -1],
27
+ right: [1, 0, 0],
28
+ left: [-1, 0, 0],
29
+ };
30
+ const FACE_YAWS = {
31
+ front: 0,
32
+ back: Math.PI,
33
+ right: Math.PI / 2,
34
+ left: -Math.PI / 2,
35
+ };
36
+ function rectProfile(length, top) {
37
+ return [
38
+ [0, 0],
39
+ [length, 0],
40
+ [length, top],
41
+ [0, top],
42
+ ];
43
+ }
44
+ function buildFaceProfile(node, frame, id) {
45
+ const { wV, dV, eaveY, peakY, tanTheta, hasSlope } = frame;
46
+ const isEnd = id === 'right' || id === 'left';
47
+ const length = isEnd ? dV : wV;
48
+ if (!hasSlope)
49
+ return rectProfile(length, eaveY);
50
+ switch (node.roofType) {
51
+ case 'gable': {
52
+ if (!isEnd)
53
+ return rectProfile(length, eaveY);
54
+ return [
55
+ [0, 0],
56
+ [length, 0],
57
+ [length, eaveY],
58
+ [length / 2, peakY],
59
+ [0, eaveY],
60
+ ];
61
+ }
62
+ case 'gambrel': {
63
+ if (!isEnd)
64
+ return rectProfile(length, eaveY);
65
+ // Kink ring sits at z = ±mz on the nominal footprint (see
66
+ // getModuleFaces); both end faces are symmetric about u = length/2.
67
+ const ratio = node.gambrelLowerWidthRatio ?? 0.5;
68
+ const mz = Math.min((node.depth / 2) * ratio, length / 2);
69
+ const kinkY = eaveY + (length / 2 - mz) * tanTheta;
70
+ return [
71
+ [0, 0],
72
+ [length, 0],
73
+ [length, eaveY],
74
+ [length / 2 + mz, kinkY],
75
+ [length / 2, peakY],
76
+ [length / 2 - mz, kinkY],
77
+ [0, eaveY],
78
+ ];
79
+ }
80
+ case 'shed': {
81
+ // Slope falls toward +Z: 'back' is the full-height wall, the end
82
+ // faces are right trapezoids rising toward the back edge.
83
+ if (id === 'front')
84
+ return rectProfile(length, eaveY);
85
+ if (id === 'back')
86
+ return rectProfile(length, peakY);
87
+ if (id === 'right') {
88
+ return [
89
+ [0, 0],
90
+ [length, 0],
91
+ [length, peakY],
92
+ [0, eaveY],
93
+ ];
94
+ }
95
+ return [
96
+ [0, 0],
97
+ [length, 0],
98
+ [length, eaveY],
99
+ [0, peakY],
100
+ ];
101
+ }
102
+ case 'dutch': {
103
+ const metrics = getDutchRoofMetrics(node);
104
+ const isDutchGableFace = (metrics.axis === 'x' && isEnd) ||
105
+ (metrics.axis === 'z' && (id === 'front' || id === 'back'));
106
+ if (!isDutchGableFace)
107
+ return rectProfile(length, eaveY);
108
+ const shoulderInset = metrics.axis === 'x' ? metrics.shoulderInsetAlongDepth : metrics.shoulderInsetAlongWidth;
109
+ if (!(shoulderInset > 0.001))
110
+ return rectProfile(length, eaveY);
111
+ const shoulderLo = Math.max(0, shoulderInset);
112
+ const shoulderHi = Math.min(length, length - shoulderInset);
113
+ if (!(shoulderHi - shoulderLo > 0.02))
114
+ return rectProfile(length, eaveY);
115
+ return [
116
+ [0, 0],
117
+ [length, 0],
118
+ [length, eaveY],
119
+ [shoulderHi, eaveY],
120
+ [length / 2, peakY],
121
+ [shoulderLo, eaveY],
122
+ [0, eaveY],
123
+ ];
124
+ }
125
+ default:
126
+ return rectProfile(length, eaveY);
127
+ }
128
+ }
129
+ export function getRoofSegmentWallFace(node, id) {
130
+ const frame = getWallVolumeFrame(node);
131
+ const isEnd = id === 'right' || id === 'left';
132
+ return {
133
+ id,
134
+ normal: FACE_NORMALS[id],
135
+ yaw: FACE_YAWS[id],
136
+ length: isEnd ? frame.dV : frame.wV,
137
+ profile: buildFaceProfile(node, frame, id),
138
+ };
139
+ }
140
+ export function getRoofSegmentWallFaces(node) {
141
+ const frame = getWallVolumeFrame(node);
142
+ return ['front', 'back', 'right', 'left'].map((id) => ({
143
+ id,
144
+ normal: FACE_NORMALS[id],
145
+ yaw: FACE_YAWS[id],
146
+ length: id === 'right' || id === 'left' ? frame.dV : frame.wV,
147
+ profile: buildFaceProfile(node, frame, id),
148
+ }));
149
+ }
150
+ /**
151
+ * Segment-local point → face coords. `dist` is the signed offset off the
152
+ * outer wall plane along the face normal (0 = on the plane, positive =
153
+ * outside the volume).
154
+ */
155
+ export function segmentPointToRoofWallFace(node, id, point) {
156
+ const { wV, dV } = getWallVolumeFrame(node);
157
+ const [x, y, z] = point;
158
+ switch (id) {
159
+ case 'front':
160
+ return { u: x + wV / 2, v: y, dist: z - dV / 2 };
161
+ case 'back':
162
+ return { u: wV / 2 - x, v: y, dist: -z - dV / 2 };
163
+ case 'right':
164
+ return { u: dV / 2 - z, v: y, dist: x - wV / 2 };
165
+ case 'left':
166
+ return { u: z + dV / 2, v: y, dist: -x - wV / 2 };
167
+ }
168
+ }
169
+ /**
170
+ * Inward half-plane constraints of the raw profile polygon (CCW →
171
+ * interior is to the left of each edge): a point p is inside when
172
+ * `nu·p.u + nv·p.v ≥ c` for every constraint.
173
+ */
174
+ function getProfileConstraints(face) {
175
+ const constraints = [];
176
+ const pts = face.profile;
177
+ for (let i = 0; i < pts.length; i++) {
178
+ const a = pts[i];
179
+ const b = pts[(i + 1) % pts.length];
180
+ const du = b[0] - a[0];
181
+ const dv = b[1] - a[1];
182
+ const len = Math.hypot(du, dv);
183
+ if (len < 1e-9)
184
+ continue;
185
+ const nu = -dv / len;
186
+ const nv = du / len;
187
+ constraints.push({ nu, nv, c: nu * a[0] + nv * a[1] });
188
+ }
189
+ return constraints;
190
+ }
191
+ /**
192
+ * Half-plane constraints for the CENTER of a `width × height` rect that
193
+ * must fit inside the face profile — the raw constraints eroded by the
194
+ * rect's half-extents projected on each edge normal.
195
+ */
196
+ function getRectCenterConstraints(face, width, height) {
197
+ return getProfileConstraints(face).map(({ nu, nv, c }) => ({
198
+ nu,
199
+ nv,
200
+ c: c + (Math.abs(nu) * width) / 2 + (Math.abs(nv) * height) / 2,
201
+ }));
202
+ }
203
+ /**
204
+ * The face's render frame in segment-local space: a group placed at
205
+ * `origin` and yawed by `yaw` maps face coords to segment space —
206
+ * frame X = U (along the face), frame Y = V (height), frame Z = the
207
+ * outward normal, with z = 0 on the WALL MID-PLANE. The mid-plane of
208
+ * the generated wall volume lands exactly on the nominal footprint
209
+ * (`±width/2` / `±depth/2`), so hosted children use the same position
210
+ * conventions as wall children (openings at z = 0, wall-side items
211
+ * pushed +thickness/2 at render time). Renderers derive this from the
212
+ * live-override-merged segment, which is what makes hosted children
213
+ * track segment edits live instead of jumping on commit.
214
+ */
215
+ export function getRoofWallFaceFrame(node, id) {
216
+ const { wV, dV } = getWallVolumeFrame(node);
217
+ switch (id) {
218
+ case 'front':
219
+ return { origin: [-wV / 2, 0, node.depth / 2], yaw: FACE_YAWS.front };
220
+ case 'back':
221
+ return { origin: [wV / 2, 0, -node.depth / 2], yaw: FACE_YAWS.back };
222
+ case 'right':
223
+ return { origin: [node.width / 2, 0, dV / 2], yaw: FACE_YAWS.right };
224
+ case 'left':
225
+ return { origin: [-node.width / 2, 0, -dV / 2], yaw: FACE_YAWS.left };
226
+ }
227
+ }
228
+ /** Face-frame point ([u, v, z-from-mid-plane]) → segment-local point. */
229
+ export function roofFacePointToSegment(node, id, point) {
230
+ const { origin, yaw } = getRoofWallFaceFrame(node, id);
231
+ const cos = Math.cos(yaw);
232
+ const sin = Math.sin(yaw);
233
+ const [u, v, z] = point;
234
+ // rotation-y: +x → (cos, 0, -sin), +z → (sin, 0, cos)
235
+ return [origin[0] + u * cos + z * sin, origin[1] + v, origin[2] - u * sin + z * cos];
236
+ }
237
+ /**
238
+ * Max width of a rect growing from an anchored vertical edge (`anchorU`)
239
+ * in direction `growSign` (±1 along U) while staying inside the face
240
+ * profile at the fixed vertical center `vCenter`. Resize-handle limit:
241
+ * the anchored-edge model matches the handles' apply math (opposite
242
+ * edge stays put, center re-derives).
243
+ */
244
+ export function getMaxRoofRectWidthFromAnchor(face, anchorU, growSign, vCenter, height) {
245
+ let max = Number.POSITIVE_INFINITY;
246
+ for (const { nu, nv, c } of getProfileConstraints(face)) {
247
+ // Center at anchorU + growSign·w/2, eroded by |nu|·w/2 + |nv|·h/2:
248
+ // base + k·w ≥ 0 with k ≤ 0 only when growth approaches the edge.
249
+ const k = (nu * growSign - Math.abs(nu)) / 2;
250
+ if (k >= -1e-9)
251
+ continue;
252
+ const base = nu * anchorU + nv * vCenter - c - (Math.abs(nv) * height) / 2;
253
+ max = Math.min(max, Math.max(0, base / -k));
254
+ }
255
+ return max;
256
+ }
257
+ /**
258
+ * Max height of a rect growing from an anchored horizontal edge
259
+ * (`anchorV`) in direction `growSign` (+1 = bottom anchored, grows up)
260
+ * while staying inside the face profile at the fixed horizontal center
261
+ * `uCenter`.
262
+ */
263
+ export function getMaxRoofRectHeightFromAnchor(face, uCenter, width, anchorV, growSign) {
264
+ let max = Number.POSITIVE_INFINITY;
265
+ for (const { nu, nv, c } of getProfileConstraints(face)) {
266
+ const k = (nv * growSign - Math.abs(nv)) / 2;
267
+ if (k >= -1e-9)
268
+ continue;
269
+ const base = nu * uCenter + nv * anchorV - c - (Math.abs(nu) * width) / 2;
270
+ max = Math.min(max, Math.max(0, base / -k));
271
+ }
272
+ return max;
273
+ }
274
+ const CLAMP_EPSILON = 1e-4;
275
+ /**
276
+ * Clamp a rect center so the rect fits inside the face profile.
277
+ *
278
+ * - `lockV: true` (doors): `v` is fixed; only `u` slides. Returns null
279
+ * when no `u` keeps the rect inside at that height.
280
+ * - otherwise (windows): the center is projected into the eroded convex
281
+ * region (cyclic projection — profiles are convex by construction).
282
+ *
283
+ * Returns null when the rect cannot fit anywhere on the face.
284
+ */
285
+ export function clampRectToRoofWallFace(face, u, v, width, height, opts) {
286
+ const constraints = getRectCenterConstraints(face, width, height);
287
+ if (constraints.length < 3)
288
+ return null;
289
+ if (opts?.lockV) {
290
+ let lo = Number.NEGATIVE_INFINITY;
291
+ let hi = Number.POSITIVE_INFINITY;
292
+ for (const { nu, nv, c } of constraints) {
293
+ const rhs = c - nv * v;
294
+ if (Math.abs(nu) < 1e-9) {
295
+ if (rhs > CLAMP_EPSILON)
296
+ return null;
297
+ continue;
298
+ }
299
+ if (nu > 0)
300
+ lo = Math.max(lo, rhs / nu);
301
+ else
302
+ hi = Math.min(hi, rhs / nu);
303
+ }
304
+ if (lo > hi + CLAMP_EPSILON)
305
+ return null;
306
+ return { u: Math.min(Math.max(u, lo), hi), v };
307
+ }
308
+ let pu = u;
309
+ let pv = v;
310
+ for (let iter = 0; iter < 32; iter++) {
311
+ let worst = null;
312
+ let worstViolation = CLAMP_EPSILON;
313
+ for (const constraint of constraints) {
314
+ const violation = constraint.c - (constraint.nu * pu + constraint.nv * pv);
315
+ if (violation > worstViolation) {
316
+ worstViolation = violation;
317
+ worst = constraint;
318
+ }
319
+ }
320
+ if (!worst)
321
+ return { u: pu, v: pv };
322
+ pu += worst.nu * worstViolation;
323
+ pv += worst.nv * worstViolation;
324
+ }
325
+ for (const { nu, nv, c } of constraints) {
326
+ if (nu * pu + nv * pv < c - 1e-3)
327
+ return null;
328
+ }
329
+ return { u: pu, v: pv };
330
+ }
@@ -10,6 +10,26 @@ export declare const RoofType: z.ZodEnum<{
10
10
  mansard: "mansard";
11
11
  }>;
12
12
  export type RoofType = z.infer<typeof RoofType>;
13
+ export declare const MIN_ROOF_SEGMENT_TRIM_SPAN = 0.1;
14
+ export declare const RoofSegmentTrim: z.ZodDefault<z.ZodObject<{
15
+ left: z.ZodDefault<z.ZodNumber>;
16
+ right: z.ZodDefault<z.ZodNumber>;
17
+ front: z.ZodDefault<z.ZodNumber>;
18
+ back: z.ZodDefault<z.ZodNumber>;
19
+ frontLeft: z.ZodDefault<z.ZodNumber>;
20
+ frontRight: z.ZodDefault<z.ZodNumber>;
21
+ backLeft: z.ZodDefault<z.ZodNumber>;
22
+ backRight: z.ZodDefault<z.ZodNumber>;
23
+ frontLeftX: z.ZodDefault<z.ZodNumber>;
24
+ frontLeftZ: z.ZodDefault<z.ZodNumber>;
25
+ frontRightX: z.ZodDefault<z.ZodNumber>;
26
+ frontRightZ: z.ZodDefault<z.ZodNumber>;
27
+ backLeftX: z.ZodDefault<z.ZodNumber>;
28
+ backLeftZ: z.ZodDefault<z.ZodNumber>;
29
+ backRightX: z.ZodDefault<z.ZodNumber>;
30
+ backRightZ: z.ZodDefault<z.ZodNumber>;
31
+ }, z.core.$strip>>;
32
+ export type RoofSegmentTrim = z.infer<typeof RoofSegmentTrim>;
13
33
  export declare const ROOF_SHAPE_DEFAULTS: {
14
34
  /** Gambrel: lower (steep) face occupies this fraction of the horizontal half-depth. */
15
35
  readonly gambrelLowerWidthRatio: 0.5;
@@ -23,6 +43,17 @@ export declare const ROOF_SHAPE_DEFAULTS: {
23
43
  readonly dutchHipWidthRatio: 0.25;
24
44
  /** Dutch: hip face rises this fraction of the way to the peak. */
25
45
  readonly dutchHipHeightRatio: 0.5;
46
+ /** Dutch: gable waist span along the ridge axis, as a fraction of the max span. */
47
+ readonly dutchWaistLengthRatio: 0.98;
48
+ /**
49
+ * Dutch: how far the gablet's barge board extends outward past the gablet
50
+ * end-wall, along the ridge axis, in metres. 0 disables the rake. The board
51
+ * lies in the gablet's slope planes (coplanar with the main Dutch slopes)
52
+ * and overhangs the lower hip skirt; the gablet end-wall itself stays put.
53
+ */
54
+ readonly dutchGabletRake: 0.48;
55
+ /** Dutch: thickness of the top gable rake slab. */
56
+ readonly dutchTopRakeThickness: 0.21;
26
57
  };
27
58
  export declare const RoofSegmentNode: z.ZodObject<{
28
59
  object: z.ZodDefault<z.ZodLiteral<"node">>;
@@ -44,7 +75,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
44
75
  type: z.ZodDefault<z.ZodLiteral<"roof-segment">>;
45
76
  material: z.ZodOptional<z.ZodObject<{
46
77
  id: z.ZodOptional<z.ZodString>;
47
- preset: z.ZodOptional<z.ZodEnum<{
78
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
48
79
  custom: "custom";
49
80
  white: "white";
50
81
  brick: "brick";
@@ -55,7 +86,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
55
86
  plaster: "plaster";
56
87
  tile: "tile";
57
88
  marble: "marble";
58
- }>>;
89
+ }>>>;
59
90
  properties: z.ZodOptional<z.ZodObject<{
60
91
  color: z.ZodDefault<z.ZodString>;
61
92
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -77,7 +108,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
77
108
  materialPreset: z.ZodOptional<z.ZodString>;
78
109
  topMaterial: z.ZodOptional<z.ZodObject<{
79
110
  id: z.ZodOptional<z.ZodString>;
80
- preset: z.ZodOptional<z.ZodEnum<{
111
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
81
112
  custom: "custom";
82
113
  white: "white";
83
114
  brick: "brick";
@@ -88,7 +119,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
88
119
  plaster: "plaster";
89
120
  tile: "tile";
90
121
  marble: "marble";
91
- }>>;
122
+ }>>>;
92
123
  properties: z.ZodOptional<z.ZodObject<{
93
124
  color: z.ZodDefault<z.ZodString>;
94
125
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -110,7 +141,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
110
141
  topMaterialPreset: z.ZodOptional<z.ZodString>;
111
142
  edgeMaterial: z.ZodOptional<z.ZodObject<{
112
143
  id: z.ZodOptional<z.ZodString>;
113
- preset: z.ZodOptional<z.ZodEnum<{
144
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
114
145
  custom: "custom";
115
146
  white: "white";
116
147
  brick: "brick";
@@ -121,7 +152,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
121
152
  plaster: "plaster";
122
153
  tile: "tile";
123
154
  marble: "marble";
124
- }>>;
155
+ }>>>;
125
156
  properties: z.ZodOptional<z.ZodObject<{
126
157
  color: z.ZodDefault<z.ZodString>;
127
158
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -143,7 +174,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
143
174
  edgeMaterialPreset: z.ZodOptional<z.ZodString>;
144
175
  wallMaterial: z.ZodOptional<z.ZodObject<{
145
176
  id: z.ZodOptional<z.ZodString>;
146
- preset: z.ZodOptional<z.ZodEnum<{
177
+ preset: z.ZodOptional<z.ZodCatch<z.ZodEnum<{
147
178
  custom: "custom";
148
179
  white: "white";
149
180
  brick: "brick";
@@ -154,7 +185,7 @@ export declare const RoofSegmentNode: z.ZodObject<{
154
185
  plaster: "plaster";
155
186
  tile: "tile";
156
187
  marble: "marble";
157
- }>>;
188
+ }>>>;
158
189
  properties: z.ZodOptional<z.ZodObject<{
159
190
  color: z.ZodDefault<z.ZodString>;
160
191
  roughness: z.ZodDefault<z.ZodNumber>;
@@ -187,6 +218,24 @@ export declare const RoofSegmentNode: z.ZodObject<{
187
218
  }>>;
188
219
  width: z.ZodDefault<z.ZodNumber>;
189
220
  depth: z.ZodDefault<z.ZodNumber>;
221
+ trim: z.ZodDefault<z.ZodObject<{
222
+ left: z.ZodDefault<z.ZodNumber>;
223
+ right: z.ZodDefault<z.ZodNumber>;
224
+ front: z.ZodDefault<z.ZodNumber>;
225
+ back: z.ZodDefault<z.ZodNumber>;
226
+ frontLeft: z.ZodDefault<z.ZodNumber>;
227
+ frontRight: z.ZodDefault<z.ZodNumber>;
228
+ backLeft: z.ZodDefault<z.ZodNumber>;
229
+ backRight: z.ZodDefault<z.ZodNumber>;
230
+ frontLeftX: z.ZodDefault<z.ZodNumber>;
231
+ frontLeftZ: z.ZodDefault<z.ZodNumber>;
232
+ frontRightX: z.ZodDefault<z.ZodNumber>;
233
+ frontRightZ: z.ZodDefault<z.ZodNumber>;
234
+ backLeftX: z.ZodDefault<z.ZodNumber>;
235
+ backLeftZ: z.ZodDefault<z.ZodNumber>;
236
+ backRightX: z.ZodDefault<z.ZodNumber>;
237
+ backRightZ: z.ZodDefault<z.ZodNumber>;
238
+ }, z.core.$strip>>;
190
239
  wallHeight: z.ZodDefault<z.ZodNumber>;
191
240
  pitch: z.ZodDefault<z.ZodNumber>;
192
241
  wallThickness: z.ZodDefault<z.ZodNumber>;
@@ -199,9 +248,15 @@ export declare const RoofSegmentNode: z.ZodObject<{
199
248
  mansardSteepHeightRatio: z.ZodDefault<z.ZodNumber>;
200
249
  dutchHipWidthRatio: z.ZodDefault<z.ZodNumber>;
201
250
  dutchHipHeightRatio: z.ZodDefault<z.ZodNumber>;
251
+ dutchWaistLengthRatio: z.ZodDefault<z.ZodNumber>;
252
+ dutchGabletRake: z.ZodDefault<z.ZodNumber>;
253
+ dutchTopRakeThickness: z.ZodDefault<z.ZodNumber>;
202
254
  children: z.ZodDefault<z.ZodArray<z.ZodString>>;
203
255
  }, z.core.$strip>;
204
256
  export type RoofSegmentNode = z.infer<typeof RoofSegmentNode>;
257
+ export declare function normalizeRoofSegmentTrim(node: Pick<RoofSegmentNode, 'width' | 'depth'> & {
258
+ trim?: Partial<RoofSegmentTrim>;
259
+ }): RoofSegmentTrim;
205
260
  /** Shape of the per-type ratios consumed by the slope helpers. */
206
261
  type ShapeRatios = {
207
262
  gambrelLowerWidthRatio: number;
@@ -210,12 +265,24 @@ type ShapeRatios = {
210
265
  mansardSteepHeightRatio: number;
211
266
  dutchHipWidthRatio: number;
212
267
  dutchHipHeightRatio: number;
268
+ dutchWaistLengthRatio: number;
213
269
  };
214
270
  type PitchInputs = {
215
271
  roofType: RoofType;
216
272
  width: number;
217
273
  depth: number;
218
274
  } & Partial<ShapeRatios>;
275
+ export type DutchRoofMetrics = {
276
+ axis: 'x' | 'z';
277
+ inset: number;
278
+ waistHalfX: number;
279
+ waistHalfZ: number;
280
+ ridgeStart: readonly [number, number];
281
+ ridgeEnd: readonly [number, number];
282
+ shoulderInsetAlongDepth: number;
283
+ shoulderInsetAlongWidth: number;
284
+ };
285
+ export declare function getDutchRoofMetrics(input: Pick<RoofSegmentNode, 'width' | 'depth'> & Partial<Pick<RoofSegmentNode, 'dutchHipWidthRatio' | 'dutchWaistLengthRatio'>>): DutchRoofMetrics;
219
286
  export type SegmentSlopeFrame = {
220
287
  /** Horizontal half-span of the primary slope face (eave-to-ridge). */
221
288
  run: number;
@@ -244,6 +311,15 @@ export declare function getSegmentSlopeFrame(node: Pick<RoofSegmentNode, 'roofTy
244
311
  * footprint + roofType. Replaces the legacy `roofHeight` field on the node.
245
312
  */
246
313
  export declare function getActiveRoofHeight(node: Parameters<typeof getSegmentSlopeFrame>[0]): number;
314
+ export type RoofSegmentVisibleTopBounds = {
315
+ minX: number;
316
+ maxX: number;
317
+ minZ: number;
318
+ maxZ: number;
319
+ width: number;
320
+ depth: number;
321
+ };
322
+ export declare function getRoofSegmentVisibleTopBounds(segment: RoofSegmentNode): RoofSegmentVisibleTopBounds;
247
323
  /** Segment-local surface height used by roof accessory placement and hit disambiguation. */
248
324
  export declare function getRoofSegmentSurfaceY(node: Pick<RoofSegmentNode, 'roofType' | 'width' | 'depth' | 'wallHeight'> & Parameters<typeof getSegmentSlopeFrame>[0], localX: number, localZ: number): number;
249
325
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"roof-segment.d.ts","sourceRoot":"","sources":["../../../src/schema/nodes/roof-segment.ts"],"names":[],"mappings":"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"}