@pascal-app/core 0.9.2 → 1.0.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (339) hide show
  1. package/README.md +17 -10
  2. package/dist/events/bus.d.ts +21 -2
  3. package/dist/events/bus.d.ts.map +1 -1
  4. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts +17 -1
  5. package/dist/hooks/spatial-grid/floor-placed-elevation.d.ts.map +1 -1
  6. package/dist/hooks/spatial-grid/floor-placed-elevation.js +61 -8
  7. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts +116 -66
  8. package/dist/hooks/spatial-grid/spatial-grid-manager.d.ts.map +1 -1
  9. package/dist/hooks/spatial-grid/spatial-grid-manager.js +319 -441
  10. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts +46 -1
  11. package/dist/hooks/spatial-grid/spatial-grid-sync.d.ts.map +1 -1
  12. package/dist/hooks/spatial-grid/spatial-grid-sync.js +204 -12
  13. package/dist/hooks/spatial-grid/support-host-id.d.ts +3 -0
  14. package/dist/hooks/spatial-grid/support-host-id.d.ts.map +1 -0
  15. package/dist/hooks/spatial-grid/support-host-id.js +2 -0
  16. package/dist/hooks/spatial-grid/support-host-patch.d.ts +51 -0
  17. package/dist/hooks/spatial-grid/support-host-patch.d.ts.map +1 -0
  18. package/dist/hooks/spatial-grid/support-host-patch.js +164 -0
  19. package/dist/index.d.ts +23 -11
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +22 -10
  22. package/dist/lib/measurement-geometry.d.ts +4 -0
  23. package/dist/lib/measurement-geometry.d.ts.map +1 -1
  24. package/dist/lib/measurement-geometry.js +27 -10
  25. package/dist/lib/slab-polygon.d.ts.map +1 -1
  26. package/dist/lib/slab-polygon.js +33 -1
  27. package/dist/lib/space-detection.d.ts +15 -4
  28. package/dist/lib/space-detection.d.ts.map +1 -1
  29. package/dist/lib/space-detection.js +232 -91
  30. package/dist/lib/terrain-brush.d.ts +163 -0
  31. package/dist/lib/terrain-brush.d.ts.map +1 -0
  32. package/dist/lib/terrain-brush.js +359 -0
  33. package/dist/lib/terrain-codec.d.ts +51 -0
  34. package/dist/lib/terrain-codec.d.ts.map +1 -0
  35. package/dist/lib/terrain-codec.js +167 -0
  36. package/dist/lib/terrain-field.d.ts +150 -0
  37. package/dist/lib/terrain-field.d.ts.map +1 -0
  38. package/dist/lib/terrain-field.js +248 -0
  39. package/dist/lib/terrain-raycast.d.ts +44 -0
  40. package/dist/lib/terrain-raycast.d.ts.map +1 -0
  41. package/dist/lib/terrain-raycast.js +188 -0
  42. package/dist/lib/terrain-source.d.ts +60 -0
  43. package/dist/lib/terrain-source.d.ts.map +1 -0
  44. package/dist/lib/terrain-source.js +90 -0
  45. package/dist/lib/terrain-support.d.ts +85 -0
  46. package/dist/lib/terrain-support.d.ts.map +1 -0
  47. package/dist/lib/terrain-support.js +218 -0
  48. package/dist/lib/zone-quantities.d.ts +1 -1
  49. package/dist/lib/zone-quantities.d.ts.map +1 -1
  50. package/dist/lib/zone-quantities.js +311 -66
  51. package/dist/material-library.d.ts +9 -1
  52. package/dist/material-library.d.ts.map +1 -1
  53. package/dist/material-library.js +56 -4
  54. package/dist/registry/handles.d.ts +16 -1
  55. package/dist/registry/handles.d.ts.map +1 -1
  56. package/dist/registry/index.d.ts +1 -1
  57. package/dist/registry/index.d.ts.map +1 -1
  58. package/dist/registry/subtree.d.ts.map +1 -1
  59. package/dist/registry/subtree.js +5 -2
  60. package/dist/registry/types.d.ts +83 -1
  61. package/dist/registry/types.d.ts.map +1 -1
  62. package/dist/schema/index.d.ts +6 -3
  63. package/dist/schema/index.d.ts.map +1 -1
  64. package/dist/schema/index.js +6 -3
  65. package/dist/schema/nodes/cabinet.d.ts +2 -0
  66. package/dist/schema/nodes/cabinet.d.ts.map +1 -1
  67. package/dist/schema/nodes/cabinet.js +4 -2
  68. package/dist/schema/nodes/ceiling.d.ts +1 -1
  69. package/dist/schema/nodes/ceiling.d.ts.map +1 -1
  70. package/dist/schema/nodes/ceiling.js +7 -1
  71. package/dist/schema/nodes/column.d.ts +1 -0
  72. package/dist/schema/nodes/column.d.ts.map +1 -1
  73. package/dist/schema/nodes/column.js +2 -0
  74. package/dist/schema/nodes/construction-dimension.d.ts +195 -0
  75. package/dist/schema/nodes/construction-dimension.d.ts.map +1 -0
  76. package/dist/schema/nodes/construction-dimension.js +151 -0
  77. package/dist/schema/nodes/door.d.ts +29 -0
  78. package/dist/schema/nodes/door.d.ts.map +1 -1
  79. package/dist/schema/nodes/door.js +20 -0
  80. package/dist/schema/nodes/duct-terminal.d.ts +1 -0
  81. package/dist/schema/nodes/duct-terminal.d.ts.map +1 -1
  82. package/dist/schema/nodes/duct-terminal.js +2 -0
  83. package/dist/schema/nodes/fence.d.ts +2 -0
  84. package/dist/schema/nodes/fence.d.ts.map +1 -1
  85. package/dist/schema/nodes/fence.js +8 -0
  86. package/dist/schema/nodes/hvac-equipment.d.ts +1 -0
  87. package/dist/schema/nodes/hvac-equipment.d.ts.map +1 -1
  88. package/dist/schema/nodes/hvac-equipment.js +2 -0
  89. package/dist/schema/nodes/item.d.ts +1 -0
  90. package/dist/schema/nodes/item.d.ts.map +1 -1
  91. package/dist/schema/nodes/item.js +13 -0
  92. package/dist/schema/nodes/level.d.ts +2 -1
  93. package/dist/schema/nodes/level.d.ts.map +1 -1
  94. package/dist/schema/nodes/level.js +12 -33
  95. package/dist/schema/nodes/shelf.d.ts +1 -0
  96. package/dist/schema/nodes/shelf.d.ts.map +1 -1
  97. package/dist/schema/nodes/shelf.js +2 -0
  98. package/dist/schema/nodes/site.d.ts +9 -0
  99. package/dist/schema/nodes/site.d.ts.map +1 -1
  100. package/dist/schema/nodes/site.js +8 -6
  101. package/dist/schema/nodes/slab.d.ts +5 -0
  102. package/dist/schema/nodes/slab.d.ts.map +1 -1
  103. package/dist/schema/nodes/slab.js +14 -2
  104. package/dist/schema/nodes/spawn.d.ts +1 -0
  105. package/dist/schema/nodes/spawn.d.ts.map +1 -1
  106. package/dist/schema/nodes/spawn.js +2 -0
  107. package/dist/schema/nodes/stair.d.ts +3 -1
  108. package/dist/schema/nodes/stair.d.ts.map +1 -1
  109. package/dist/schema/nodes/stair.js +8 -1
  110. package/dist/schema/nodes/structural-grid.d.ts +27 -0
  111. package/dist/schema/nodes/structural-grid.d.ts.map +1 -0
  112. package/dist/schema/nodes/structural-grid.js +17 -0
  113. package/dist/schema/nodes/wall.d.ts +5 -2
  114. package/dist/schema/nodes/wall.d.ts.map +1 -1
  115. package/dist/schema/nodes/wall.js +13 -4
  116. package/dist/schema/nodes/window.d.ts +29 -0
  117. package/dist/schema/nodes/window.d.ts.map +1 -1
  118. package/dist/schema/nodes/window.js +18 -0
  119. package/dist/schema/nodes/zone.d.ts +20 -0
  120. package/dist/schema/nodes/zone.d.ts.map +1 -1
  121. package/dist/schema/nodes/zone.js +15 -0
  122. package/dist/schema/terrain.d.ts +28 -0
  123. package/dist/schema/terrain.d.ts.map +1 -0
  124. package/dist/schema/terrain.js +30 -0
  125. package/dist/schema/types.d.ts +211 -3
  126. package/dist/schema/types.d.ts.map +1 -1
  127. package/dist/schema/types.js +4 -0
  128. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts +80 -0
  129. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.d.ts.map +1 -0
  130. package/dist/services/__fixtures__/wall-plane-top-boundary-repro.js +89 -0
  131. package/dist/services/index.d.ts +2 -1
  132. package/dist/services/index.d.ts.map +1 -1
  133. package/dist/services/index.js +2 -1
  134. package/dist/services/level-height.d.ts +8 -9
  135. package/dist/services/level-height.d.ts.map +1 -1
  136. package/dist/services/level-height.js +48 -16
  137. package/dist/services/storey.d.ts +103 -0
  138. package/dist/services/storey.d.ts.map +1 -0
  139. package/dist/services/storey.js +296 -0
  140. package/dist/store/actions/node-actions.d.ts.map +1 -1
  141. package/dist/store/actions/node-actions.js +47 -3
  142. package/dist/store/history-control.d.ts +20 -0
  143. package/dist/store/history-control.d.ts.map +1 -1
  144. package/dist/store/history-control.js +110 -13
  145. package/dist/store/use-live-terrain.d.ts +65 -0
  146. package/dist/store/use-live-terrain.d.ts.map +1 -0
  147. package/dist/store/use-live-terrain.js +31 -0
  148. package/dist/store/use-live-transforms.d.ts +8 -0
  149. package/dist/store/use-live-transforms.d.ts.map +1 -1
  150. package/dist/store/use-scene.d.ts +31 -2
  151. package/dist/store/use-scene.d.ts.map +1 -1
  152. package/dist/store/use-scene.js +638 -8
  153. package/dist/systems/elevator/elevator-opening-system.d.ts +1 -0
  154. package/dist/systems/elevator/elevator-opening-system.d.ts.map +1 -1
  155. package/dist/systems/elevator/elevator-opening-system.js +27 -21
  156. package/dist/systems/elevator/elevator-service.d.ts +0 -2
  157. package/dist/systems/elevator/elevator-service.d.ts.map +1 -1
  158. package/dist/systems/elevator/elevator-service.js +2 -24
  159. package/dist/systems/slab/slab-placement.d.ts +11 -0
  160. package/dist/systems/slab/slab-placement.d.ts.map +1 -0
  161. package/dist/systems/slab/slab-placement.js +14 -0
  162. package/dist/systems/slab/slab-support.d.ts +150 -0
  163. package/dist/systems/slab/slab-support.d.ts.map +1 -0
  164. package/dist/systems/slab/slab-support.js +575 -0
  165. package/dist/systems/stair/stair-opening-preview.d.ts +1060 -935
  166. package/dist/systems/stair/stair-opening-preview.d.ts.map +1 -1
  167. package/dist/systems/stair/stair-opening-sync.d.ts.map +1 -1
  168. package/dist/systems/stair/stair-opening-sync.js +18 -15
  169. package/dist/systems/stair/stair-opening-system.d.ts.map +1 -1
  170. package/dist/systems/stair/stair-opening-system.js +32 -4
  171. package/dist/systems/stair/stair-rise.d.ts +22 -0
  172. package/dist/systems/stair/stair-rise.d.ts.map +1 -0
  173. package/dist/systems/stair/stair-rise.js +79 -0
  174. package/dist/systems/wall/wall-curve.d.ts +10 -0
  175. package/dist/systems/wall/wall-curve.d.ts.map +1 -1
  176. package/dist/systems/wall/wall-curve.js +1 -1
  177. package/dist/systems/wall/wall-mitering.js +6 -6
  178. package/dist/systems/wall/wall-top.d.ts +40 -0
  179. package/dist/systems/wall/wall-top.d.ts.map +1 -0
  180. package/dist/systems/wall/wall-top.js +46 -0
  181. package/dist/utils/clone-scene-graph.d.ts.map +1 -1
  182. package/dist/utils/clone-scene-graph.js +34 -3
  183. package/dist/utils/heal-scene-graph.d.ts +1 -1
  184. package/dist/utils/heal-scene-graph.d.ts.map +1 -1
  185. package/dist/utils/heal-scene-graph.js +25 -9
  186. package/dist/validation/validate-build-json.d.ts +2 -0
  187. package/dist/validation/validate-build-json.d.ts.map +1 -1
  188. package/dist/validation/validate-build-json.js +59 -3
  189. package/package.json +2 -2
  190. package/dist/hooks/scene-registry/scene-registry.test.d.ts +0 -2
  191. package/dist/hooks/scene-registry/scene-registry.test.d.ts.map +0 -1
  192. package/dist/hooks/scene-registry/scene-registry.test.js +0 -26
  193. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts +0 -2
  194. package/dist/hooks/spatial-grid/floor-placed-elevation.test.d.ts.map +0 -1
  195. package/dist/hooks/spatial-grid/floor-placed-elevation.test.js +0 -366
  196. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts +0 -2
  197. package/dist/hooks/spatial-grid/wall-slab-overlap.test.d.ts.map +0 -1
  198. package/dist/hooks/spatial-grid/wall-slab-overlap.test.js +0 -363
  199. package/dist/lib/measurement-geometry.test.d.ts +0 -2
  200. package/dist/lib/measurement-geometry.test.d.ts.map +0 -1
  201. package/dist/lib/measurement-geometry.test.js +0 -102
  202. package/dist/lib/slab-polygon.test.d.ts +0 -2
  203. package/dist/lib/slab-polygon.test.d.ts.map +0 -1
  204. package/dist/lib/slab-polygon.test.js +0 -635
  205. package/dist/lib/space-detection-pause.test.d.ts +0 -2
  206. package/dist/lib/space-detection-pause.test.d.ts.map +0 -1
  207. package/dist/lib/space-detection-pause.test.js +0 -42
  208. package/dist/lib/space-detection.test.d.ts +0 -2
  209. package/dist/lib/space-detection.test.d.ts.map +0 -1
  210. package/dist/lib/space-detection.test.js +0 -376
  211. package/dist/lib/zone-quantities.test.d.ts +0 -2
  212. package/dist/lib/zone-quantities.test.d.ts.map +0 -1
  213. package/dist/lib/zone-quantities.test.js +0 -82
  214. package/dist/registry/registry.test.d.ts +0 -2
  215. package/dist/registry/registry.test.d.ts.map +0 -1
  216. package/dist/registry/registry.test.js +0 -196
  217. package/dist/registry/relations-resolver.test.d.ts +0 -2
  218. package/dist/registry/relations-resolver.test.d.ts.map +0 -1
  219. package/dist/registry/relations-resolver.test.js +0 -183
  220. package/dist/registry/scene-api.test.d.ts +0 -2
  221. package/dist/registry/scene-api.test.d.ts.map +0 -1
  222. package/dist/registry/scene-api.test.js +0 -183
  223. package/dist/registry/subtree.test.d.ts +0 -2
  224. package/dist/registry/subtree.test.d.ts.map +0 -1
  225. package/dist/registry/subtree.test.js +0 -163
  226. package/dist/schema/asset-url.test.d.ts +0 -2
  227. package/dist/schema/asset-url.test.d.ts.map +0 -1
  228. package/dist/schema/asset-url.test.js +0 -134
  229. package/dist/schema/material.test.d.ts +0 -2
  230. package/dist/schema/material.test.d.ts.map +0 -1
  231. package/dist/schema/material.test.js +0 -43
  232. package/dist/schema/nodes/measurement.test.d.ts +0 -2
  233. package/dist/schema/nodes/measurement.test.d.ts.map +0 -1
  234. package/dist/schema/nodes/measurement.test.js +0 -139
  235. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts +0 -2
  236. package/dist/schema/nodes/ridge-vent-defaults.test.d.ts.map +0 -1
  237. package/dist/schema/nodes/ridge-vent-defaults.test.js +0 -205
  238. package/dist/schema/nodes/roof-segment-shape.test.d.ts +0 -2
  239. package/dist/schema/nodes/roof-segment-shape.test.d.ts.map +0 -1
  240. package/dist/schema/nodes/roof-segment-shape.test.js +0 -175
  241. package/dist/schema/nodes/roof-segment-surface.test.d.ts +0 -2
  242. package/dist/schema/nodes/roof-segment-surface.test.d.ts.map +0 -1
  243. package/dist/schema/nodes/roof-segment-surface.test.js +0 -48
  244. package/dist/schema/nodes/roof-segment-trim.test.d.ts +0 -2
  245. package/dist/schema/nodes/roof-segment-trim.test.d.ts.map +0 -1
  246. package/dist/schema/nodes/roof-segment-trim.test.js +0 -107
  247. package/dist/schema/nodes/roof-segment-walls.test.d.ts +0 -2
  248. package/dist/schema/nodes/roof-segment-walls.test.d.ts.map +0 -1
  249. package/dist/schema/nodes/roof-segment-walls.test.js +0 -92
  250. package/dist/schema/nodes/wall.test.d.ts +0 -2
  251. package/dist/schema/nodes/wall.test.d.ts.map +0 -1
  252. package/dist/schema/nodes/wall.test.js +0 -208
  253. package/dist/services/alignment-anchors.test.d.ts +0 -2
  254. package/dist/services/alignment-anchors.test.d.ts.map +0 -1
  255. package/dist/services/alignment-anchors.test.js +0 -383
  256. package/dist/services/alignment.test.d.ts +0 -2
  257. package/dist/services/alignment.test.d.ts.map +0 -1
  258. package/dist/services/alignment.test.js +0 -92
  259. package/dist/services/drag-session.test.d.ts +0 -2
  260. package/dist/services/drag-session.test.d.ts.map +0 -1
  261. package/dist/services/drag-session.test.js +0 -219
  262. package/dist/services/hosting.test.d.ts +0 -2
  263. package/dist/services/hosting.test.d.ts.map +0 -1
  264. package/dist/services/hosting.test.js +0 -230
  265. package/dist/services/movement.test.d.ts +0 -2
  266. package/dist/services/movement.test.d.ts.map +0 -1
  267. package/dist/services/movement.test.js +0 -133
  268. package/dist/services/opening-guides.test.d.ts +0 -2
  269. package/dist/services/opening-guides.test.d.ts.map +0 -1
  270. package/dist/services/opening-guides.test.js +0 -208
  271. package/dist/services/port-connectivity.test.d.ts +0 -2
  272. package/dist/services/port-connectivity.test.d.ts.map +0 -1
  273. package/dist/services/port-connectivity.test.js +0 -297
  274. package/dist/services/riser-diagram.test.d.ts +0 -2
  275. package/dist/services/riser-diagram.test.d.ts.map +0 -1
  276. package/dist/services/riser-diagram.test.js +0 -66
  277. package/dist/services/single-undo-dance.test.d.ts +0 -2
  278. package/dist/services/single-undo-dance.test.d.ts.map +0 -1
  279. package/dist/services/single-undo-dance.test.js +0 -210
  280. package/dist/services/snap.test.d.ts +0 -2
  281. package/dist/services/snap.test.d.ts.map +0 -1
  282. package/dist/services/snap.test.js +0 -137
  283. package/dist/services/system-graph.test.d.ts +0 -2
  284. package/dist/services/system-graph.test.d.ts.map +0 -1
  285. package/dist/services/system-graph.test.js +0 -138
  286. package/dist/services/validate-dwv.test.d.ts +0 -2
  287. package/dist/services/validate-dwv.test.d.ts.map +0 -1
  288. package/dist/services/validate-dwv.test.js +0 -109
  289. package/dist/store/actions/node-mutation-sanitize.test.d.ts +0 -2
  290. package/dist/store/actions/node-mutation-sanitize.test.d.ts.map +0 -1
  291. package/dist/store/actions/node-mutation-sanitize.test.js +0 -147
  292. package/dist/store/actions/reparent.test.d.ts +0 -2
  293. package/dist/store/actions/reparent.test.d.ts.map +0 -1
  294. package/dist/store/actions/reparent.test.js +0 -212
  295. package/dist/store/actions/ridge-vent-update.test.d.ts +0 -2
  296. package/dist/store/actions/ridge-vent-update.test.d.ts.map +0 -1
  297. package/dist/store/actions/ridge-vent-update.test.js +0 -264
  298. package/dist/store/use-scene-dirty-tracking.test.d.ts +0 -2
  299. package/dist/store/use-scene-dirty-tracking.test.d.ts.map +0 -1
  300. package/dist/store/use-scene-dirty-tracking.test.js +0 -68
  301. package/dist/store/use-scene-elevator-migration.test.d.ts +0 -2
  302. package/dist/store/use-scene-elevator-migration.test.d.ts.map +0 -1
  303. package/dist/store/use-scene-elevator-migration.test.js +0 -109
  304. package/dist/store/use-scene-measurement-roundtrip.test.d.ts +0 -2
  305. package/dist/store/use-scene-measurement-roundtrip.test.d.ts.map +0 -1
  306. package/dist/store/use-scene-measurement-roundtrip.test.js +0 -97
  307. package/dist/store/use-scene-plugins.test.d.ts +0 -2
  308. package/dist/store/use-scene-plugins.test.d.ts.map +0 -1
  309. package/dist/store/use-scene-plugins.test.js +0 -51
  310. package/dist/store/use-scene-wall-slot-migration.test.d.ts +0 -2
  311. package/dist/store/use-scene-wall-slot-migration.test.d.ts.map +0 -1
  312. package/dist/store/use-scene-wall-slot-migration.test.js +0 -210
  313. package/dist/store/use-scene-window-migration.test.d.ts +0 -2
  314. package/dist/store/use-scene-window-migration.test.d.ts.map +0 -1
  315. package/dist/store/use-scene-window-migration.test.js +0 -85
  316. package/dist/systems/elevator/elevator-opening-sync.test.d.ts +0 -2
  317. package/dist/systems/elevator/elevator-opening-sync.test.d.ts.map +0 -1
  318. package/dist/systems/elevator/elevator-opening-sync.test.js +0 -146
  319. package/dist/systems/elevator/elevator-runtime.test.d.ts +0 -2
  320. package/dist/systems/elevator/elevator-runtime.test.d.ts.map +0 -1
  321. package/dist/systems/elevator/elevator-runtime.test.js +0 -64
  322. package/dist/systems/fence/fence-spline.test.d.ts +0 -2
  323. package/dist/systems/fence/fence-spline.test.d.ts.map +0 -1
  324. package/dist/systems/fence/fence-spline.test.js +0 -136
  325. package/dist/systems/stair/stair-opening-preview.test.d.ts +0 -2
  326. package/dist/systems/stair/stair-opening-preview.test.d.ts.map +0 -1
  327. package/dist/systems/stair/stair-opening-preview.test.js +0 -80
  328. package/dist/systems/stair/stair-opening-sync.test.d.ts +0 -2
  329. package/dist/systems/stair/stair-opening-sync.test.d.ts.map +0 -1
  330. package/dist/systems/stair/stair-opening-sync.test.js +0 -485
  331. package/dist/systems/wall/wall-mitering.test.d.ts +0 -2
  332. package/dist/systems/wall/wall-mitering.test.d.ts.map +0 -1
  333. package/dist/systems/wall/wall-mitering.test.js +0 -63
  334. package/dist/utils/clone-scene-graph.test.d.ts +0 -2
  335. package/dist/utils/clone-scene-graph.test.d.ts.map +0 -1
  336. package/dist/utils/clone-scene-graph.test.js +0 -62
  337. package/dist/utils/heal-scene-graph.test.d.ts +0 -2
  338. package/dist/utils/heal-scene-graph.test.d.ts.map +0 -1
  339. package/dist/utils/heal-scene-graph.test.js +0 -88
