@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,219 +0,0 @@
1
- import { beforeEach, describe, expect, mock, test } from 'bun:test';
2
- import { z } from 'zod';
3
- import { nodeRegistry, registerNode } from '../registry/registry';
4
- import { createDragSession } from './drag-session';
5
- const id = (s) => s;
6
- function makeSpyScene(initial = {}) {
7
- const calls = {
8
- pauseHistory: 0,
9
- resumeHistory: 0,
10
- restoreAll: 0,
11
- markedDirty: [],
12
- updated: [],
13
- };
14
- const nodes = { ...initial };
15
- return {
16
- get: ((nid) => nodes[nid]),
17
- nodes: () => nodes,
18
- update: (nid, patch) => {
19
- calls.updated.push([nid, patch]);
20
- const existing = nodes[nid];
21
- if (existing)
22
- nodes[nid] = { ...existing, ...patch };
23
- },
24
- upsert: (n) => {
25
- nodes[n.id] = n;
26
- return n.id;
27
- },
28
- delete: (nid) => {
29
- delete nodes[nid];
30
- },
31
- restore: () => { },
32
- restoreAll: () => {
33
- calls.restoreAll += 1;
34
- },
35
- markDirty: (nid) => {
36
- calls.markedDirty.push(nid);
37
- },
38
- pauseHistory: () => {
39
- calls.pauseHistory += 1;
40
- },
41
- resumeHistory: () => {
42
- calls.resumeHistory += 1;
43
- },
44
- getSubtree: () => null,
45
- cloneNodesInto: () => null,
46
- _calls: calls,
47
- };
48
- }
49
- function makeDef(kind, relations) {
50
- return {
51
- kind,
52
- schemaVersion: 1,
53
- schema: z.object({ type: z.literal(kind) }),
54
- category: 'utility',
55
- defaults: () => ({}),
56
- capabilities: {},
57
- relations,
58
- renderer: { kind: 'parametric', module: async () => ({ default: () => null }) },
59
- };
60
- }
61
- function makeAction() {
62
- return {
63
- begin: ({ node }) => ({ id: node?.id ?? id('default') }),
64
- preview: (_ctx, point) => ({ x: point[0] }),
65
- apply: (_draft, ctx) => [ctx.id],
66
- cancel: () => { },
67
- };
68
- }
69
- describe('createDragSession', () => {
70
- beforeEach(() => {
71
- nodeRegistry._reset();
72
- });
73
- test('start pauses history; commit resumes', () => {
74
- const scene = makeSpyScene();
75
- const session = createDragSession(makeAction(), scene);
76
- session.start({ point: [0, 0] });
77
- expect(scene._calls.pauseHistory).toBe(1);
78
- expect(scene._calls.resumeHistory).toBe(0);
79
- session.commit();
80
- expect(scene._calls.resumeHistory).toBe(1);
81
- });
82
- test('cancel resumes history and calls restoreAll', () => {
83
- const scene = makeSpyScene();
84
- const session = createDragSession(makeAction(), scene);
85
- session.start({ point: [0, 0] });
86
- session.cancel();
87
- expect(scene._calls.resumeHistory).toBe(1);
88
- expect(scene._calls.restoreAll).toBe(1);
89
- });
90
- test('move runs preview + apply and marks the returned id dirty', () => {
91
- const scene = makeSpyScene({ a: { id: id('a'), type: 'thing' } });
92
- const session = createDragSession(makeAction(), scene);
93
- session.start({ point: [0, 0], node: { id: id('a') } });
94
- session.move([1, 0], { shift: false, alt: false, ctrl: false, meta: false });
95
- expect(session.getDraft()).toEqual({ x: 1 });
96
- expect(scene._calls.markedDirty).toContain(id('a'));
97
- });
98
- test('snap callback is invoked when defined', () => {
99
- const action = {
100
- ...makeAction(),
101
- snap: (draft) => ({ x: Math.round(draft.x) }),
102
- };
103
- const scene = makeSpyScene({ a: { id: id('a'), type: 'thing' } });
104
- const session = createDragSession(action, scene);
105
- session.start({ point: [0, 0], node: { id: id('a') } });
106
- session.move([0.7, 0], { shift: false, alt: false, ctrl: false, meta: false });
107
- expect(session.getDraft()).toEqual({ x: 1 });
108
- });
109
- test('commit returns false when action.commit returns false; calls action.cancel and restoreAll', () => {
110
- const cancelSpy = mock(() => { });
111
- const action = {
112
- ...makeAction(),
113
- cancel: cancelSpy,
114
- commit: () => false,
115
- };
116
- const scene = makeSpyScene({ a: { id: id('a'), type: 'thing' } });
117
- const session = createDragSession(action, scene);
118
- session.start({ point: [0, 0], node: { id: id('a') } });
119
- session.move([1, 0], { shift: false, alt: false, ctrl: false, meta: false });
120
- const result = session.commit();
121
- expect(result).toBe(false);
122
- expect(cancelSpy).toHaveBeenCalledTimes(1);
123
- expect(scene._calls.restoreAll).toBe(1);
124
- });
125
- test('move is a no-op when session is not active', () => {
126
- const scene = makeSpyScene();
127
- const session = createDragSession(makeAction(), scene);
128
- session.move([1, 0], { shift: false, alt: false, ctrl: false, meta: false });
129
- expect(scene._calls.markedDirty.length).toBe(0);
130
- });
131
- test('repeated start is a no-op (re-entry guard)', () => {
132
- const scene = makeSpyScene();
133
- const session = createDragSession(makeAction(), scene);
134
- session.start({ point: [0, 0] });
135
- session.start({ point: [99, 99] });
136
- expect(scene._calls.pauseHistory).toBe(1); // only one pause
137
- });
138
- test('dispose mid-drag cancels and cleans up', () => {
139
- const scene = makeSpyScene();
140
- const session = createDragSession(makeAction(), scene);
141
- session.start({ point: [0, 0] });
142
- expect(session.isActive()).toBe(true);
143
- session.dispose();
144
- expect(session.isActive()).toBe(false);
145
- expect(scene._calls.resumeHistory).toBe(1);
146
- expect(scene._calls.restoreAll).toBe(1);
147
- });
148
- test('dispose when inactive is a no-op', () => {
149
- const scene = makeSpyScene();
150
- const session = createDragSession(makeAction(), scene);
151
- session.dispose();
152
- expect(scene._calls.pauseHistory).toBe(0);
153
- expect(scene._calls.resumeHistory).toBe(0);
154
- });
155
- test('onCommit callback fires on successful commit', () => {
156
- const onCommit = mock(() => { });
157
- const onCancel = mock(() => { });
158
- const scene = makeSpyScene();
159
- const session = createDragSession(makeAction(), scene, { onCommit, onCancel });
160
- session.start({ point: [0, 0] });
161
- session.commit();
162
- expect(onCommit).toHaveBeenCalledTimes(1);
163
- expect(onCancel).toHaveBeenCalledTimes(0);
164
- });
165
- test('onCancel callback fires on explicit cancel', () => {
166
- const onCommit = mock(() => { });
167
- const onCancel = mock(() => { });
168
- const scene = makeSpyScene();
169
- const session = createDragSession(makeAction(), scene, { onCommit, onCancel });
170
- session.start({ point: [0, 0] });
171
- session.cancel();
172
- expect(onCommit).toHaveBeenCalledTimes(0);
173
- expect(onCancel).toHaveBeenCalledTimes(1);
174
- });
175
- test('dispose does NOT fire onCancel (silent cleanup)', () => {
176
- const onCommit = mock(() => { });
177
- const onCancel = mock(() => { });
178
- const scene = makeSpyScene();
179
- const session = createDragSession(makeAction(), scene, { onCommit, onCancel });
180
- session.start({ point: [0, 0] });
181
- session.dispose();
182
- expect(onCommit).toHaveBeenCalledTimes(0);
183
- expect(onCancel).toHaveBeenCalledTimes(0);
184
- expect(scene._calls.resumeHistory).toBe(1);
185
- expect(scene._calls.restoreAll).toBe(1);
186
- });
187
- test('dirty cascade fires once per id even across multiple move ticks', () => {
188
- // Register a kind with no relations — cascade returns just {startId}.
189
- registerNode(makeDef('thing'));
190
- const scene = makeSpyScene({ a: { id: id('a'), type: 'thing' } });
191
- const session = createDragSession(makeAction(), scene);
192
- session.start({ point: [0, 0], node: { id: id('a') } });
193
- session.move([1, 0], { shift: false, alt: false, ctrl: false, meta: false });
194
- session.move([2, 0], { shift: false, alt: false, ctrl: false, meta: false });
195
- session.move([3, 0], { shift: false, alt: false, ctrl: false, meta: false });
196
- // a is marked once, not three times
197
- expect(scene._calls.markedDirty.filter((mid) => mid === id('a')).length).toBe(1);
198
- });
199
- test('dirty cascade follows hosts relations from the registry', () => {
200
- registerNode(makeDef('wall', { hosts: ['door'] }));
201
- registerNode(makeDef('door'));
202
- const scene = makeSpyScene({
203
- w: { id: id('w'), type: 'wall', children: [id('d')] },
204
- d: { id: id('d'), type: 'door', parentId: id('w') },
205
- });
206
- const action = {
207
- begin: () => ({ id: id('w') }),
208
- preview: (_ctx, point) => ({ x: point[0] }),
209
- apply: (_draft, ctx) => [ctx.id],
210
- cancel: () => { },
211
- };
212
- const session = createDragSession(action, scene);
213
- session.start({ point: [0, 0], node: { id: id('w') } });
214
- session.move([1, 0], { shift: false, alt: false, ctrl: false, meta: false });
215
- // both wall and door marked dirty
216
- expect(scene._calls.markedDirty).toContain(id('w'));
217
- expect(scene._calls.markedDirty).toContain(id('d'));
218
- });
219
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=hosting.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"hosting.test.d.ts","sourceRoot":"","sources":["../../src/services/hosting.test.ts"],"names":[],"mappings":""}
@@ -1,199 +0,0 @@
1
- import { beforeEach, describe, expect, test } from 'bun:test';
2
- import { z } from 'zod';
3
- import { nodeRegistry, registerNode } from '../registry/registry';
4
- import { canAttach, clampYToHostTop, getSurface, getTopSurfaceHeight, MAX_HOST_DEPTH, pickHost, } from './hosting';
5
- const id = (s) => s;
6
- function makeDef(kind, capabilities = {}, overrides = {}) {
7
- return {
8
- kind,
9
- schemaVersion: 1,
10
- schema: z.object({ type: z.literal(kind) }),
11
- category: 'utility',
12
- defaults: () => ({}),
13
- capabilities,
14
- renderer: { kind: 'parametric', module: async () => ({ default: () => null }) },
15
- ...overrides,
16
- };
17
- }
18
- function makeNode(kind, idStr, parentId = null) {
19
- return {
20
- id: id(idStr),
21
- type: kind,
22
- parentId: parentId ? id(parentId) : null,
23
- visible: true,
24
- };
25
- }
26
- function makeFakeScene(nodes) {
27
- return {
28
- get: ((nid) => nodes[nid]),
29
- nodes: () => nodes,
30
- update: () => { },
31
- upsert: () => id(''),
32
- delete: () => { },
33
- restore: () => { },
34
- restoreAll: () => { },
35
- markDirty: () => { },
36
- pauseHistory: () => { },
37
- resumeHistory: () => { },
38
- getSubtree: () => null,
39
- cloneNodesInto: () => null,
40
- };
41
- }
42
- describe('canAttach', () => {
43
- beforeEach(() => {
44
- nodeRegistry._reset();
45
- });
46
- test('rejects self-host', () => {
47
- const scene = makeFakeScene({ a: makeNode('thing', 'a') });
48
- const result = canAttach(id('a'), id('a'), scene);
49
- expect(result.ok).toBe(false);
50
- if (!result.ok)
51
- expect(result.error.kind).toBe('self-host');
52
- });
53
- test('rejects missing host', () => {
54
- const scene = makeFakeScene({ a: makeNode('thing', 'a') });
55
- const result = canAttach(id('a'), id('missing'), scene);
56
- expect(result.ok).toBe(false);
57
- if (!result.ok)
58
- expect(result.error.kind).toBe('host-missing');
59
- });
60
- test('detects cycle when host is a descendant of child', () => {
61
- // child=a, host=b, b's parent chain leads back to a → cycle.
62
- const scene = makeFakeScene({
63
- a: makeNode('thing', 'a'),
64
- b: makeNode('thing', 'b', 'c'),
65
- c: makeNode('thing', 'c', 'a'), // c.parent = a, b.parent = c → cycle if a → b
66
- });
67
- const result = canAttach(id('a'), id('b'), scene);
68
- expect(result.ok).toBe(false);
69
- if (!result.ok)
70
- expect(result.error.kind).toBe('cycle');
71
- });
72
- test('rejects when chain would exceed MAX_HOST_DEPTH', () => {
73
- const nodes = {};
74
- for (let i = 0; i <= MAX_HOST_DEPTH; i++) {
75
- nodes[`n${i}`] = makeNode('thing', `n${i}`, i === 0 ? null : `n${i - 1}`);
76
- }
77
- // n6 is already MAX_HOST_DEPTH deep — attaching n_new beneath it would
78
- // push the child to MAX_HOST_DEPTH + 1.
79
- nodes.candidate = makeNode('thing', 'candidate');
80
- const scene = makeFakeScene(nodes);
81
- const result = canAttach(id('candidate'), id(`n${MAX_HOST_DEPTH}`), scene);
82
- expect(result.ok).toBe(false);
83
- if (!result.ok)
84
- expect(result.error.kind).toBe('depth-exceeded');
85
- });
86
- test('accepts attach when chain stays within MAX_HOST_DEPTH', () => {
87
- const scene = makeFakeScene({
88
- root: makeNode('thing', 'root'),
89
- candidate: makeNode('thing', 'candidate'),
90
- });
91
- expect(canAttach(id('candidate'), id('root'), scene).ok).toBe(true);
92
- });
93
- test('rejects host kind not in child def.hostable.parents', () => {
94
- registerNode(makeDef('shelf', { hostable: { parents: ['wall', 'slab'] } }));
95
- const scene = makeFakeScene({
96
- s: makeNode('shelf', 's'),
97
- ceiling: makeNode('ceiling', 'ceiling'),
98
- });
99
- const result = canAttach(id('s'), id('ceiling'), scene);
100
- expect(result.ok).toBe(false);
101
- if (!result.ok)
102
- expect(result.error.kind).toBe('kind-not-allowed');
103
- });
104
- test('accepts when host kind is in parents', () => {
105
- registerNode(makeDef('shelf', { hostable: { parents: ['wall', 'slab'] } }));
106
- const scene = makeFakeScene({
107
- s: makeNode('shelf', 's'),
108
- w: makeNode('wall', 'w'),
109
- });
110
- expect(canAttach(id('s'), id('w'), scene).ok).toBe(true);
111
- });
112
- test('no def or no hostable.parents = no kind restriction', () => {
113
- // Some kinds (e.g. items via catalog) defer to runtime checks instead of
114
- // declaring parents up front. canAttach should not block them.
115
- const scene = makeFakeScene({
116
- i: makeNode('item', 'i'),
117
- w: makeNode('wall', 'w'),
118
- });
119
- expect(canAttach(id('i'), id('w'), scene).ok).toBe(true);
120
- });
121
- test('allows missing child (placement preview before commit)', () => {
122
- const scene = makeFakeScene({ w: makeNode('wall', 'w') });
123
- expect(canAttach(id('future-child'), id('w'), scene).ok).toBe(true);
124
- });
125
- });
126
- describe('getSurface / getTopSurfaceHeight', () => {
127
- beforeEach(() => {
128
- nodeRegistry._reset();
129
- });
130
- test('returns null when host has no registered def', () => {
131
- const node = makeNode('mystery', 'm');
132
- expect(getSurface(node)).toBeNull();
133
- expect(getTopSurfaceHeight(node)).toBeNull();
134
- });
135
- test('returns surface config when declared', () => {
136
- registerNode(makeDef('table', {
137
- surfaces: { top: { height: 0.74 } },
138
- }));
139
- const t = makeNode('table', 't');
140
- expect(getSurface(t)?.top?.height).toBe(0.74);
141
- expect(getTopSurfaceHeight(t)).toBe(0.74);
142
- });
143
- test('evaluates function-valued height with the node', () => {
144
- registerNode(makeDef('shelf', {
145
- surfaces: {
146
- top: {
147
- height: (n) => (n.id === id('high') ? 1.8 : 0.3),
148
- },
149
- },
150
- }));
151
- expect(getTopSurfaceHeight(makeNode('shelf', 'high'))).toBe(1.8);
152
- expect(getTopSurfaceHeight(makeNode('shelf', 'low'))).toBe(0.3);
153
- });
154
- });
155
- describe('clampYToHostTop', () => {
156
- beforeEach(() => {
157
- nodeRegistry._reset();
158
- });
159
- test('clamps to top when host has one', () => {
160
- registerNode(makeDef('table', { surfaces: { top: { height: 0.74 } } }));
161
- expect(clampYToHostTop(makeNode('table', 't'), 5)).toBe(0.74);
162
- });
163
- test('passes through when host has no top surface', () => {
164
- registerNode(makeDef('plain'));
165
- expect(clampYToHostTop(makeNode('plain', 'p'), 5)).toBe(5);
166
- });
167
- });
168
- describe('pickHost', () => {
169
- beforeEach(() => {
170
- nodeRegistry._reset();
171
- });
172
- test('returns first candidate that has hostable capability', () => {
173
- registerNode(makeDef('slab', { hostable: { parents: ['*'] } }));
174
- registerNode(makeDef('item')); // no hostable
175
- const candidates = [makeNode('item', 'i'), makeNode('slab', 's')];
176
- const picked = pickHost({
177
- point: [0, 0, 0],
178
- candidates,
179
- placedKind: 'chair',
180
- });
181
- expect(picked?.id).toBe(id('s'));
182
- });
183
- test('returns null when nothing in candidates is hostable', () => {
184
- registerNode(makeDef('item'));
185
- const candidates = [makeNode('item', 'i')];
186
- expect(pickHost({ point: [0, 0, 0], candidates, placedKind: 'chair' })).toBeNull();
187
- });
188
- test('hitTest can reject hostable candidates', () => {
189
- registerNode(makeDef('slab', { hostable: { parents: ['*'] } }));
190
- const candidates = [makeNode('slab', 's1'), makeNode('slab', 's2')];
191
- const picked = pickHost({
192
- point: [0, 0, 0],
193
- candidates,
194
- placedKind: 'chair',
195
- hitTest: (host) => host.id === id('s2'),
196
- });
197
- expect(picked?.id).toBe(id('s2'));
198
- });
199
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=movement.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"movement.test.d.ts","sourceRoot":"","sources":["../../src/services/movement.test.ts"],"names":[],"mappings":""}
@@ -1,133 +0,0 @@
1
- import { beforeEach, describe, expect, test } from 'bun:test';
2
- import { z } from 'zod';
3
- import { nodeRegistry, registerNode } from '../registry/registry';
4
- import { applyAxisLock, isMovable, movePlanToward, moveToward, resolveMovable } from './movement';
5
- const id = (s) => s;
6
- function makeDef(kind, capabilities = {}) {
7
- return {
8
- kind,
9
- schemaVersion: 1,
10
- schema: z.object({ type: z.literal(kind) }),
11
- category: 'utility',
12
- defaults: () => ({}),
13
- capabilities,
14
- renderer: { kind: 'parametric', module: async () => ({ default: () => null }) },
15
- };
16
- }
17
- function makeNode(kind, idStr) {
18
- return {
19
- id: id(idStr),
20
- type: kind,
21
- parentId: null,
22
- visible: true,
23
- };
24
- }
25
- describe('resolveMovable', () => {
26
- beforeEach(() => {
27
- nodeRegistry._reset();
28
- });
29
- test('returns null when no def is registered', () => {
30
- expect(resolveMovable(makeNode('mystery', 'm'))).toBeNull();
31
- });
32
- test('returns null when def declares no movable capability', () => {
33
- registerNode(makeDef('static'));
34
- expect(resolveMovable(makeNode('static', 's'))).toBeNull();
35
- });
36
- test('returns the declared config', () => {
37
- registerNode(makeDef('column', { movable: { axes: ['x', 'z'], gridSnap: true } }));
38
- const config = resolveMovable(makeNode('column', 'c'));
39
- expect(config?.axes).toEqual(['x', 'z']);
40
- expect(config?.gridSnap).toBe(true);
41
- });
42
- test('runs override callback when present', () => {
43
- let overrideRan = false;
44
- const config = {
45
- axes: ['x'],
46
- override: () => {
47
- overrideRan = true;
48
- return { axes: ['y'] };
49
- },
50
- };
51
- registerNode(makeDef('weird', { movable: config }));
52
- const resolved = resolveMovable(makeNode('weird', 'w'));
53
- expect(overrideRan).toBe(true);
54
- expect(resolved?.axes).toEqual(['y']);
55
- });
56
- test('override returning null falls back to base config', () => {
57
- registerNode(makeDef('column', {
58
- movable: { axes: ['x', 'z'], override: () => null },
59
- }));
60
- const resolved = resolveMovable(makeNode('column', 'c'));
61
- expect(resolved?.axes).toEqual(['x', 'z']);
62
- });
63
- });
64
- describe('applyAxisLock', () => {
65
- test('passes through unlocked axes only', () => {
66
- expect(applyAxisLock([1, 2, 3], [10, 20, 30], ['x'])).toEqual([10, 2, 3]);
67
- expect(applyAxisLock([1, 2, 3], [10, 20, 30], ['x', 'z'])).toEqual([10, 2, 30]);
68
- expect(applyAxisLock([1, 2, 3], [10, 20, 30], ['x', 'y', 'z'])).toEqual([10, 20, 30]);
69
- });
70
- test('empty lock returns current unchanged', () => {
71
- expect(applyAxisLock([1, 2, 3], [10, 20, 30], [])).toEqual([1, 2, 3]);
72
- });
73
- });
74
- describe('moveToward', () => {
75
- beforeEach(() => {
76
- nodeRegistry._reset();
77
- });
78
- test('returns null when node is not movable', () => {
79
- registerNode(makeDef('static'));
80
- expect(moveToward(makeNode('static', 's'), [0, 0, 0], [1, 1, 1])).toBeNull();
81
- });
82
- test('axis-locks and returns the constrained target', () => {
83
- registerNode(makeDef('column', { movable: { axes: ['x', 'z'] } }));
84
- expect(moveToward(makeNode('column', 'c'), [0, 0.5, 0], [1, 99, 2])).toEqual([1, 0.5, 2]);
85
- });
86
- test('applies grid snap when capability declares gridSnap: true', () => {
87
- registerNode(makeDef('column', { movable: { axes: ['x', 'z'], gridSnap: true } }));
88
- const result = moveToward(makeNode('column', 'c'), [0, 0, 0], [0.3, 0, 0.6], {
89
- gridStep: 0.25,
90
- });
91
- expect(result).toEqual([0.25, 0, 0.5]);
92
- });
93
- test('grid snap can be overridden at call site', () => {
94
- registerNode(makeDef('column', { movable: { axes: ['x', 'z'], gridSnap: true } }));
95
- // Caller explicitly disables grid snap for this call
96
- const result = moveToward(makeNode('column', 'c'), [0, 0, 0], [0.3, 0, 0.6], {
97
- gridSnap: false,
98
- });
99
- expect(result).toEqual([0.3, 0, 0.6]);
100
- });
101
- });
102
- describe('movePlanToward', () => {
103
- beforeEach(() => {
104
- nodeRegistry._reset();
105
- });
106
- test('returns 2D point with X/Z constrained, Y dropped', () => {
107
- registerNode(makeDef('column', { movable: { axes: ['x', 'z'], gridSnap: true } }));
108
- const result = movePlanToward(makeNode('column', 'c'), 0.5, // currentY
109
- [0, 0], [0.3, 0.6], { gridStep: 0.25 });
110
- expect(result).toEqual([0.25, 0.5]);
111
- });
112
- test('returns null when node is not movable', () => {
113
- registerNode(makeDef('static'));
114
- expect(movePlanToward(makeNode('static', 's'), 0, [0, 0], [1, 1])).toBeNull();
115
- });
116
- });
117
- describe('isMovable', () => {
118
- beforeEach(() => {
119
- nodeRegistry._reset();
120
- });
121
- test('true when movable.axes has entries', () => {
122
- registerNode(makeDef('column', { movable: { axes: ['x'] } }));
123
- expect(isMovable(makeNode('column', 'c'))).toBe(true);
124
- });
125
- test('false when no movable capability', () => {
126
- registerNode(makeDef('static'));
127
- expect(isMovable(makeNode('static', 's'))).toBe(false);
128
- });
129
- test('false when movable.axes is empty', () => {
130
- registerNode(makeDef('locked', { movable: { axes: [] } }));
131
- expect(isMovable(makeNode('locked', 'l'))).toBe(false);
132
- });
133
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=single-undo-dance.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"single-undo-dance.test.d.ts","sourceRoot":"","sources":["../../src/services/single-undo-dance.test.ts"],"names":[],"mappings":""}