@@ -1,147 +0,0 @@
1
- import { beforeEach, describe, expect, test } from 'bun:test';
2
- import useScene from '../use-scene';
3
- globalThis.requestAnimationFrame ??= ((cb) => {
4
- cb(0);
5
- return 0;
6
- });
7
- globalThis.cancelAnimationFrame ??=
8
- () => { };
9
- const SHELF_ID = 'shelf_sanitize';
10
- const SOLAR_PANEL_ID = 'sp_x';
11
- function makeShelf(overrides = {}) {
12
- return {
13
- id: SHELF_ID,
14
- type: 'shelf',
15
- parentId: null,
16
- object: 'node',
17
- visible: true,
18
- name: 'Shelf',
19
- metadata: {},
20
- children: [],
21
- position: [0, 0, 0],
22
- rotation: [0, 0, 0],
23
- width: 1.2,
24
- depth: 0.3,
25
- thickness: 0.04,
26
- height: 0.9,
27
- style: 'wall-shelf',
28
- rows: 1,
29
- columns: 1,
30
- withBack: false,
31
- withSides: true,
32
- withBottom: false,
33
- bracketStyle: 'minimal',
34
- ...overrides,
35
- };
36
- }
37
- function makeSolarPanel() {
38
- return {
39
- id: SOLAR_PANEL_ID,
40
- type: 'solar-panel',
41
- parentId: null,
42
- object: 'node',
43
- visible: true,
44
- name: 'Panel',
45
- metadata: {},
46
- position: [0, 0, 0],
47
- rotation: 0,
48
- rows: 2,
49
- columns: 3,
50
- panelWidth: 1,
51
- panelHeight: 1.65,
52
- gapX: 0.02,
53
- gapY: 0.02,
54
- mountingType: 'flush',
55
- tiltAngle: 15,
56
- standoffHeight: 0.05,
57
- frameThickness: 0.04,
58
- frameDepth: 0.04,
59
- };
60
- }
61
- function shelf() {
62
- return useScene.getState().nodes[SHELF_ID];
63
- }
64
- describe('node mutation numeric sanitization', () => {
65
- beforeEach(() => {
66
- useScene.setState({
67
- nodes: {
68
- [SHELF_ID]: makeShelf(),
69
- [SOLAR_PANEL_ID]: makeSolarPanel(),
70
- },
71
- rootNodeIds: [SHELF_ID, SOLAR_PANEL_ID],
72
- dirtyNodes: new Set(),
73
- collections: {},
74
- readOnly: false,
75
- });
76
- useScene.temporal.getState().clear();
77
- });
78
- test('drops NaN numeric updates while preserving other fields in the patch', () => {
79
- useScene.getState().updateNode(SHELF_ID, {
80
- thickness: Number.NaN,
81
- name: 'Renamed after NaN',
82
- });
83
- expect(shelf().thickness).toBe(0.04);
84
- expect(Number.isFinite(shelf().thickness)).toBe(true);
85
- expect(shelf().name).toBe('Renamed after NaN');
86
- });
87
- test('drops Infinity numeric updates while preserving later normal updates', () => {
88
- useScene.getState().updateNode(SHELF_ID, {
89
- width: Infinity,
90
- name: 'Renamed after Infinity',
91
- });
92
- expect(shelf().width).toBe(1.2);
93
- expect(Number.isFinite(shelf().width)).toBe(true);
94
- expect(shelf().name).toBe('Renamed after Infinity');
95
- useScene.getState().updateNode(SHELF_ID, {
96
- name: 'Clean rename',
97
- });
98
- expect(shelf().name).toBe('Clean rename');
99
- });
100
- test('clamps out-of-range numeric updates to the node schema bounds', () => {
101
- useScene.getState().updateNode(SHELF_ID, {
102
- width: 99,
103
- thickness: -1,
104
- });
105
- expect(shelf().width).toBe(3);
106
- expect(shelf().thickness).toBe(0.01);
107
- });
108
- test('preserves extra fields while sanitizing numeric updates', () => {
109
- useScene.setState({
110
- nodes: {
111
- [SHELF_ID]: {
112
- ...makeShelf(),
113
- legacyField: 'current',
114
- },
115
- },
116
- rootNodeIds: [SHELF_ID],
117
- });
118
- useScene.getState().updateNode(SHELF_ID, {
119
- width: Infinity,
120
- legacyPatch: 'patch',
121
- });
122
- const node = useScene.getState().nodes[SHELF_ID];
123
- expect(node.width).toBe(1.2);
124
- expect(node.legacyField).toBe('current');
125
- expect(node.legacyPatch).toBe('patch');
126
- });
127
- test('allows non-canonical ids to receive updates', () => {
128
- useScene.getState().updateNode(SOLAR_PANEL_ID, {
129
- name: 'Updated panel',
130
- });
131
- const panel = useScene.getState().nodes[SOLAR_PANEL_ID];
132
- expect(panel.name).toBe('Updated panel');
133
- });
134
- test('sanitizes non-finite numeric values during create', () => {
135
- const createdId = 'shelf_created';
136
- useScene.getState().createNode(makeShelf({
137
- id: createdId,
138
- width: Infinity,
139
- thickness: Number.NaN,
140
- }));
141
- const created = useScene.getState().nodes[createdId];
142
- expect(created.width).toBe(1.2);
143
- expect(created.thickness).toBe(0.04);
144
- expect(Number.isFinite(created.width)).toBe(true);
145
- expect(Number.isFinite(created.thickness)).toBe(true);
146
- });
147
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=reparent.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"reparent.test.d.ts","sourceRoot":"","sources":["../../../src/store/actions/reparent.test.ts"],"names":[],"mappings":""}
@@ -1,212 +0,0 @@
1
- import { beforeEach, describe, expect, test } from 'bun:test';
2
- import useScene from '../use-scene';
3
- globalThis.requestAnimationFrame ??= ((cb) => {
4
- cb(0);
5
- return 0;
6
- });
7
- globalThis.cancelAnimationFrame ??=
8
- () => { };
9
- const ROOF_ID = 'roof_test';
10
- const SEG_A_ID = 'rseg_a';
11
- const SEG_B_ID = 'rseg_b';
12
- const VENT_ID = 'bvent_v1';
13
- function makeRoof() {
14
- return {
15
- id: ROOF_ID,
16
- type: 'roof',
17
- parentId: null,
18
- object: 'node',
19
- visible: true,
20
- name: '',
21
- metadata: {},
22
- position: [0, 0, 0],
23
- rotation: 0,
24
- children: [SEG_A_ID, SEG_B_ID],
25
- };
26
- }
27
- function makeSegment(id, children = []) {
28
- return {
29
- id,
30
- type: 'roof-segment',
31
- parentId: ROOF_ID,
32
- object: 'node',
33
- visible: true,
34
- name: '',
35
- metadata: {},
36
- position: [0, 0, 0],
37
- rotation: 0,
38
- roofType: 'gable',
39
- width: 8,
40
- depth: 6,
41
- wallHeight: 0.5,
42
- pitch: 40,
43
- wallThickness: 0.1,
44
- deckThickness: 0.1,
45
- overhang: 0.3,
46
- shingleThickness: 0.05,
47
- children,
48
- };
49
- }
50
- function makeVent(parentId) {
51
- return {
52
- id: VENT_ID,
53
- type: 'box-vent',
54
- parentId,
55
- roofSegmentId: parentId,
56
- object: 'node',
57
- visible: true,
58
- name: '',
59
- metadata: {},
60
- position: [0, 0, 0],
61
- rotation: 0,
62
- width: 0.4,
63
- depth: 0.4,
64
- height: 0.15,
65
- hoodOverhang: 0.04,
66
- topTaper: 0.4,
67
- capHeight: 0.07,
68
- capGap: 0,
69
- domeCurvature: 0.65,
70
- baseInset: 0.06,
71
- baseHeight: 0.04,
72
- cornerBevel: 0.012,
73
- style: 'cap',
74
- materialPreset: 'preset-white',
75
- };
76
- }
77
- function childrenOf(id) {
78
- const seg = useScene.getState().nodes[id];
79
- return (seg?.children ?? []);
80
- }
81
- function vent() {
82
- return useScene.getState().nodes[VENT_ID];
83
- }
84
- describe('node-actions reparent — repeated segment-hopping', () => {
85
- beforeEach(() => {
86
- useScene.setState({
87
- nodes: {
88
- [ROOF_ID]: makeRoof(),
89
- [SEG_A_ID]: makeSegment(SEG_A_ID, [VENT_ID]),
90
- [SEG_B_ID]: makeSegment(SEG_B_ID, []),
91
- [VENT_ID]: makeVent(SEG_A_ID),
92
- },
93
- rootNodeIds: [ROOF_ID],
94
- });
95
- useScene.temporal.getState().clear();
96
- });
97
- test('initial state: vent listed once in A.children, absent from B.children', () => {
98
- expect(childrenOf(SEG_A_ID)).toEqual([VENT_ID]);
99
- expect(childrenOf(SEG_B_ID)).toEqual([]);
100
- expect(vent().parentId).toBe(SEG_A_ID);
101
- });
102
- test('A→B: auto-reparent moves vent without leaving duplicates', () => {
103
- useScene
104
- .getState()
105
- .updateNode(VENT_ID, { parentId: SEG_B_ID, roofSegmentId: SEG_B_ID });
106
- expect(childrenOf(SEG_A_ID)).toEqual([]);
107
- expect(childrenOf(SEG_B_ID)).toEqual([VENT_ID]);
108
- expect(vent().parentId).toBe(SEG_B_ID);
109
- });
110
- test('A→B→A→B: three hops leave children lists clean (regression: vent crash)', () => {
111
- // Move 1: A → B
112
- useScene
113
- .getState()
114
- .updateNode(VENT_ID, { parentId: SEG_B_ID, roofSegmentId: SEG_B_ID });
115
- expect(childrenOf(SEG_A_ID)).toEqual([]);
116
- expect(childrenOf(SEG_B_ID)).toEqual([VENT_ID]);
117
- // Move 2: B → A
118
- useScene
119
- .getState()
120
- .updateNode(VENT_ID, { parentId: SEG_A_ID, roofSegmentId: SEG_A_ID });
121
- expect(childrenOf(SEG_A_ID)).toEqual([VENT_ID]);
122
- expect(childrenOf(SEG_B_ID)).toEqual([]);
123
- // Move 3: A → B (the move the user reports crashes)
124
- useScene
125
- .getState()
126
- .updateNode(VENT_ID, { parentId: SEG_B_ID, roofSegmentId: SEG_B_ID });
127
- expect(childrenOf(SEG_A_ID)).toEqual([]);
128
- expect(childrenOf(SEG_B_ID)).toEqual([VENT_ID]);
129
- expect(vent().parentId).toBe(SEG_B_ID);
130
- // Crucially: the vent must appear in EXACTLY ONE segment's children.
131
- // Duplicate listing is what makes the roof renderer mount two
132
- // <NodeRenderer key={ventId}> instances and crash the scene-registry
133
- // on unmount.
134
- const totalListings = childrenOf(SEG_A_ID).filter((id) => id === VENT_ID).length +
135
- childrenOf(SEG_B_ID).filter((id) => id === VENT_ID).length;
136
- expect(totalListings).toBe(1);
137
- });
138
- test.each([
139
- ['chimney', 'chmn_x'],
140
- ['skylight', 'sky_x'],
141
- ['dormer', 'dorm_x'],
142
- ['solar-panel', 'sp_x'],
143
- ['ridge-vent', 'rvent_x'],
144
- ])('A→B→A→B for %s: chimney-style auto-reparent leaves children clean', (type, idStr) => {
145
- const id = idStr;
146
- useScene.setState({
147
- nodes: {
148
- [ROOF_ID]: makeRoof(),
149
- [SEG_A_ID]: makeSegment(SEG_A_ID, [id]),
150
- [SEG_B_ID]: makeSegment(SEG_B_ID, []),
151
- [id]: {
152
- id,
153
- type,
154
- parentId: SEG_A_ID,
155
- roofSegmentId: SEG_A_ID,
156
- object: 'node',
157
- visible: true,
158
- name: '',
159
- metadata: {},
160
- position: [0, 0, 0],
161
- rotation: 0,
162
- },
163
- },
164
- rootNodeIds: [ROOF_ID],
165
- });
166
- const hop = (to) => useScene.getState().updateNode(id, { parentId: to, roofSegmentId: to });
167
- hop(SEG_B_ID);
168
- hop(SEG_A_ID);
169
- hop(SEG_B_ID);
170
- expect(childrenOf(SEG_A_ID)).toEqual([]);
171
- expect(childrenOf(SEG_B_ID)).toEqual([id]);
172
- const node = useScene.getState().nodes[id];
173
- expect(node.parentId).toBe(SEG_B_ID);
174
- });
175
- test('A→B→A→B with redundant manual children edits (vent move-tool pattern, pre-fix)', () => {
176
- // Reproduces the box-vent / ridge-vent move-tool order: manual
177
- // children edits FIRST, then updateNode({parentId}) which triggers
178
- // auto-reparent. The dual handling must not leave the vent listed
179
- // in both segments after three hops.
180
- const hop = (from, to) => {
181
- const st = useScene.getState();
182
- // 1. Manual: filter old children, push to new children — using
183
- // the snapshot (st.nodes) captured before any updates.
184
- const oldSeg = st.nodes[from];
185
- if (oldSeg) {
186
- st.updateNode(from, {
187
- children: (oldSeg.children ?? []).filter((id) => id !== VENT_ID),
188
- });
189
- }
190
- const newSeg = st.nodes[to];
191
- if (newSeg && !(newSeg.children ?? []).includes(VENT_ID)) {
192
- st.updateNode(to, {
193
- children: [...(newSeg.children ?? []), VENT_ID],
194
- });
195
- }
196
- // 2. Then the auto-reparent path via parentId.
197
- st.updateNode(VENT_ID, {
198
- parentId: to,
199
- roofSegmentId: to,
200
- });
201
- };
202
- hop(SEG_A_ID, SEG_B_ID);
203
- hop(SEG_B_ID, SEG_A_ID);
204
- hop(SEG_A_ID, SEG_B_ID);
205
- expect(childrenOf(SEG_A_ID)).toEqual([]);
206
- expect(childrenOf(SEG_B_ID)).toEqual([VENT_ID]);
207
- expect(vent().parentId).toBe(SEG_B_ID);
208
- const totalListings = childrenOf(SEG_A_ID).filter((id) => id === VENT_ID).length +
209
- childrenOf(SEG_B_ID).filter((id) => id === VENT_ID).length;
210
- expect(totalListings).toBe(1);
211
- });
212
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=ridge-vent-update.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ridge-vent-update.test.d.ts","sourceRoot":"","sources":["../../../src/store/actions/ridge-vent-update.test.ts"],"names":[],"mappings":""}
@@ -1,264 +0,0 @@
1
- import { beforeEach, describe, expect, test } from 'bun:test';
2
- import { createDefaultRidgeVentsForSegment, RidgeVentNode } from '../../schema/nodes/ridge-vent';
3
- import { RoofNode } from '../../schema/nodes/roof';
4
- import { RoofSegmentNode } from '../../schema/nodes/roof-segment';
5
- import useScene from '../use-scene';
6
- globalThis.requestAnimationFrame ??= ((cb) => {
7
- cb(0);
8
- return 0;
9
- });
10
- globalThis.cancelAnimationFrame ??=
11
- () => { };
12
- describe('roof segment default ridge vents', () => {
13
- beforeEach(() => {
14
- useScene.setState({
15
- nodes: {},
16
- rootNodeIds: [],
17
- dirtyNodes: new Set(),
18
- collections: {},
19
- materials: {},
20
- readOnly: false,
21
- });
22
- });
23
- test('regenerates default ridge vents when the host ridge geometry changes', () => {
24
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
25
- const segment = RoofSegmentNode.parse({
26
- id: 'rseg_test',
27
- parentId: roof.id,
28
- roofType: 'gable',
29
- width: 8,
30
- depth: 6,
31
- });
32
- const defaults = createDefaultRidgeVentsForSegment(segment);
33
- const custom = RidgeVentNode.parse({
34
- id: 'rvent_custom',
35
- parentId: segment.id,
36
- roofSegmentId: segment.id,
37
- name: 'Custom Ridge Vent',
38
- position: [0, 0.2, 0],
39
- length: 1.25,
40
- materialPreset: 'preset-custom',
41
- });
42
- useScene.getState().setScene({
43
- [roof.id]: { ...roof, children: [segment.id] },
44
- [segment.id]: {
45
- ...segment,
46
- children: [...defaults.map((vent) => vent.id), custom.id],
47
- },
48
- ...Object.fromEntries(defaults.map((vent) => [
49
- vent.id,
50
- { ...vent, parentId: segment.id, roofSegmentId: segment.id },
51
- ])),
52
- [custom.id]: custom,
53
- }, [roof.id]);
54
- const oldDefaultIds = defaults.map((vent) => vent.id);
55
- useScene.getState().updateNode(segment.id, { width: 12 });
56
- const nextSegment = useScene.getState().nodes[segment.id];
57
- const nextChildren = nextSegment?.children ?? [];
58
- const nextDefaultIds = nextChildren.filter((id) => id !== custom.id);
59
- expect(nextChildren).toContain(custom.id);
60
- expect(useScene.getState().nodes[custom.id]).toMatchObject({
61
- length: 1.25,
62
- materialPreset: 'preset-custom',
63
- });
64
- for (const oldId of oldDefaultIds) {
65
- expect(useScene.getState().nodes[oldId]).toBeUndefined();
66
- }
67
- expect(nextDefaultIds).toHaveLength(defaults.length);
68
- expect(nextDefaultIds.some((id) => {
69
- const node = useScene.getState().nodes[id];
70
- return node?.type === 'ridge-vent' && node.length > (defaults[0]?.length ?? 0);
71
- })).toBe(true);
72
- });
73
- test('does not regenerate default ridge vents when only trim changes', () => {
74
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
75
- const segment = RoofSegmentNode.parse({
76
- id: 'rseg_test',
77
- parentId: roof.id,
78
- roofType: 'gable',
79
- width: 8,
80
- depth: 6,
81
- });
82
- const defaults = createDefaultRidgeVentsForSegment(segment);
83
- useScene.getState().setScene({
84
- [roof.id]: { ...roof, children: [segment.id] },
85
- [segment.id]: {
86
- ...segment,
87
- children: defaults.map((vent) => vent.id),
88
- },
89
- ...Object.fromEntries(defaults.map((vent) => [
90
- vent.id,
91
- { ...vent, parentId: segment.id, roofSegmentId: segment.id },
92
- ])),
93
- }, [roof.id]);
94
- const originalDefaultId = defaults[0]?.id;
95
- useScene.getState().updateNode(segment.id, {
96
- trim: { ...segment.trim, left: 2, frontLeftX: 2, frontLeftZ: 3 },
97
- });
98
- const nextSegment = useScene.getState().nodes[segment.id];
99
- expect(nextSegment?.children).toEqual(defaults.map((vent) => vent.id));
100
- expect(useScene.getState().nodes[originalDefaultId]).toMatchObject({
101
- id: originalDefaultId,
102
- length: defaults[0]?.length,
103
- position: defaults[0]?.position,
104
- });
105
- });
106
- test('creates default ridge vents after a geometry change when auto ridge vent is enabled', () => {
107
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
108
- const segment = RoofSegmentNode.parse({
109
- id: 'rseg_test',
110
- parentId: roof.id,
111
- roofType: 'flat',
112
- width: 8,
113
- depth: 6,
114
- metadata: { autoRidgeVent: true },
115
- });
116
- useScene.getState().setScene({
117
- [roof.id]: { ...roof, children: [segment.id] },
118
- [segment.id]: segment,
119
- }, [roof.id]);
120
- useScene.getState().updateNode(segment.id, {
121
- roofType: 'gable',
122
- });
123
- const nextSegment = useScene.getState().nodes[segment.id];
124
- expect(nextSegment?.children).toHaveLength(1);
125
- expect(useScene.getState().nodes[nextSegment?.children[0]]).toMatchObject({
126
- type: 'ridge-vent',
127
- roofSegmentId: segment.id,
128
- });
129
- });
130
- test('regenerates default ridge vents when Dutch auto-vent fields change', () => {
131
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
132
- const segment = RoofSegmentNode.parse({
133
- id: 'rseg_test',
134
- parentId: roof.id,
135
- roofType: 'dutch',
136
- width: 8,
137
- depth: 6,
138
- metadata: { autoRidgeVent: true },
139
- });
140
- const defaults = createDefaultRidgeVentsForSegment(segment);
141
- useScene.getState().setScene({
142
- [roof.id]: { ...roof, children: [segment.id] },
143
- [segment.id]: {
144
- ...segment,
145
- children: defaults.map((vent) => vent.id),
146
- },
147
- ...Object.fromEntries(defaults.map((vent) => [
148
- vent.id,
149
- { ...vent, parentId: segment.id, roofSegmentId: segment.id },
150
- ])),
151
- }, [roof.id]);
152
- const originalDefaultIds = defaults.map((vent) => vent.id);
153
- useScene.getState().updateNode(segment.id, {
154
- pitch: 52,
155
- dutchWaistLengthRatio: 0.72,
156
- dutchGabletRake: 0.9,
157
- });
158
- const nextSegment = useScene.getState().nodes[segment.id];
159
- const nextChildren = nextSegment?.children ?? [];
160
- expect(nextChildren).toHaveLength(defaults.length);
161
- expect(nextChildren.some((id) => originalDefaultIds.includes(id))).toBe(false);
162
- for (const oldId of originalDefaultIds) {
163
- expect(useScene.getState().nodes[oldId]).toBeUndefined();
164
- }
165
- });
166
- test('refresh replaces legacy default vents that still use preset-white', () => {
167
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
168
- const segment = RoofSegmentNode.parse({
169
- id: 'rseg_test',
170
- parentId: roof.id,
171
- roofType: 'gable',
172
- width: 8,
173
- depth: 6,
174
- metadata: { autoRidgeVent: true },
175
- });
176
- const legacyDefault = RidgeVentNode.parse({
177
- id: 'rvent_legacy',
178
- parentId: segment.id,
179
- roofSegmentId: segment.id,
180
- name: 'Ridge Vent',
181
- style: 'shingled',
182
- materialPreset: 'preset-white',
183
- position: [0, 0, 0],
184
- length: 8,
185
- });
186
- useScene.getState().setScene({
187
- [roof.id]: { ...roof, children: [segment.id] },
188
- [segment.id]: {
189
- ...segment,
190
- children: [legacyDefault.id],
191
- },
192
- [legacyDefault.id]: legacyDefault,
193
- }, [roof.id]);
194
- useScene.getState().updateNode(segment.id, {
195
- pitch: 52,
196
- });
197
- const nextSegment = useScene.getState().nodes[segment.id];
198
- const nextChildren = nextSegment?.children ?? [];
199
- expect(nextChildren).toHaveLength(1);
200
- expect(nextChildren[0]).not.toBe(legacyDefault.id);
201
- expect(useScene.getState().nodes[legacyDefault.id]).toBeUndefined();
202
- });
203
- test('refresh preserves user-created default-looking ridge vents without legacy preset metadata', () => {
204
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
205
- const segment = RoofSegmentNode.parse({
206
- id: 'rseg_test',
207
- parentId: roof.id,
208
- roofType: 'gable',
209
- width: 8,
210
- depth: 6,
211
- metadata: { autoRidgeVent: true },
212
- });
213
- const userVent = RidgeVentNode.parse({
214
- id: 'rvent_user',
215
- parentId: segment.id,
216
- roofSegmentId: segment.id,
217
- name: 'Ridge Vent',
218
- style: 'shingled',
219
- position: [0, 0, 0],
220
- length: 8,
221
- });
222
- useScene.getState().setScene({
223
- [roof.id]: { ...roof, children: [segment.id] },
224
- [segment.id]: {
225
- ...segment,
226
- children: [userVent.id],
227
- },
228
- [userVent.id]: userVent,
229
- }, [roof.id]);
230
- useScene.getState().updateNode(segment.id, {
231
- pitch: 52,
232
- });
233
- const nextSegment = useScene.getState().nodes[segment.id];
234
- const nextChildren = nextSegment?.children ?? [];
235
- expect(nextChildren).toContain(userVent.id);
236
- expect(useScene.getState().nodes[userVent.id]).toMatchObject({
237
- id: userVent.id,
238
- roofSegmentId: segment.id,
239
- name: 'Ridge Vent',
240
- style: 'shingled',
241
- length: 8,
242
- });
243
- });
244
- test('does not create default ridge vents after a geometry change when auto ridge vent is disabled', () => {
245
- const roof = RoofNode.parse({ id: 'roof_test', children: [] });
246
- const segment = RoofSegmentNode.parse({
247
- id: 'rseg_test',
248
- parentId: roof.id,
249
- roofType: 'flat',
250
- width: 8,
251
- depth: 6,
252
- metadata: { autoRidgeVent: false },
253
- });
254
- useScene.getState().setScene({
255
- [roof.id]: { ...roof, children: [segment.id] },
256
- [segment.id]: segment,
257
- }, [roof.id]);
258
- useScene.getState().updateNode(segment.id, {
259
- roofType: 'gable',
260
- });
261
- const nextSegment = useScene.getState().nodes[segment.id];
262
- expect(nextSegment?.children ?? []).toHaveLength(0);
263
- });
264
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=use-scene-dirty-tracking.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"use-scene-dirty-tracking.test.d.ts","sourceRoot":"","sources":["../../src/store/use-scene-dirty-tracking.test.ts"],"names":[],"mappings":""}