@weasel-js/core 1.13.0 → 1.14.0

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 (741) hide show
  1. package/CHANGELOG.md +300 -0
  2. package/README.md +8 -12
  3. package/dist/affordances/hitAffordanceRegions.js +1 -1
  4. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  5. package/dist/affordances/pathAnchors.js.map +1 -1
  6. package/dist/animation/clipTargets.js +1 -1
  7. package/dist/animation/clipTargets.js.map +1 -1
  8. package/dist/animation/poseTarget.js +5 -32
  9. package/dist/animation/poseTarget.js.map +1 -1
  10. package/dist/{autoPoseDescriptor-CZ1eXbzY.d.ts → autoPoseDescriptor-C25QVb0W.d.ts} +1 -1
  11. package/dist/barrel/canvas.js +8 -8
  12. package/dist/barrel/chrome.js +9 -9
  13. package/dist/barrel/input.js +1 -1
  14. package/dist/barrel/interactions.js +3 -3
  15. package/dist/barrel/paint.js +2 -2
  16. package/dist/barrel/paths.js +19 -17
  17. package/dist/barrel/renderer.js +11 -7
  18. package/dist/barrel/routing.js +4 -1
  19. package/dist/barrel/scene.js +16 -12
  20. package/dist/barrel/text.js +5 -5
  21. package/dist/barrel/viewport.js +8 -8
  22. package/dist/canvas/Canvas.js +2 -2
  23. package/dist/canvas/Canvas.js.map +1 -1
  24. package/dist/canvas/CanvasView.js +20 -14
  25. package/dist/canvas/CanvasView.js.map +1 -1
  26. package/dist/canvas/GestureReason.js +64 -0
  27. package/dist/canvas/GestureReason.js.map +1 -0
  28. package/dist/canvas/GestureReason.module.js +7 -0
  29. package/dist/canvas/GestureReason.module.js.map +1 -0
  30. package/dist/canvas/LeanSceneCanvas.js +3 -1
  31. package/dist/canvas/LeanSceneCanvas.js.map +1 -1
  32. package/dist/canvas/NodeShape.js +2 -0
  33. package/dist/canvas/NodeShape.js.map +1 -1
  34. package/dist/canvas/PickHud.js +7 -3
  35. package/dist/canvas/PickHud.js.map +1 -1
  36. package/dist/canvas/SceneCanvas/CanvasKitProviders.js +1 -1
  37. package/dist/canvas/SceneCanvas/CanvasKitProviders.js.map +1 -1
  38. package/dist/canvas/SceneCanvas/DevHuds.js +2 -2
  39. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -1
  40. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +4 -2
  41. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  42. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +3 -1
  43. package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
  44. package/dist/canvas/SceneCanvas/brushOverlay.js.map +1 -1
  45. package/dist/canvas/SceneCanvas/builtinToolSets.js +17 -9
  46. package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -1
  47. package/dist/canvas/SceneCanvas/canvasPassThrough.js +2 -1
  48. package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -1
  49. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +75 -19
  50. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  51. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +7 -1
  52. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  53. package/dist/canvas/SceneCanvas/defaultTextEditor.js +108 -0
  54. package/dist/canvas/SceneCanvas/defaultTextEditor.js.map +1 -0
  55. package/dist/canvas/SceneCanvas/describePresets.js +47 -0
  56. package/dist/canvas/SceneCanvas/describePresets.js.map +1 -0
  57. package/dist/canvas/SceneCanvas/features.js +57 -16
  58. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  59. package/dist/canvas/SceneCanvas/mergeLayers.js +10 -1
  60. package/dist/canvas/SceneCanvas/mergeLayers.js.map +1 -1
  61. package/dist/canvas/SceneCanvas/namedPresets.js +52 -24
  62. package/dist/canvas/SceneCanvas/namedPresets.js.map +1 -1
  63. package/dist/canvas/SceneCanvas/presets/arrange.js +35 -10
  64. package/dist/canvas/SceneCanvas/presets/arrange.js.map +1 -1
  65. package/dist/canvas/SceneCanvas/presets/baseline.js +9 -0
  66. package/dist/canvas/SceneCanvas/presets/baseline.js.map +1 -0
  67. package/dist/canvas/SceneCanvas/presets/chrome.js.map +1 -1
  68. package/dist/canvas/SceneCanvas/presets/composites.js +43 -0
  69. package/dist/canvas/SceneCanvas/presets/composites.js.map +1 -0
  70. package/dist/canvas/SceneCanvas/presets/edit.js +79 -26
  71. package/dist/canvas/SceneCanvas/presets/edit.js.map +1 -1
  72. package/dist/canvas/SceneCanvas/presets/ingest.js +1 -0
  73. package/dist/canvas/SceneCanvas/presets/ingest.js.map +1 -1
  74. package/dist/canvas/SceneCanvas/presets/paths.js +58 -16
  75. package/dist/canvas/SceneCanvas/presets/paths.js.map +1 -1
  76. package/dist/canvas/SceneCanvas/presets/select.js +4 -2
  77. package/dist/canvas/SceneCanvas/presets/select.js.map +1 -1
  78. package/dist/canvas/SceneCanvas/presets/tools.js +24 -0
  79. package/dist/canvas/SceneCanvas/presets/tools.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/presets/transform.js +4 -0
  81. package/dist/canvas/SceneCanvas/presets/transform.js.map +1 -1
  82. package/dist/canvas/SceneCanvas/presets/view.js +3 -1
  83. package/dist/canvas/SceneCanvas/presets/view.js.map +1 -1
  84. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  85. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +1 -1
  86. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -1
  87. package/dist/canvas/SceneCanvas/toolRegistry.js +5 -4
  88. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
  89. package/dist/canvas/SceneCanvas/useCanvasTools.js +26 -10
  90. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/useContributionRoles.js +15 -2
  92. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +5 -4
  94. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js.map +1 -1
  95. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +1 -1
  96. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -1
  97. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +9 -8
  98. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
  99. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +2 -2
  100. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js.map +1 -1
  101. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +4 -1
  102. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/useSceneChrome.js +7 -4
  104. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
  105. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +9 -9
  106. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -1
  107. package/dist/canvas/SceneCanvas/useScenePicking.js +4 -7
  108. package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -1
  109. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +2 -1
  110. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -1
  111. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +6 -6
  112. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  113. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +2 -2
  114. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
  115. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +1 -1
  116. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -1
  117. package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js.map +1 -1
  118. package/dist/canvas/SceneCanvas/useToolKeybindings.js +2 -2
  119. package/dist/canvas/SceneCanvas/useToolKeybindings.js.map +1 -1
  120. package/dist/canvas/SceneCanvas/useViewportActions.js +5 -2
  121. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  122. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -1
  123. package/dist/canvas/SceneCanvas.js +22 -11
  124. package/dist/canvas/SceneCanvas.js.map +1 -1
  125. package/dist/canvas/SceneViewCanvas.js +1 -0
  126. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  127. package/dist/canvas/ViewMarker.js.map +1 -1
  128. package/dist/canvas/accentColor.js +14 -1
  129. package/dist/canvas/accentColor.js.map +1 -1
  130. package/dist/canvas/affordanceAt.js +2 -2
  131. package/dist/canvas/affordanceAt.js.map +1 -1
  132. package/dist/canvas/buildSceneTree.js +5 -3
  133. package/dist/canvas/buildSceneTree.js.map +1 -1
  134. package/dist/canvas/deps/editAnchors.js +4 -4
  135. package/dist/canvas/deps/editAnchors.js.map +1 -1
  136. package/dist/canvas/deps/enteredGroup.js +14 -5
  137. package/dist/canvas/deps/enteredGroup.js.map +1 -1
  138. package/dist/canvas/deps/ingestion.js +5 -1
  139. package/dist/canvas/deps/ingestion.js.map +1 -1
  140. package/dist/canvas/deps/insert.js.map +1 -1
  141. package/dist/canvas/deps/insertSite.js +5 -3
  142. package/dist/canvas/deps/insertSite.js.map +1 -1
  143. package/dist/canvas/deps/nodeAtPoint.js +1 -12
  144. package/dist/canvas/deps/nodeAtPoint.js.map +1 -1
  145. package/dist/canvas/deps/pathEditCommits.js +3 -3
  146. package/dist/canvas/deps/pathEditCommits.js.map +1 -1
  147. package/dist/canvas/deps/slice.js +16 -2
  148. package/dist/canvas/deps/slice.js.map +1 -1
  149. package/dist/canvas/deps/snap.js +5 -5
  150. package/dist/canvas/deps/snap.js.map +1 -1
  151. package/dist/canvas/deps/textEdit.js +5 -6
  152. package/dist/canvas/deps/textEdit.js.map +1 -1
  153. package/dist/canvas/derivedPath.js +8 -3
  154. package/dist/canvas/derivedPath.js.map +1 -1
  155. package/dist/canvas/getNodeAtPoint.js +2 -2
  156. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  157. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  158. package/dist/canvas/layerSlots.js.map +1 -1
  159. package/dist/canvas/nodeShapes/measurePainter.js +1 -1
  160. package/dist/canvas/nodeShapes/measurePainter.js.map +1 -1
  161. package/dist/canvas/nodeShapes/strokedBounds.js +5 -3
  162. package/dist/canvas/nodeShapes/strokedBounds.js.map +1 -1
  163. package/dist/canvas/overlayRoleStrokes.js +6 -0
  164. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  165. package/dist/canvas/pickIndex/scenePickIndex.js +10 -12
  166. package/dist/canvas/pickIndex/scenePickIndex.js.map +1 -1
  167. package/dist/canvas/sceneAdapter.js +10 -19
  168. package/dist/canvas/sceneAdapter.js.map +1 -1
  169. package/dist/canvas/sceneClipboard.js +17 -4
  170. package/dist/canvas/sceneClipboard.js.map +1 -1
  171. package/dist/canvas/sceneViewRender.js +3 -2
  172. package/dist/canvas/sceneViewRender.js.map +1 -1
  173. package/dist/canvas/surfaceContribution.js.map +1 -1
  174. package/dist/canvas/useCanvasPaint.js +10 -4
  175. package/dist/canvas/useCanvasPaint.js.map +1 -1
  176. package/dist/canvas/useHitObserver.js +1 -1
  177. package/dist/canvas/useHitObserver.js.map +1 -1
  178. package/dist/canvas/useViewAim.js +1 -1
  179. package/dist/canvas/useViewAim.js.map +1 -1
  180. package/dist/canvas/useViewHelpers.js +8 -5
  181. package/dist/canvas/useViewHelpers.js.map +1 -1
  182. package/dist/canvas/useViewNesting.js +39 -12
  183. package/dist/canvas/useViewNesting.js.map +1 -1
  184. package/dist/canvas/viewInputs.js.map +1 -1
  185. package/dist/canvas/viewMarkers.js +2 -2
  186. package/dist/canvas/viewMarkers.js.map +1 -1
  187. package/dist/canvas/viewRegistry.js +2 -2
  188. package/dist/canvas/viewRegistry.js.map +1 -1
  189. package/dist/canvas/viewSnap.js +67 -0
  190. package/dist/canvas/viewSnap.js.map +1 -0
  191. package/dist/clipboard.d.ts +6 -12
  192. package/dist/{clone-qb2e1F5p.d.ts → clone-Bz4iqGfE.d.ts} +10 -5
  193. package/dist/clone.d.ts +5 -5
  194. package/dist/core/geometry/booleanOfPaths.js +23 -0
  195. package/dist/core/geometry/booleanOfPaths.js.map +1 -0
  196. package/dist/core/geometry/pathPoseDescriptor.js +12 -9
  197. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -1
  198. package/dist/core/geometry/poseDescriptor.js +12 -3
  199. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  200. package/dist/core/geometry/targetFrame.js +2 -13
  201. package/dist/core/geometry/targetFrame.js.map +1 -1
  202. package/dist/core/layers/render.js +2 -1
  203. package/dist/core/layers/render.js.map +1 -1
  204. package/dist/core/layers/retain.js +5 -3
  205. package/dist/core/layers/retain.js.map +1 -1
  206. package/dist/core/ops/setPath.js +3 -0
  207. package/dist/core/ops/setPath.js.map +1 -1
  208. package/dist/core/paint/meshKindLazy.js.map +1 -1
  209. package/dist/core/paint/paintKindEntry.js.map +1 -1
  210. package/dist/core/paint/paintKinds.js +8 -1
  211. package/dist/core/paint/paintKinds.js.map +1 -1
  212. package/dist/core/scene/NodeProperties.js.map +1 -1
  213. package/dist/core/scene/NodeRouting.js.map +1 -1
  214. package/dist/core/scene/booleanGroup.js +33 -0
  215. package/dist/core/scene/booleanGroup.js.map +1 -0
  216. package/dist/core/scene/booleanOfChildren.js +53 -0
  217. package/dist/core/scene/booleanOfChildren.js.map +1 -0
  218. package/dist/core/scene/carryDescendants.js +18 -6
  219. package/dist/core/scene/carryDescendants.js.map +1 -1
  220. package/dist/core/scene/composeFrame.js +42 -5
  221. package/dist/core/scene/composeFrame.js.map +1 -1
  222. package/dist/core/scene/composePose.js +35 -16
  223. package/dist/core/scene/composePose.js.map +1 -1
  224. package/dist/core/scene/depMemo.js +36 -18
  225. package/dist/core/scene/depMemo.js.map +1 -1
  226. package/dist/core/scene/derivedParts.js +2 -23
  227. package/dist/core/scene/derivedParts.js.map +1 -1
  228. package/dist/core/scene/effectivePose.js +10 -0
  229. package/dist/core/scene/effectivePose.js.map +1 -1
  230. package/dist/core/scene/historyForm.js +5 -4
  231. package/dist/core/scene/historyForm.js.map +1 -1
  232. package/dist/core/scene/kitOps.js +5 -71
  233. package/dist/core/scene/kitOps.js.map +1 -1
  234. package/dist/core/scene/kitRegistry.js +5 -0
  235. package/dist/core/scene/kitRegistry.js.map +1 -1
  236. package/dist/core/scene/layerOps.js +82 -0
  237. package/dist/core/scene/layerOps.js.map +1 -0
  238. package/dist/core/scene/layoutPass.js +14 -12
  239. package/dist/core/scene/layoutPass.js.map +1 -1
  240. package/dist/core/scene/lockGuard.js +9 -3
  241. package/dist/core/scene/lockGuard.js.map +1 -1
  242. package/dist/core/scene/nestedHit.js +5 -5
  243. package/dist/core/scene/nestedHit.js.map +1 -1
  244. package/dist/core/scene/nodeFlags.js +8 -2
  245. package/dist/core/scene/nodeFlags.js.map +1 -1
  246. package/dist/core/scene/nodeGates.js +31 -2
  247. package/dist/core/scene/nodeGates.js.map +1 -1
  248. package/dist/core/scene/pathEffects/effects.js +22 -3
  249. package/dist/core/scene/pathEffects/effects.js.map +1 -1
  250. package/dist/core/scene/pathEffects/textAlong.js +16 -3
  251. package/dist/core/scene/pathEffects/textAlong.js.map +1 -1
  252. package/dist/core/scene/pathEffects/textAlongBands.js +65 -0
  253. package/dist/core/scene/pathEffects/textAlongBands.js.map +1 -0
  254. package/dist/core/scene/reconcileSpecs.js +1 -1
  255. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  256. package/dist/core/scene/scene.js +11 -5
  257. package/dist/core/scene/scene.js.map +1 -1
  258. package/dist/core/scene/sceneEdits.js +5 -2
  259. package/dist/core/scene/sceneEdits.js.map +1 -1
  260. package/dist/core/scene/scenePoseAdapter.js +10 -1
  261. package/dist/core/scene/scenePoseAdapter.js.map +1 -1
  262. package/dist/core/scene/scrollOffsets.js +93 -0
  263. package/dist/core/scene/scrollOffsets.js.map +1 -0
  264. package/dist/core/scene/serialization.js +15 -5
  265. package/dist/core/scene/serialization.js.map +1 -1
  266. package/dist/core/scene/statedFields.js +2 -1
  267. package/dist/core/scene/statedFields.js.map +1 -1
  268. package/dist/core/scene/strategyView.js +35 -0
  269. package/dist/core/scene/strategyView.js.map +1 -0
  270. package/dist/core/scene/types.js.map +1 -1
  271. package/dist/core/scene/useScene.js +2 -0
  272. package/dist/core/scene/useScene.js.map +1 -1
  273. package/dist/core/scene/worldSave.js +87 -0
  274. package/dist/core/scene/worldSave.js.map +1 -0
  275. package/dist/core/selection/selectionTarget.js +1 -1
  276. package/dist/core/selection/selectionTarget.js.map +1 -1
  277. package/dist/{cornerHandles-CNCb7aTY.d.ts → cornerHandles-DpmQM_z5.d.ts} +1 -1
  278. package/dist/{depSchema-CpIQzKWQ.d.ts → depSchema-C3BwxitB.d.ts} +119 -99
  279. package/dist/devtools-protocol.d.ts +2 -2
  280. package/dist/devtools.d.ts +2 -2
  281. package/dist/{features → domains}/chrome-caps/buildChromeCtx.js +1 -1
  282. package/dist/domains/chrome-caps/buildChromeCtx.js.map +1 -0
  283. package/dist/{features → domains}/chrome-caps/conditions.js +1 -1
  284. package/dist/domains/chrome-caps/conditions.js.map +1 -0
  285. package/dist/{features → domains}/chrome-caps/defaults.js +1 -1
  286. package/dist/domains/chrome-caps/defaults.js.map +1 -0
  287. package/dist/{features → domains}/chrome-caps/resolve.js +1 -1
  288. package/dist/domains/chrome-caps/resolve.js.map +1 -0
  289. package/dist/{features → domains}/chrome-caps/useChromeCaps.js +1 -1
  290. package/dist/domains/chrome-caps/useChromeCaps.js.map +1 -0
  291. package/dist/{features → domains}/chrome-caps/useHoverTracking.js +1 -1
  292. package/dist/domains/chrome-caps/useHoverTracking.js.map +1 -0
  293. package/dist/{features → domains}/ingestion/contentHandlers.js +20 -3
  294. package/dist/domains/ingestion/contentHandlers.js.map +1 -0
  295. package/dist/domains/ingestion/ghost.js +56 -0
  296. package/dist/domains/ingestion/ghost.js.map +1 -0
  297. package/dist/{features → domains}/ingestion/imageHandler.js +1 -1
  298. package/dist/domains/ingestion/imageHandler.js.map +1 -0
  299. package/dist/domains/ingestion/kitHandlers.js +22 -0
  300. package/dist/domains/ingestion/kitHandlers.js.map +1 -0
  301. package/dist/{features → domains}/ingestion/openFilePicker.js +1 -1
  302. package/dist/domains/ingestion/openFilePicker.js.map +1 -0
  303. package/dist/{features → domains}/ingestion/placement.js +1 -1
  304. package/dist/domains/ingestion/placement.js.map +1 -0
  305. package/dist/{features → domains}/ingestion/svgHandler.js +1 -1
  306. package/dist/domains/ingestion/svgHandler.js.map +1 -0
  307. package/dist/{features → domains}/ingestion/textHandler.js +9 -7
  308. package/dist/domains/ingestion/textHandler.js.map +1 -0
  309. package/dist/{features → domains}/ingestion/useCanvasIngestion.js +13 -15
  310. package/dist/domains/ingestion/useCanvasIngestion.js.map +1 -0
  311. package/dist/{features → domains}/ingestion/weaselJsonHandler.js +1 -1
  312. package/dist/domains/ingestion/weaselJsonHandler.js.map +1 -0
  313. package/dist/{features → domains}/longPress/longPressFeedback.js +1 -1
  314. package/dist/domains/longPress/longPressFeedback.js.map +1 -0
  315. package/dist/{features → domains}/measure/actionIds.js +1 -1
  316. package/dist/domains/measure/actionIds.js.map +1 -0
  317. package/dist/{features → domains}/measure/measureCommands.js +1 -1
  318. package/dist/domains/measure/measureCommands.js.map +1 -0
  319. package/dist/{features → domains}/measure/measureContribution.js +1 -1
  320. package/dist/domains/measure/measureContribution.js.map +1 -0
  321. package/dist/{features → domains}/measure/measureEdits.js +1 -1
  322. package/dist/domains/measure/measureEdits.js.map +1 -0
  323. package/dist/{features → domains}/measure/measureGestures.js +4 -7
  324. package/dist/domains/measure/measureGestures.js.map +1 -0
  325. package/dist/{features → domains}/measure/measureHit.js +1 -1
  326. package/dist/domains/measure/measureHit.js.map +1 -0
  327. package/dist/{features → domains}/measure/measureLayer.js +1 -1
  328. package/dist/domains/measure/measureLayer.js.map +1 -0
  329. package/dist/{features → domains}/measure/measurement.js +1 -1
  330. package/dist/domains/measure/measurement.js.map +1 -0
  331. package/dist/{features → domains}/measure/measurements.js +2 -2
  332. package/dist/domains/measure/measurements.js.map +1 -0
  333. package/dist/{features → domains}/modes/modeLayers.js +1 -1
  334. package/dist/domains/modes/modeLayers.js.map +1 -0
  335. package/dist/{features → domains}/modes/modeTriggers.js +3 -6
  336. package/dist/domains/modes/modeTriggers.js.map +1 -0
  337. package/dist/{features → domains}/pathEffects/effectSources.js +1 -1
  338. package/dist/domains/pathEffects/effectSources.js.map +1 -0
  339. package/dist/{features → domains}/pathEffects/index.js +1 -1
  340. package/dist/domains/pathEffects/index.js.map +1 -0
  341. package/dist/{features → domains}/pathEffects/readSource.js +1 -1
  342. package/dist/domains/pathEffects/readSource.js.map +1 -0
  343. package/dist/{features → domains}/pathEffects/textItems.js +11 -2
  344. package/dist/domains/pathEffects/textItems.js.map +1 -0
  345. package/dist/{features → domains}/pathEffects/useEffectSourcesLayer.js +1 -1
  346. package/dist/domains/pathEffects/useEffectSourcesLayer.js.map +1 -0
  347. package/dist/{features → domains}/paths/anchorData.js +1 -1
  348. package/dist/domains/paths/anchorData.js.map +1 -0
  349. package/dist/{features → domains}/paths/anchorMarkers.js +9 -7
  350. package/dist/domains/paths/anchorMarkers.js.map +1 -0
  351. package/dist/{features → domains}/paths/editablePath.js +1 -1
  352. package/dist/domains/paths/editablePath.js.map +1 -0
  353. package/dist/{features → domains}/paths/index.js +3 -3
  354. package/dist/{features → domains}/paths/originProjection.js +1 -1
  355. package/dist/domains/paths/originProjection.js.map +1 -0
  356. package/dist/{features → domains}/paths/pathEditExtension.js +1 -1
  357. package/dist/domains/paths/pathEditExtension.js.map +1 -0
  358. package/dist/{features → domains}/paths/pathEditState.js +1 -1
  359. package/dist/domains/paths/pathEditState.js.map +1 -0
  360. package/dist/{features → domains}/paths/pathEditingOverlayLayer.js +1 -1
  361. package/dist/domains/paths/pathEditingOverlayLayer.js.map +1 -0
  362. package/dist/{features → domains}/paths/pathLayer.js +1 -1
  363. package/dist/domains/paths/pathLayer.js.map +1 -0
  364. package/dist/{features → domains}/paths/pathRepresentation.js +1 -1
  365. package/dist/domains/paths/pathRepresentation.js.map +1 -0
  366. package/dist/{features → domains}/paths/pathSnap/glyphs.js +1 -1
  367. package/dist/domains/paths/pathSnap/glyphs.js.map +1 -0
  368. package/dist/{features → domains}/paths/pathSnap/pathSnapSource.js +1 -1
  369. package/dist/domains/paths/pathSnap/pathSnapSource.js.map +1 -0
  370. package/dist/{features → domains}/paths/pathSnap/sceneIndex.js +1 -1
  371. package/dist/domains/paths/pathSnap/sceneIndex.js.map +1 -0
  372. package/dist/{features → domains}/paths/pathSnap/snapGeometry.js +3 -2
  373. package/dist/domains/paths/pathSnap/snapGeometry.js.map +1 -0
  374. package/dist/{features → domains}/paths/penPreviewLayer.js +1 -1
  375. package/dist/domains/paths/penPreviewLayer.js.map +1 -0
  376. package/dist/{features → domains}/paths/shapeGenerator.js +6 -4
  377. package/dist/domains/paths/shapeGenerator.js.map +1 -0
  378. package/dist/{features → domains}/paths/strokeOutline.js +1 -1
  379. package/dist/domains/paths/strokeOutline.js.map +1 -0
  380. package/dist/{features → domains}/paths/useAnchorFields.js +1 -1
  381. package/dist/domains/paths/useAnchorFields.js.map +1 -0
  382. package/dist/{features → domains}/paths/usePathEdit.js +1 -1
  383. package/dist/domains/paths/usePathEdit.js.map +1 -0
  384. package/dist/{features → domains}/poseRun/usePoseRun.js +1 -1
  385. package/dist/domains/poseRun/usePoseRun.js.map +1 -0
  386. package/dist/{features → domains}/selection/enteredGroupFrame.js +49 -10
  387. package/dist/domains/selection/enteredGroupFrame.js.map +1 -0
  388. package/dist/{features → domains}/selection/enteredGroupScope.js +1 -1
  389. package/dist/domains/selection/enteredGroupScope.js.map +1 -0
  390. package/dist/domains/selection/enteredOperands.js +29 -0
  391. package/dist/domains/selection/enteredOperands.js.map +1 -0
  392. package/dist/{features → domains}/selection/handleCommands.js +1 -1
  393. package/dist/domains/selection/handleCommands.js.map +1 -0
  394. package/dist/{features → domains}/selection/overlay.js +1 -1
  395. package/dist/domains/selection/overlay.js.map +1 -0
  396. package/dist/{features → domains}/selection/selectionPose.js +1 -1
  397. package/dist/domains/selection/selectionPose.js.map +1 -0
  398. package/dist/{features → domains}/snap/angle2d.js +1 -1
  399. package/dist/domains/snap/angle2d.js.map +1 -0
  400. package/dist/{features → domains}/snap/debugCandidates.js +1 -1
  401. package/dist/domains/snap/debugCandidates.js.map +1 -0
  402. package/dist/{features → domains}/snap/gather.js +1 -1
  403. package/dist/domains/snap/gather.js.map +1 -0
  404. package/dist/{features → domains}/snap/inputSubspace.js +1 -1
  405. package/dist/domains/snap/inputSubspace.js.map +1 -0
  406. package/dist/{features → domains}/snap/lazySession.js +1 -1
  407. package/dist/domains/snap/lazySession.js.map +1 -0
  408. package/dist/{features → domains}/snap/marks.js +1 -1
  409. package/dist/domains/snap/marks.js.map +1 -0
  410. package/dist/{features → domains}/snap/outcomeStore.js +1 -1
  411. package/dist/domains/snap/outcomeStore.js.map +1 -0
  412. package/dist/{features → domains}/snap/pointSnap.js +1 -1
  413. package/dist/domains/snap/pointSnap.js.map +1 -0
  414. package/dist/{features → domains}/snap/probes2d.js +1 -1
  415. package/dist/domains/snap/probes2d.js.map +1 -0
  416. package/dist/{features → domains}/snap/readoutDraw.js +1 -1
  417. package/dist/domains/snap/readoutDraw.js.map +1 -0
  418. package/dist/{features → domains}/snap/readoutLayer.js +1 -1
  419. package/dist/domains/snap/readoutLayer.js.map +1 -0
  420. package/dist/{features → domains}/snap/registry.js +1 -1
  421. package/dist/domains/snap/registry.js.map +1 -0
  422. package/dist/{features → domains}/snap/resizeBox.js +1 -1
  423. package/dist/domains/snap/resizeBox.js.map +1 -0
  424. package/dist/{features → domains}/snap/roles.js +1 -1
  425. package/dist/domains/snap/roles.js.map +1 -0
  426. package/dist/{features → domains}/snap/rotationSource.js +1 -1
  427. package/dist/domains/snap/rotationSource.js.map +1 -0
  428. package/dist/{features → domains}/snap/sceneReads.js +24 -3
  429. package/dist/domains/snap/sceneReads.js.map +1 -0
  430. package/dist/{features → domains}/snap/sceneSession2d.js +3 -2
  431. package/dist/domains/snap/sceneSession2d.js.map +1 -0
  432. package/dist/{features → domains}/snap/screen.js +1 -1
  433. package/dist/domains/snap/screen.js.map +1 -0
  434. package/dist/{features → domains}/snap/session2d.js +3 -2
  435. package/dist/domains/snap/session2d.js.map +1 -0
  436. package/dist/{features → domains}/snap/spanSnap.js +1 -1
  437. package/dist/domains/snap/spanSnap.js.map +1 -0
  438. package/dist/{features → domains}/snap/stepAngles.js +1 -1
  439. package/dist/domains/snap/stepAngles.js.map +1 -0
  440. package/dist/{features → domains}/text/editingDrawOne.js +4 -4
  441. package/dist/domains/text/editingDrawOne.js.map +1 -0
  442. package/dist/domains/text/hostTextEditors.js +24 -0
  443. package/dist/domains/text/hostTextEditors.js.map +1 -0
  444. package/dist/{features → domains}/text/index.js +1 -1
  445. package/dist/{features → domains}/text/sceneTextDrafts.js +1 -1
  446. package/dist/domains/text/sceneTextDrafts.js.map +1 -0
  447. package/dist/{features → domains}/text/textHitAt.js +18 -2
  448. package/dist/domains/text/textHitAt.js.map +1 -0
  449. package/dist/{features → domains}/text/textLayer.js +1 -1
  450. package/dist/domains/text/textLayer.js.map +1 -0
  451. package/dist/{features → domains}/text/useSceneTextEdit.js +11 -3
  452. package/dist/domains/text/useSceneTextEdit.js.map +1 -0
  453. package/dist/{features → domains}/viewports/aim.js +1 -1
  454. package/dist/domains/viewports/aim.js.map +1 -0
  455. package/dist/{features → domains}/viewports/viewMarker.js +23 -5
  456. package/dist/domains/viewports/viewMarker.js.map +1 -0
  457. package/dist/{features → domains}/viewports/viewMarkerDrag.js +3 -3
  458. package/dist/domains/viewports/viewMarkerDrag.js.map +1 -0
  459. package/dist/{features → domains}/viewports/viewResolver.js +1 -1
  460. package/dist/domains/viewports/viewResolver.js.map +1 -0
  461. package/dist/{features → domains}/viewports/viewportLayer.js +1 -1
  462. package/dist/domains/viewports/viewportLayer.js.map +1 -0
  463. package/dist/icons.table.js +1 -1
  464. package/dist/icons.table.js.map +1 -1
  465. package/dist/icons.table.json +106 -6
  466. package/dist/index.d.ts +1441 -1050
  467. package/dist/index.js +90 -77
  468. package/dist/interactions/actions/admitsChild.js +6 -2
  469. package/dist/interactions/actions/admitsChild.js.map +1 -1
  470. package/dist/interactions/actions/align/align.js +1 -4
  471. package/dist/interactions/actions/align/align.js.map +1 -1
  472. package/dist/interactions/actions/booleans/booleanGroupAction.js +66 -0
  473. package/dist/interactions/actions/booleans/booleanGroupAction.js.map +1 -0
  474. package/dist/interactions/actions/booleans/keymap.js +52 -0
  475. package/dist/interactions/actions/booleans/keymap.js.map +1 -0
  476. package/dist/interactions/actions/booleans/operands.js +1 -1
  477. package/dist/interactions/actions/booleans/pieces.js +4 -11
  478. package/dist/interactions/actions/booleans/pieces.js.map +1 -1
  479. package/dist/interactions/actions/clipboard/action.js +3 -7
  480. package/dist/interactions/actions/clipboard/action.js.map +1 -1
  481. package/dist/interactions/actions/clipboard/clipboardOps.js +1 -1
  482. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  483. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
  484. package/dist/interactions/actions/defaults/anchorEditing.js +6 -6
  485. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  486. package/dist/interactions/actions/defaults/bendSegment.js +1 -1
  487. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
  488. package/dist/interactions/actions/defaults/containerScroll.js +170 -0
  489. package/dist/interactions/actions/defaults/containerScroll.js.map +1 -0
  490. package/dist/interactions/actions/defaults/contextMenu.js +2 -5
  491. package/dist/interactions/actions/defaults/contextMenu.js.map +1 -1
  492. package/dist/interactions/actions/defaults/delete.js +1 -1
  493. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  494. package/dist/interactions/actions/defaults/duplicate.js +1 -3
  495. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  496. package/dist/interactions/actions/defaults/enterGroup.js +7 -12
  497. package/dist/interactions/actions/defaults/enterGroup.js.map +1 -1
  498. package/dist/interactions/actions/defaults/enterPathEdit.js +4 -8
  499. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  500. package/dist/interactions/actions/defaults/group.js +12 -24
  501. package/dist/interactions/actions/defaults/group.js.map +1 -1
  502. package/dist/interactions/actions/defaults/ingest.js +18 -10
  503. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  504. package/dist/interactions/actions/defaults/insertPathAnchor.js +3 -3
  505. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  506. package/dist/interactions/actions/defaults/nudgeSteps.js +3 -21
  507. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
  508. package/dist/interactions/actions/defaults/pathEditMarks.js.map +1 -1
  509. package/dist/interactions/actions/defaults/selectDeep.js +2 -2
  510. package/dist/interactions/actions/defaults/selectDeep.js.map +1 -1
  511. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  512. package/dist/interactions/actions/dropVerdict.js +9 -0
  513. package/dist/interactions/actions/dropVerdict.js.map +1 -0
  514. package/dist/interactions/actions/edit-anchors/action.js +2 -2
  515. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  516. package/dist/interactions/actions/edit-anchors/extensionDrags.js.map +1 -1
  517. package/dist/interactions/actions/edit-anchors/geometry.js +8 -6
  518. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  519. package/dist/interactions/actions/edit-anchors/handleDrag.js.map +1 -1
  520. package/dist/interactions/actions/edit-anchors/preview.js +1 -1
  521. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
  522. package/dist/interactions/actions/flip/action.js +3 -2
  523. package/dist/interactions/actions/flip/action.js.map +1 -1
  524. package/dist/interactions/actions/geometryProjection.js +8 -3
  525. package/dist/interactions/actions/geometryProjection.js.map +1 -1
  526. package/dist/interactions/actions/gestureFrames.js +1 -0
  527. package/dist/interactions/actions/gestureFrames.js.map +1 -1
  528. package/dist/interactions/actions/insert/action.js +6 -2
  529. package/dist/interactions/actions/insert/action.js.map +1 -1
  530. package/dist/interactions/actions/insert/frame.js +1 -1
  531. package/dist/interactions/actions/insert/frame.js.map +1 -1
  532. package/dist/interactions/actions/insert/placeAction.js +6 -8
  533. package/dist/interactions/actions/insert/placeAction.js.map +1 -1
  534. package/dist/interactions/actions/insert/session.js +2 -2
  535. package/dist/interactions/actions/insert/session.js.map +1 -1
  536. package/dist/interactions/actions/move/action.js +6 -15
  537. package/dist/interactions/actions/move/action.js.map +1 -1
  538. package/dist/interactions/actions/move/behaviors/layoutDrop.js +12 -2
  539. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
  540. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +29 -10
  541. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -1
  542. package/dist/interactions/actions/move/behaviors/snapToContainer.js +42 -6
  543. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  544. package/dist/interactions/actions/move/capture.js +4 -8
  545. package/dist/interactions/actions/move/capture.js.map +1 -1
  546. package/dist/interactions/actions/move/commit/index.js.map +1 -1
  547. package/dist/interactions/actions/move/commit/layoutDrop.js +4 -3
  548. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -1
  549. package/dist/interactions/actions/move/commit/layoutRelease.js +15 -9
  550. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -1
  551. package/dist/interactions/actions/move/commit/reparent.js +19 -13
  552. package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
  553. package/dist/interactions/actions/move/delta.js +51 -5
  554. package/dist/interactions/actions/move/delta.js.map +1 -1
  555. package/dist/interactions/actions/move/frame.js +8 -4
  556. package/dist/interactions/actions/move/frame.js.map +1 -1
  557. package/dist/interactions/actions/move/layout/container.js +19 -9
  558. package/dist/interactions/actions/move/layout/container.js.map +1 -1
  559. package/dist/interactions/actions/move/layout/dragged.js +2 -2
  560. package/dist/interactions/actions/move/layout/dragged.js.map +1 -1
  561. package/dist/interactions/actions/move/layout/dropPass.js +36 -18
  562. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
  563. package/dist/interactions/actions/move/layout/exits.js +2 -2
  564. package/dist/interactions/actions/move/layout/exits.js.map +1 -1
  565. package/dist/interactions/actions/move/layout/glide.js +5 -5
  566. package/dist/interactions/actions/move/layout/glide.js.map +1 -1
  567. package/dist/interactions/actions/move/layout/view.js +55 -0
  568. package/dist/interactions/actions/move/layout/view.js.map +1 -0
  569. package/dist/interactions/actions/move/refusal.js +52 -0
  570. package/dist/interactions/actions/move/refusal.js.map +1 -0
  571. package/dist/interactions/actions/move/session.js +9 -8
  572. package/dist/interactions/actions/move/session.js.map +1 -1
  573. package/dist/interactions/actions/move/translate.js +10 -4
  574. package/dist/interactions/actions/move/translate.js.map +1 -1
  575. package/dist/interactions/actions/moveNodes.js +21 -5
  576. package/dist/interactions/actions/moveNodes.js.map +1 -1
  577. package/dist/interactions/actions/pathCommands/pathNodes.js +3 -3
  578. package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -1
  579. package/dist/interactions/actions/planeInput.js +14 -13
  580. package/dist/interactions/actions/planeInput.js.map +1 -1
  581. package/dist/interactions/actions/poseFrame.js +21 -8
  582. package/dist/interactions/actions/poseFrame.js.map +1 -1
  583. package/dist/interactions/actions/resize/action.js +1 -1
  584. package/dist/interactions/actions/resize/action.js.map +1 -1
  585. package/dist/interactions/actions/resize/aspect.js +1 -1
  586. package/dist/interactions/actions/resize/aspect.js.map +1 -1
  587. package/dist/interactions/actions/resize/commit.js +10 -1
  588. package/dist/interactions/actions/resize/commit.js.map +1 -1
  589. package/dist/interactions/actions/resize/frame.js +3 -2
  590. package/dist/interactions/actions/resize/frame.js.map +1 -1
  591. package/dist/interactions/actions/resize/held.js +44 -0
  592. package/dist/interactions/actions/resize/held.js.map +1 -0
  593. package/dist/interactions/actions/resize/session.js +3 -1
  594. package/dist/interactions/actions/resize/session.js.map +1 -1
  595. package/dist/interactions/actions/resolveOverlays.js +9 -0
  596. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  597. package/dist/interactions/actions/resolvePreviews.js +23 -7
  598. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  599. package/dist/interactions/actions/rotate/action.js +1 -1
  600. package/dist/interactions/actions/rotate/action.js.map +1 -1
  601. package/dist/interactions/actions/rotate/frame.js +1 -1
  602. package/dist/interactions/actions/rotate/frame.js.map +1 -1
  603. package/dist/interactions/actions/rotate/session.js +2 -2
  604. package/dist/interactions/actions/rotate/session.js.map +1 -1
  605. package/dist/interactions/actions/selectionSubtree.js +2 -4
  606. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  607. package/dist/interactions/actions/spatialReference.js +4 -9
  608. package/dist/interactions/actions/spatialReference.js.map +1 -1
  609. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -1
  610. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -1
  611. package/dist/kitSettingsSchema.js +2 -2
  612. package/dist/kitSettingsSchema.js.map +1 -1
  613. package/dist/{math-C_elShP_.d.ts → math-B_unOnF4.d.ts} +2 -2
  614. package/dist/math.d.ts +3 -3
  615. package/dist/move.d.ts +6 -6
  616. package/dist/{options-ClEm3SEl.d.ts → options-DAjkhbcs.d.ts} +5 -5
  617. package/dist/{poseDescriptor-DN2yfnq_.d.ts → poseDescriptor-CvSxVhCd.d.ts} +17 -4
  618. package/dist/resize.d.ts +6 -6
  619. package/dist/style.css +14 -0
  620. package/dist/test-seams.d.ts +11 -15
  621. package/dist/test-seams.js +1 -1
  622. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +3 -6
  623. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  624. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  625. package/dist/tools/builtin/measure/useMeasureTool.js +2 -2
  626. package/dist/tools/builtin/measure/useMeasureTool.js.map +1 -1
  627. package/dist/tools/builtin/pen/penHandle.js +2 -2
  628. package/dist/tools/builtin/pen/penHandle.js.map +1 -1
  629. package/dist/tools/builtin/pen/usePenTool.js +13 -19
  630. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  631. package/dist/tools/builtin/polygon/usePolygonTool.js +1 -1
  632. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  633. package/dist/tools/builtin/select/groupEntry.js +1 -1
  634. package/dist/tools/builtin/select/groupEntry.js.map +1 -1
  635. package/dist/tools/builtin/select/selectionContributions.js +1 -1
  636. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  637. package/dist/tools/builtin/select/useSelectTool.js +7 -7
  638. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  639. package/dist/tools/builtin/slice/useSliceTool.js +5 -8
  640. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  641. package/dist/tools/builtin/star/useStarTool.js +1 -1
  642. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  643. package/dist/tools/index.js +2 -1
  644. package/dist/{types-49uYJN3j.d.ts → types-A_sNJYRd.d.ts} +8 -0
  645. package/dist/{types-BEdRIhNc.d.ts → types-DW14eu9B.d.ts} +131 -36
  646. package/dist/{types-p2alu-R1.d.ts → types-VCtfchp-.d.ts} +4 -6
  647. package/dist/util/color.js +12 -14
  648. package/dist/util/color.js.map +1 -1
  649. package/dist/version.js +1 -1
  650. package/package.json +25 -24
  651. package/dist/canvas/poseCascade.js +0 -65
  652. package/dist/canvas/poseCascade.js.map +0 -1
  653. package/dist/features/chrome-caps/buildChromeCtx.js.map +0 -1
  654. package/dist/features/chrome-caps/conditions.js.map +0 -1
  655. package/dist/features/chrome-caps/defaults.js.map +0 -1
  656. package/dist/features/chrome-caps/resolve.js.map +0 -1
  657. package/dist/features/chrome-caps/useChromeCaps.js.map +0 -1
  658. package/dist/features/chrome-caps/useHoverTracking.js.map +0 -1
  659. package/dist/features/ingestion/contentHandlers.js.map +0 -1
  660. package/dist/features/ingestion/imageHandler.js.map +0 -1
  661. package/dist/features/ingestion/openFilePicker.js.map +0 -1
  662. package/dist/features/ingestion/placement.js.map +0 -1
  663. package/dist/features/ingestion/registerKitHandlers.js +0 -43
  664. package/dist/features/ingestion/registerKitHandlers.js.map +0 -1
  665. package/dist/features/ingestion/svgHandler.js.map +0 -1
  666. package/dist/features/ingestion/textHandler.js.map +0 -1
  667. package/dist/features/ingestion/useCanvasIngestion.js.map +0 -1
  668. package/dist/features/ingestion/weaselJsonHandler.js.map +0 -1
  669. package/dist/features/longPress/longPressFeedback.js.map +0 -1
  670. package/dist/features/measure/actionIds.js.map +0 -1
  671. package/dist/features/measure/measureCommands.js.map +0 -1
  672. package/dist/features/measure/measureContribution.js.map +0 -1
  673. package/dist/features/measure/measureEdits.js.map +0 -1
  674. package/dist/features/measure/measureGestures.js.map +0 -1
  675. package/dist/features/measure/measureHit.js.map +0 -1
  676. package/dist/features/measure/measureLayer.js.map +0 -1
  677. package/dist/features/measure/measurement.js.map +0 -1
  678. package/dist/features/measure/measurements.js.map +0 -1
  679. package/dist/features/modes/modeLayers.js.map +0 -1
  680. package/dist/features/modes/modeTriggers.js.map +0 -1
  681. package/dist/features/pathEffects/effectSources.js.map +0 -1
  682. package/dist/features/pathEffects/index.js.map +0 -1
  683. package/dist/features/pathEffects/readSource.js.map +0 -1
  684. package/dist/features/pathEffects/textItems.js.map +0 -1
  685. package/dist/features/pathEffects/useEffectSourcesLayer.js.map +0 -1
  686. package/dist/features/paths/anchorData.js.map +0 -1
  687. package/dist/features/paths/anchorMarkers.js.map +0 -1
  688. package/dist/features/paths/editablePath.js.map +0 -1
  689. package/dist/features/paths/originProjection.js.map +0 -1
  690. package/dist/features/paths/pathEditExtension.js.map +0 -1
  691. package/dist/features/paths/pathEditState.js.map +0 -1
  692. package/dist/features/paths/pathEditingOverlayLayer.js.map +0 -1
  693. package/dist/features/paths/pathLayer.js.map +0 -1
  694. package/dist/features/paths/pathRepresentation.js.map +0 -1
  695. package/dist/features/paths/pathSnap/glyphs.js.map +0 -1
  696. package/dist/features/paths/pathSnap/pathSnapSource.js.map +0 -1
  697. package/dist/features/paths/pathSnap/sceneIndex.js.map +0 -1
  698. package/dist/features/paths/pathSnap/snapGeometry.js.map +0 -1
  699. package/dist/features/paths/penPreviewLayer.js.map +0 -1
  700. package/dist/features/paths/shapeGenerator.js.map +0 -1
  701. package/dist/features/paths/strokeOutline.js.map +0 -1
  702. package/dist/features/paths/useAnchorFields.js.map +0 -1
  703. package/dist/features/paths/usePathEdit.js.map +0 -1
  704. package/dist/features/poseRun/usePoseRun.js.map +0 -1
  705. package/dist/features/selection/enteredGroupFrame.js.map +0 -1
  706. package/dist/features/selection/enteredGroupScope.js.map +0 -1
  707. package/dist/features/selection/handleCommands.js.map +0 -1
  708. package/dist/features/selection/overlay.js.map +0 -1
  709. package/dist/features/selection/selectionPose.js.map +0 -1
  710. package/dist/features/snap/angle2d.js.map +0 -1
  711. package/dist/features/snap/debugCandidates.js.map +0 -1
  712. package/dist/features/snap/gather.js.map +0 -1
  713. package/dist/features/snap/inputSubspace.js.map +0 -1
  714. package/dist/features/snap/lazySession.js.map +0 -1
  715. package/dist/features/snap/marks.js.map +0 -1
  716. package/dist/features/snap/outcomeStore.js.map +0 -1
  717. package/dist/features/snap/pointSnap.js.map +0 -1
  718. package/dist/features/snap/probes2d.js.map +0 -1
  719. package/dist/features/snap/readoutDraw.js.map +0 -1
  720. package/dist/features/snap/readoutLayer.js.map +0 -1
  721. package/dist/features/snap/registry.js.map +0 -1
  722. package/dist/features/snap/resizeBox.js.map +0 -1
  723. package/dist/features/snap/roles.js.map +0 -1
  724. package/dist/features/snap/rotationSource.js.map +0 -1
  725. package/dist/features/snap/sceneReads.js.map +0 -1
  726. package/dist/features/snap/sceneSession2d.js.map +0 -1
  727. package/dist/features/snap/screen.js.map +0 -1
  728. package/dist/features/snap/session2d.js.map +0 -1
  729. package/dist/features/snap/spanSnap.js.map +0 -1
  730. package/dist/features/snap/stepAngles.js.map +0 -1
  731. package/dist/features/text/editingDrawOne.js.map +0 -1
  732. package/dist/features/text/sceneTextDrafts.js.map +0 -1
  733. package/dist/features/text/textHitAt.js.map +0 -1
  734. package/dist/features/text/textLayer.js.map +0 -1
  735. package/dist/features/text/useSceneTextEdit.js.map +0 -1
  736. package/dist/features/viewports/aim.js.map +0 -1
  737. package/dist/features/viewports/viewMarker.js.map +0 -1
  738. package/dist/features/viewports/viewMarkerDrag.js.map +0 -1
  739. package/dist/features/viewports/viewResolver.js.map +0 -1
  740. package/dist/features/viewports/viewportLayer.js.map +0 -1
  741. /package/dist/{features → domains}/chrome-caps/index.js +0 -0
@@ -1,6 +1,6 @@
1
1
  import { toPlane } from "../../../core/viewport/parallax.js";
2
2
  import { composeWorldPose } from "../../../core/scene/composeFrame.js";
3
- import { translatePoseViaDescriptor } from "../../../core/geometry/poseDescriptor.js";
3
+ import { leadUnder, translatePoseViaDescriptor } from "../../../core/geometry/poseDescriptor.js";
4
4
  import { planeOf } from "../planeInput.js";
5
5
 
6
6
  //#region src/interactions/actions/move/delta.ts
@@ -18,18 +18,64 @@ function localDelta(session, id, dx0, dy0) {
18
18
  const { pc } = session;
19
19
  const d = session.descriptorOf(id);
20
20
  const from = d.getBounds(pc.decompose(f.frameWorld, f.world));
21
- const to = d.getBounds(pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d)));
21
+ const to = d.getBounds(pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d, leadFor(session, id, dx0, dy0))));
22
22
  return {
23
23
  dx: to.x - from.x,
24
24
  dy: to.y - from.y
25
25
  };
26
26
  }
27
+ var leads = /* @__PURE__ */ new WeakMap();
28
+ /** The move's first root, at press and dragged by `(dx0, dy0)`, in world
29
+ * space. Kept for the last drag asked about, since every id asks per frame. */
30
+ function moveLead(session, dx0, dy0) {
31
+ const last = leads.get(session);
32
+ if (last && last.dx0 === dx0 && last.dy0 === dy0) return last;
33
+ const id = session.ids.find((r) => session.startPoses.has(r) && !session.carried.has(r) && !session.caught.has(r));
34
+ let next = {
35
+ dx0,
36
+ dy0,
37
+ dx: dx0,
38
+ dy: dy0,
39
+ lead: null
40
+ };
41
+ if (id !== void 0) {
42
+ const from = session.frames.get(id)?.world ?? session.startPoses.get(id);
43
+ const { dx, dy } = planeDelta(session, id, dx0, dy0);
44
+ next = {
45
+ dx0,
46
+ dy0,
47
+ dx,
48
+ dy,
49
+ lead: {
50
+ from,
51
+ to: translatePoseViaDescriptor(from, dx, dy, session.descriptorOf(id))
52
+ }
53
+ };
54
+ }
55
+ leads.set(session, next);
56
+ return next;
57
+ }
58
+ /** The lead to translate `id`'s world pose with under the drag `(dx0, dy0)`:
59
+ * the move's first root, when `id` measures the drag as the same delta. */
60
+ function leadFor(session, id, dx0, dy0) {
61
+ if (session.caught.has(id)) return void 0;
62
+ const m = moveLead(session, dx0, dy0);
63
+ if (!m.lead) return void 0;
64
+ const own = planeDelta(session, id, dx0, dy0);
65
+ return own.dx === m.dx && own.dy === m.dy ? m.lead : void 0;
66
+ }
67
+ /** The lead for translating `id`'s stored pose: the world lead, carried into
68
+ * the frame `id` is stored in. */
69
+ function storedLeadFor(session, id, dx0, dy0) {
70
+ const lead = leadFor(session, id, dx0, dy0);
71
+ return lead && leadUnder(session.pc, session.frames.get(id)?.frameWorld ?? null, lead);
72
+ }
27
73
  /** The pose `id` stores once dragged by `(dx, dy)` from `start`, its stored
28
74
  * pose at press. Unmoved when its frame is what moves. */
29
75
  function draggedStoredPose(session, id, start, dx, dy) {
30
76
  if (session.carried.has(id)) return start;
31
77
  const l = localDelta(session, id, dx, dy);
32
- return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id));
78
+ return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id), storedLeadFor(session, id, dx, dy));
33
79
  }
34
80
  /** The drag `(dx, dy)`, measured in the edited plane, as the drag of `id` in
35
81
  * the world its own layer stores it in. */
@@ -65,9 +111,9 @@ function grabbedPoseAdapter(session, adapter) {
65
111
  function draggedWorldPose(session, adapter, id, delta) {
66
112
  const start = composeWorldPose(adapter, id, session.pc.compose);
67
113
  const own = planeDelta(session, id, delta.dx, delta.dy);
68
- return translatePoseViaDescriptor(start, own.dx, own.dy, session.descriptorOf(id));
114
+ return translatePoseViaDescriptor(start, own.dx, own.dy, session.descriptorOf(id), leadFor(session, id, delta.dx, delta.dy));
69
115
  }
70
116
 
71
117
  //#endregion
72
- export { draggedStoredPose, draggedWorldPose, grabbedPoseAdapter, localDelta, planeDelta };
118
+ export { draggedStoredPose, draggedWorldPose, grabbedPoseAdapter, localDelta, planeDelta, storedLeadFor };
73
119
  //# sourceMappingURL=delta.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"delta.js","names":[],"sources":["../../../../src/interactions/actions/move/delta.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, type PoseAdapter } from 'core/scene/composePose';\nimport { planeOf } from '../planeInput';\nimport type { MoveSession } from './session';\n\n/**\n * The world drag `(dx, dy)` as a translation of `id`'s stored pose. A pose is\n * stored in its frame, so under a turned frame the two point different ways.\n */\nexport function localDelta(\n session: MoveSession,\n id: NodeId,\n dx0: number,\n dy0: number,\n): { dx: number; dy: number } {\n const { dx, dy } = planeDelta(session, id, dx0, dy0);\n const f = session.frames.get(id);\n if (f === undefined) return { dx, dy };\n const { pc } = session;\n const d = session.descriptorOf(id);\n const from = d.getBounds(pc.decompose(f.frameWorld, f.world));\n const to = d.getBounds(\n pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d)),\n );\n return { dx: to.x - from.x, dy: to.y - from.y };\n}\n\n/** The pose `id` stores once dragged by `(dx, dy)` from `start`, its stored\n * pose at press. Unmoved when its frame is what moves. */\nexport function draggedStoredPose(session: MoveSession, id: NodeId, start: unknown, dx: number, dy: number): unknown {\n if (session.carried.has(id)) return start;\n const l = localDelta(session, id, dx, dy);\n return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id));\n}\n\n/** The drag `(dx, dy)`, measured in the edited plane, as the drag of `id` in\n * the world its own layer stores it in. */\nexport function planeDelta(\n session: MoveSession,\n id: NodeId,\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n const layer = session.scene.get(id)?.layer;\n const ref = layer === undefined ? undefined : session.planeRefs.get(layer);\n if (!ref) return { dx, dy };\n const out = planeOf(session.view, layer!);\n const at = { x: ref.edited.x + dx, y: ref.edited.y + dy };\n const p = out ? toPlane(out, at) : at;\n return { dx: p.x - ref.own.x, dy: p.y - ref.own.y };\n}\n\n/** `adapter`, except that an id caught mid-glide answers with the pose it was\n * grabbed at — where the drag measures it from. */\nexport function grabbedPoseAdapter(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n): PoseAdapter<unknown> {\n if (session.caught.size === 0) return adapter;\n return {\n ...adapter,\n getPose: (id) => (session.caught.has(id as NodeId)\n ? session.startPoses.get(id as NodeId)\n : adapter.getPose(id)),\n };\n}\n\n/** The world pose `id` was dragged to: its pose at press composed up through\n * `adapter`, moved by the drag as its own layer's plane measures it. */\nexport function draggedWorldPose(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n id: NodeId,\n delta: { dx: number; dy: number },\n): unknown {\n const start = composeWorldPose(adapter, id as string, session.pc.compose);\n const own = planeDelta(session, id, delta.dx, delta.dy);\n return translatePoseViaDescriptor(start, own.dx, own.dy, session.descriptorOf(id));\n}\n"],"mappings":";;;;;;;;;;AAWA,SAAgB,WACd,SACA,IACA,KACA,KAC4B;CAC5B,MAAM,EAAE,IAAI,OAAO,WAAW,SAAS,IAAI,KAAK,GAAG;CACnD,MAAM,IAAI,QAAQ,OAAO,IAAI,EAAE;CAC/B,IAAI,MAAM,QAAW,OAAO;EAAE;EAAI;CAAG;CACrC,MAAM,EAAE,OAAO;CACf,MAAM,IAAI,QAAQ,aAAa,EAAE;CACjC,MAAM,OAAO,EAAE,UAAU,GAAG,UAAU,EAAE,YAAY,EAAE,KAAK,CAAC;CAC5D,MAAM,KAAK,EAAE,UACX,GAAG,UAAU,EAAE,YAAY,2BAA2B,EAAE,OAAO,IAAI,IAAI,CAAC,CAAC,CAC3E;CACA,OAAO;EAAE,IAAI,GAAG,IAAI,KAAK;EAAG,IAAI,GAAG,IAAI,KAAK;CAAE;AAChD;;;AAIA,SAAgB,kBAAkB,SAAsB,IAAY,OAAgB,IAAY,IAAqB;CACnH,IAAI,QAAQ,QAAQ,IAAI,EAAE,GAAG,OAAO;CACpC,MAAM,IAAI,WAAW,SAAS,IAAI,IAAI,EAAE;CACxC,OAAO,2BAA2B,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,aAAa,EAAE,CAAC;AAC/E;;;AAIA,SAAgB,WACd,SACA,IACA,IACA,IAC4B;CAC5B,MAAM,QAAQ,QAAQ,MAAM,IAAI,EAAE,CAAC,EAAE;CACrC,MAAM,MAAM,UAAU,SAAY,SAAY,QAAQ,UAAU,IAAI,KAAK;CACzE,IAAI,CAAC,KAAK,OAAO;EAAE;EAAI;CAAG;CAC1B,MAAM,MAAM,QAAQ,QAAQ,MAAM,KAAM;CACxC,MAAM,KAAK;EAAE,GAAG,IAAI,OAAO,IAAI;EAAI,GAAG,IAAI,OAAO,IAAI;CAAG;CACxD,MAAM,IAAI,MAAM,QAAQ,KAAK,EAAE,IAAI;CACnC,OAAO;EAAE,IAAI,EAAE,IAAI,IAAI,IAAI;EAAG,IAAI,EAAE,IAAI,IAAI,IAAI;CAAE;AACpD;;;AAIA,SAAgB,mBACd,SACA,SACsB;CACtB,IAAI,QAAQ,OAAO,SAAS,GAAG,OAAO;CACtC,OAAO;EACL,GAAG;EACH,UAAU,OAAQ,QAAQ,OAAO,IAAI,EAAY,IAC7C,QAAQ,WAAW,IAAI,EAAY,IACnC,QAAQ,QAAQ,EAAE;CACxB;AACF;;;AAIA,SAAgB,iBACd,SACA,SACA,IACA,OACS;CACT,MAAM,QAAQ,iBAAiB,SAAS,IAAc,QAAQ,GAAG,OAAO;CACxE,MAAM,MAAM,WAAW,SAAS,IAAI,MAAM,IAAI,MAAM,EAAE;CACtD,OAAO,2BAA2B,OAAO,IAAI,IAAI,IAAI,IAAI,QAAQ,aAAa,EAAE,CAAC;AACnF"}
1
+ {"version":3,"file":"delta.js","names":[],"sources":["../../../../src/interactions/actions/move/delta.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { leadUnder, translatePoseViaDescriptor, type TranslateLead } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, type PoseAdapter } from 'core/scene/composePose';\nimport { planeOf } from '../planeInput';\nimport type { MoveSession } from './session';\n\n/**\n * The world drag `(dx, dy)` as a translation of `id`'s stored pose. A pose is\n * stored in its frame, so under a turned frame the two point different ways.\n */\nexport function localDelta(\n session: MoveSession,\n id: NodeId,\n dx0: number,\n dy0: number,\n): { dx: number; dy: number } {\n const { dx, dy } = planeDelta(session, id, dx0, dy0);\n const f = session.frames.get(id);\n if (f === undefined) return { dx, dy };\n const { pc } = session;\n const d = session.descriptorOf(id);\n const from = d.getBounds(pc.decompose(f.frameWorld, f.world));\n const to = d.getBounds(\n pc.decompose(f.frameWorld, translatePoseViaDescriptor(f.world, dx, dy, d, leadFor(session, id, dx0, dy0))),\n );\n return { dx: to.x - from.x, dy: to.y - from.y };\n}\n\ninterface MoveLead {\n readonly dx0: number;\n readonly dy0: number;\n /** The lead's own delta, as its layer's plane measures the drag. */\n readonly dx: number;\n readonly dy: number;\n readonly lead: TranslateLead<unknown> | null;\n}\n\nconst leads = new WeakMap<MoveSession, MoveLead>();\n\n/** The move's first root, at press and dragged by `(dx0, dy0)`, in world\n * space. Kept for the last drag asked about, since every id asks per frame. */\nfunction moveLead(session: MoveSession, dx0: number, dy0: number): MoveLead {\n const last = leads.get(session);\n if (last && last.dx0 === dx0 && last.dy0 === dy0) return last;\n const id = session.ids.find((r) =>\n session.startPoses.has(r) && !session.carried.has(r) && !session.caught.has(r));\n let next: MoveLead = { dx0, dy0, dx: dx0, dy: dy0, lead: null };\n if (id !== undefined) {\n const from = session.frames.get(id)?.world ?? session.startPoses.get(id);\n const { dx, dy } = planeDelta(session, id, dx0, dy0);\n next = { dx0, dy0, dx, dy, lead: { from, to: translatePoseViaDescriptor(from, dx, dy, session.descriptorOf(id)) } };\n }\n leads.set(session, next);\n return next;\n}\n\n/** The lead to translate `id`'s world pose with under the drag `(dx0, dy0)`:\n * the move's first root, when `id` measures the drag as the same delta. */\nfunction leadFor(session: MoveSession, id: NodeId, dx0: number, dy0: number): TranslateLead<unknown> | undefined {\n if (session.caught.has(id)) return undefined;\n const m = moveLead(session, dx0, dy0);\n if (!m.lead) return undefined;\n const own = planeDelta(session, id, dx0, dy0);\n return own.dx === m.dx && own.dy === m.dy ? m.lead : undefined;\n}\n\n/** The lead for translating `id`'s stored pose: the world lead, carried into\n * the frame `id` is stored in. */\nexport function storedLeadFor(session: MoveSession, id: NodeId, dx0: number, dy0: number): TranslateLead<unknown> | undefined {\n const lead = leadFor(session, id, dx0, dy0);\n return lead && leadUnder(session.pc, session.frames.get(id)?.frameWorld ?? null, lead);\n}\n\n/** The pose `id` stores once dragged by `(dx, dy)` from `start`, its stored\n * pose at press. Unmoved when its frame is what moves. */\nexport function draggedStoredPose(session: MoveSession, id: NodeId, start: unknown, dx: number, dy: number): unknown {\n if (session.carried.has(id)) return start;\n const l = localDelta(session, id, dx, dy);\n return translatePoseViaDescriptor(start, l.dx, l.dy, session.descriptorOf(id), storedLeadFor(session, id, dx, dy));\n}\n\n/** The drag `(dx, dy)`, measured in the edited plane, as the drag of `id` in\n * the world its own layer stores it in. */\nexport function planeDelta(\n session: MoveSession,\n id: NodeId,\n dx: number,\n dy: number,\n): { dx: number; dy: number } {\n const layer = session.scene.get(id)?.layer;\n const ref = layer === undefined ? undefined : session.planeRefs.get(layer);\n if (!ref) return { dx, dy };\n const out = planeOf(session.view, layer!);\n const at = { x: ref.edited.x + dx, y: ref.edited.y + dy };\n const p = out ? toPlane(out, at) : at;\n return { dx: p.x - ref.own.x, dy: p.y - ref.own.y };\n}\n\n/** `adapter`, except that an id caught mid-glide answers with the pose it was\n * grabbed at — where the drag measures it from. */\nexport function grabbedPoseAdapter(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n): PoseAdapter<unknown> {\n if (session.caught.size === 0) return adapter;\n return {\n ...adapter,\n getPose: (id) => (session.caught.has(id as NodeId)\n ? session.startPoses.get(id as NodeId)\n : adapter.getPose(id)),\n };\n}\n\n/** The world pose `id` was dragged to: its pose at press composed up through\n * `adapter`, moved by the drag as its own layer's plane measures it. */\nexport function draggedWorldPose(\n session: MoveSession,\n adapter: PoseAdapter<unknown>,\n id: NodeId,\n delta: { dx: number; dy: number },\n): unknown {\n const start = composeWorldPose(adapter, id as string, session.pc.compose);\n const own = planeDelta(session, id, delta.dx, delta.dy);\n return translatePoseViaDescriptor(\n start, own.dx, own.dy, session.descriptorOf(id), leadFor(session, id, delta.dx, delta.dy),\n );\n}\n"],"mappings":"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"}
@@ -1,11 +1,12 @@
1
1
  import { draggedStoredPose } from "./delta.js";
2
2
  import { pointerStateOf } from "../pointerState.js";
3
- import { snapMods } from "../../../features/snap/roles.js";
3
+ import { snapMods } from "../../../domains/snap/roles.js";
4
4
 
5
5
  //#region src/interactions/actions/move/frame.ts
6
6
  function foldBehaviors(session, readers, moveCtx, dx, dy) {
7
7
  const posed = /* @__PURE__ */ new Map();
8
8
  const opaque = /* @__PURE__ */ new Set();
9
+ const overlays = [];
9
10
  const gctx = session.gestureCtx;
10
11
  gctx.modifiers = { ...moveCtx.modifiers };
11
12
  gctx.pointer = pointerStateOf(moveCtx.drag.current, moveCtx);
@@ -22,6 +23,7 @@ function foldBehaviors(session, readers, moveCtx, dx, dy) {
22
23
  if (!r) continue;
23
24
  if (r.poses) for (const [id, pose] of r.poses) posed.set(id, pose);
24
25
  if (r.opaque) for (const id of r.opaque) opaque.add(id);
26
+ if (r.overlays) overlays.push(...r.overlays);
25
27
  if (r.transform) transform = r.transform;
26
28
  if (r.snap !== void 0) gctx.snap = r.snap;
27
29
  }
@@ -29,7 +31,8 @@ function foldBehaviors(session, readers, moveCtx, dx, dy) {
29
31
  dx: transform.dx,
30
32
  dy: transform.dy,
31
33
  posed,
32
- opaque
34
+ opaque,
35
+ overlays
33
36
  };
34
37
  }
35
38
  /** The pointer's delta, moved so the subject lands on what the snap session
@@ -55,7 +58,7 @@ function snapDelta(session, moveCtx) {
55
58
  * behaviors posed. */
56
59
  function nextFrame(session, readers, moveCtx) {
57
60
  const snapped = snapDelta(session, moveCtx);
58
- const { dx, dy, posed, opaque } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);
61
+ const { dx, dy, posed, opaque, overlays } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);
59
62
  const delta = {
60
63
  dx,
61
64
  dy
@@ -69,7 +72,8 @@ function nextFrame(session, readers, moveCtx) {
69
72
  return {
70
73
  delta,
71
74
  previews,
72
- opaque
75
+ opaque,
76
+ overlays
73
77
  };
74
78
  }
75
79
 
@@ -1 +1 @@
1
- {"version":3,"file":"frame.js","names":[],"sources":["../../../../src/interactions/actions/move/frame.ts"],"sourcesContent":["import type { InvocationCtx } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { BehaviorResult, GroupTransform } from '../../gestures/types';\nimport { draggedStoredPose } from './delta';\nimport { snapMods } from 'features/snap/roles';\nimport type { MoveFrame, MoveSession } from './session';\n\nfunction foldBehaviors(\n session: MoveSession,\n readers: GestureReaders,\n moveCtx: InvocationCtx,\n dx: number,\n dy: number,\n): { dx: number; dy: number; posed: Map<NodeId, unknown>; opaque: Set<NodeId> } {\n const posed = new Map<NodeId, unknown>();\n const opaque = new Set<NodeId>();\n const gctx = session.gestureCtx;\n gctx.modifiers = { ...moveCtx.modifiers };\n gctx.pointer = pointerStateOf(moveCtx.drag!.current, moveCtx);\n gctx.view = readers.view();\n gctx.plane = readers.plane();\n // `current` is pre-populated from the raw cursor delta BEFORE\n // any behavior shapes `transform`. Unlike `onEnd`, it is NOT\n // refreshed after each behavior runs — so onMove behaviors\n // should derive position from `origin` + the `proposed`\n // GroupTransform arg, NOT from `ctx.current` (which reflects\n // the unmodified delta at this frame's start).\n for (const [id, ori] of session.startPoses) {\n gctx.current.set(id as string, draggedStoredPose(session, id, ori, dx, dy));\n }\n let transform: GroupTransform = { kind: 'translate', dx, dy };\n for (const b of session.behaviors) {\n const r: BehaviorResult<unknown> | void = b.onMove?.(gctx, transform);\n if (!r) continue;\n if (r.poses) for (const [id, pose] of r.poses) posed.set(id as NodeId, pose);\n if (r.opaque) for (const id of r.opaque) opaque.add(id as NodeId);\n if (r.transform) transform = r.transform;\n if (r.snap !== undefined) gctx.snap = r.snap;\n }\n return { dx: transform.dx, dy: transform.dy, posed, opaque };\n}\n\n/** The pointer's delta, moved so the subject lands on what the snap session\n * holds it to. */\nfunction snapDelta(session: MoveSession, moveCtx: InvocationCtx): { dx: number; dy: number } {\n const d = moveCtx.drag!.delta;\n if (!session.snap) return { dx: d.x, dy: d.y };\n const { press } = session;\n const out = session.snap.at({ x: press.x + d.x, y: press.y + d.y }, snapMods(moveCtx));\n return { dx: out.point.x - press.x, dy: out.point.y - press.y };\n}\n\n/** One move's delta and previews: the pointer's delta as the behaviors shaped\n * it, every displaced id's stored pose under it, and whatever else the\n * behaviors posed. */\nexport function nextFrame(session: MoveSession, readers: GestureReaders, moveCtx: InvocationCtx): MoveFrame {\n const snapped = snapDelta(session, moveCtx);\n const { dx, dy, posed, opaque } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);\n\n // The delta stays in the frame — no scene writes, no history entries.\n const delta = { dx, dy };\n // Every displaced id's pose (roots + cascade), published to the scene's\n // overrides by the action.\n const previews = new Map<NodeId, unknown>();\n for (const [id, ori] of session.startPoses) {\n const dragged = draggedStoredPose(session, id, ori, dx, dy);\n previews.set(id, session.carried.has(id) ? dragged : posed.get(id) ?? dragged);\n }\n for (const [id, pose] of posed) if (!session.startPoses.has(id)) previews.set(id, pose);\n return { delta, previews, opaque };\n}\n"],"mappings":";;;;;AASA,SAAS,cACP,SACA,SACA,SACA,IACA,IAC8E;CAC9E,MAAM,wBAAQ,IAAI,IAAqB;CACvC,MAAM,yBAAS,IAAI,IAAY;CAC/B,MAAM,OAAO,QAAQ;CACrB,KAAK,YAAY,EAAE,GAAG,QAAQ,UAAU;CACxC,KAAK,UAAU,eAAe,QAAQ,KAAM,SAAS,OAAO;CAC5D,KAAK,OAAO,QAAQ,KAAK;CACzB,KAAK,QAAQ,QAAQ,MAAM;CAO3B,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAC9B,KAAK,QAAQ,IAAI,IAAc,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC;CAE5E,IAAI,YAA4B;EAAE,MAAM;EAAa;EAAI;CAAG;CAC5D,KAAK,MAAM,KAAK,QAAQ,WAAW;EACjC,MAAM,IAAoC,EAAE,SAAS,MAAM,SAAS;EACpE,IAAI,CAAC,GAAG;EACR,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,OAAO,MAAM,IAAI,IAAc,IAAI;EAC3E,IAAI,EAAE,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,OAAO,IAAI,EAAY;EAChE,IAAI,EAAE,WAAW,YAAY,EAAE;EAC/B,IAAI,EAAE,SAAS,QAAW,KAAK,OAAO,EAAE;CAC1C;CACA,OAAO;EAAE,IAAI,UAAU;EAAI,IAAI,UAAU;EAAI;EAAO;CAAO;AAC7D;;;AAIA,SAAS,UAAU,SAAsB,SAAoD;CAC3F,MAAM,IAAI,QAAQ,KAAM;CACxB,IAAI,CAAC,QAAQ,MAAM,OAAO;EAAE,IAAI,EAAE;EAAG,IAAI,EAAE;CAAE;CAC7C,MAAM,EAAE,UAAU;CAClB,MAAM,MAAM,QAAQ,KAAK,GAAG;EAAE,GAAG,MAAM,IAAI,EAAE;EAAG,GAAG,MAAM,IAAI,EAAE;CAAE,GAAG,SAAS,OAAO,CAAC;CACrF,OAAO;EAAE,IAAI,IAAI,MAAM,IAAI,MAAM;EAAG,IAAI,IAAI,MAAM,IAAI,MAAM;CAAE;AAChE;;;;AAKA,SAAgB,UAAU,SAAsB,SAAyB,SAAmC;CAC1G,MAAM,UAAU,UAAU,SAAS,OAAO;CAC1C,MAAM,EAAE,IAAI,IAAI,OAAO,WAAW,cAAc,SAAS,SAAS,SAAS,QAAQ,IAAI,QAAQ,EAAE;CAGjG,MAAM,QAAQ;EAAE;EAAI;CAAG;CAGvB,MAAM,2BAAW,IAAI,IAAqB;CAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAAY;EAC1C,MAAM,UAAU,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE;EAC1D,SAAS,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,IAAI,UAAU,MAAM,IAAI,EAAE,KAAK,OAAO;CAC/E;CACA,KAAK,MAAM,CAAC,IAAI,SAAS,OAAO,IAAI,CAAC,QAAQ,WAAW,IAAI,EAAE,GAAG,SAAS,IAAI,IAAI,IAAI;CACtF,OAAO;EAAE;EAAO;EAAU;CAAO;AACnC"}
1
+ {"version":3,"file":"frame.js","names":[],"sources":["../../../../src/interactions/actions/move/frame.ts"],"sourcesContent":["import type { InvocationCtx, OngoingOverlay } from '@weasel-js/routing';\nimport { pointerStateOf } from '../pointerState';\nimport type { NodeId } from 'core/scene/types';\nimport type { GestureReaders } from '../../gestures/shared/screenTolerance';\nimport type { BehaviorResult, GroupTransform } from '../../gestures/types';\nimport { draggedStoredPose } from './delta';\nimport { snapMods } from 'domains/snap/roles';\nimport type { MoveFrame, MoveSession } from './session';\n\nfunction foldBehaviors(\n session: MoveSession,\n readers: GestureReaders,\n moveCtx: InvocationCtx,\n dx: number,\n dy: number,\n): { dx: number; dy: number; posed: Map<NodeId, unknown>; opaque: Set<NodeId>; overlays: OngoingOverlay[] } {\n const posed = new Map<NodeId, unknown>();\n const opaque = new Set<NodeId>();\n const overlays: OngoingOverlay[] = [];\n const gctx = session.gestureCtx;\n gctx.modifiers = { ...moveCtx.modifiers };\n gctx.pointer = pointerStateOf(moveCtx.drag!.current, moveCtx);\n gctx.view = readers.view();\n gctx.plane = readers.plane();\n // `current` is pre-populated from the raw cursor delta BEFORE\n // any behavior shapes `transform`. Unlike `onEnd`, it is NOT\n // refreshed after each behavior runs — so onMove behaviors\n // should derive position from `origin` + the `proposed`\n // GroupTransform arg, NOT from `ctx.current` (which reflects\n // the unmodified delta at this frame's start).\n for (const [id, ori] of session.startPoses) {\n gctx.current.set(id as string, draggedStoredPose(session, id, ori, dx, dy));\n }\n let transform: GroupTransform = { kind: 'translate', dx, dy };\n for (const b of session.behaviors) {\n const r: BehaviorResult<unknown> | void = b.onMove?.(gctx, transform);\n if (!r) continue;\n if (r.poses) for (const [id, pose] of r.poses) posed.set(id as NodeId, pose);\n if (r.opaque) for (const id of r.opaque) opaque.add(id as NodeId);\n if (r.overlays) overlays.push(...r.overlays);\n if (r.transform) transform = r.transform;\n if (r.snap !== undefined) gctx.snap = r.snap;\n }\n return { dx: transform.dx, dy: transform.dy, posed, opaque, overlays };\n}\n\n/** The pointer's delta, moved so the subject lands on what the snap session\n * holds it to. */\nfunction snapDelta(session: MoveSession, moveCtx: InvocationCtx): { dx: number; dy: number } {\n const d = moveCtx.drag!.delta;\n if (!session.snap) return { dx: d.x, dy: d.y };\n const { press } = session;\n const out = session.snap.at({ x: press.x + d.x, y: press.y + d.y }, snapMods(moveCtx));\n return { dx: out.point.x - press.x, dy: out.point.y - press.y };\n}\n\n/** One move's delta and previews: the pointer's delta as the behaviors shaped\n * it, every displaced id's stored pose under it, and whatever else the\n * behaviors posed. */\nexport function nextFrame(session: MoveSession, readers: GestureReaders, moveCtx: InvocationCtx): MoveFrame {\n const snapped = snapDelta(session, moveCtx);\n const { dx, dy, posed, opaque, overlays } = foldBehaviors(session, readers, moveCtx, snapped.dx, snapped.dy);\n\n // The delta stays in the frame — no scene writes, no history entries.\n const delta = { dx, dy };\n // Every displaced id's pose (roots + cascade), published to the scene's\n // overrides by the action.\n const previews = new Map<NodeId, unknown>();\n for (const [id, ori] of session.startPoses) {\n const dragged = draggedStoredPose(session, id, ori, dx, dy);\n previews.set(id, session.carried.has(id) ? dragged : posed.get(id) ?? dragged);\n }\n for (const [id, pose] of posed) if (!session.startPoses.has(id)) previews.set(id, pose);\n return { delta, previews, opaque, overlays };\n}\n"],"mappings":";;;;;AASA,SAAS,cACP,SACA,SACA,SACA,IACA,IAC0G;CAC1G,MAAM,wBAAQ,IAAI,IAAqB;CACvC,MAAM,yBAAS,IAAI,IAAY;CAC/B,MAAM,WAA6B,CAAC;CACpC,MAAM,OAAO,QAAQ;CACrB,KAAK,YAAY,EAAE,GAAG,QAAQ,UAAU;CACxC,KAAK,UAAU,eAAe,QAAQ,KAAM,SAAS,OAAO;CAC5D,KAAK,OAAO,QAAQ,KAAK;CACzB,KAAK,QAAQ,QAAQ,MAAM;CAO3B,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAC9B,KAAK,QAAQ,IAAI,IAAc,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE,CAAC;CAE5E,IAAI,YAA4B;EAAE,MAAM;EAAa;EAAI;CAAG;CAC5D,KAAK,MAAM,KAAK,QAAQ,WAAW;EACjC,MAAM,IAAoC,EAAE,SAAS,MAAM,SAAS;EACpE,IAAI,CAAC,GAAG;EACR,IAAI,EAAE,OAAO,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,OAAO,MAAM,IAAI,IAAc,IAAI;EAC3E,IAAI,EAAE,QAAQ,KAAK,MAAM,MAAM,EAAE,QAAQ,OAAO,IAAI,EAAY;EAChE,IAAI,EAAE,UAAU,SAAS,KAAK,GAAG,EAAE,QAAQ;EAC3C,IAAI,EAAE,WAAW,YAAY,EAAE;EAC/B,IAAI,EAAE,SAAS,QAAW,KAAK,OAAO,EAAE;CAC1C;CACA,OAAO;EAAE,IAAI,UAAU;EAAI,IAAI,UAAU;EAAI;EAAO;EAAQ;CAAS;AACvE;;;AAIA,SAAS,UAAU,SAAsB,SAAoD;CAC3F,MAAM,IAAI,QAAQ,KAAM;CACxB,IAAI,CAAC,QAAQ,MAAM,OAAO;EAAE,IAAI,EAAE;EAAG,IAAI,EAAE;CAAE;CAC7C,MAAM,EAAE,UAAU;CAClB,MAAM,MAAM,QAAQ,KAAK,GAAG;EAAE,GAAG,MAAM,IAAI,EAAE;EAAG,GAAG,MAAM,IAAI,EAAE;CAAE,GAAG,SAAS,OAAO,CAAC;CACrF,OAAO;EAAE,IAAI,IAAI,MAAM,IAAI,MAAM;EAAG,IAAI,IAAI,MAAM,IAAI,MAAM;CAAE;AAChE;;;;AAKA,SAAgB,UAAU,SAAsB,SAAyB,SAAmC;CAC1G,MAAM,UAAU,UAAU,SAAS,OAAO;CAC1C,MAAM,EAAE,IAAI,IAAI,OAAO,QAAQ,aAAa,cAAc,SAAS,SAAS,SAAS,QAAQ,IAAI,QAAQ,EAAE;CAG3G,MAAM,QAAQ;EAAE;EAAI;CAAG;CAGvB,MAAM,2BAAW,IAAI,IAAqB;CAC1C,KAAK,MAAM,CAAC,IAAI,QAAQ,QAAQ,YAAY;EAC1C,MAAM,UAAU,kBAAkB,SAAS,IAAI,KAAK,IAAI,EAAE;EAC1D,SAAS,IAAI,IAAI,QAAQ,QAAQ,IAAI,EAAE,IAAI,UAAU,MAAM,IAAI,EAAE,KAAK,OAAO;CAC/E;CACA,KAAK,MAAM,CAAC,IAAI,SAAS,OAAO,IAAI,CAAC,QAAQ,WAAW,IAAI,EAAE,GAAG,SAAS,IAAI,IAAI,IAAI;CACtF,OAAO;EAAE;EAAO;EAAU;EAAQ;CAAS;AAC7C"}
@@ -1,9 +1,11 @@
1
1
  import { toPlane } from "../../../../core/viewport/parallax.js";
2
- import { composeWorldPose } from "../../../../core/scene/composeFrame.js";
2
+ import { childFrameAt, composeWorldPose } from "../../../../core/scene/composeFrame.js";
3
3
  import { poseDescriptorForNode } from "../../../../core/geometry/poseDescriptor.js";
4
- import { scenePoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
4
+ import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
5
5
  import { planeOf } from "../../planeInput.js";
6
+ import { boxOf, containerView, draggedInView } from "./view.js";
6
7
  import { carryDragged } from "./dragged.js";
8
+ import { refusalOf } from "../../dropVerdict.js";
7
9
  import { pointInPath } from "@weasel-js/geom";
8
10
 
9
11
  //#region src/interactions/actions/move/layout/container.ts
@@ -55,7 +57,7 @@ function pickContainer(session, dragged, center) {
55
57
  if (!layoutDep) return null;
56
58
  const scene = session.scene;
57
59
  const pc = session.pc;
58
- const poseAdapter = scenePoseAdapter(scene);
60
+ const poseAdapter = sceneViewPoseAdapter(scene);
59
61
  const d = session.projection;
60
62
  const draggedIds = new Set(dragged.map((c) => c.id));
61
63
  const candidates = [];
@@ -76,25 +78,33 @@ function pickContainer(session, dragged, center) {
76
78
  const node = scene.get(id);
77
79
  if (!node) return;
78
80
  const worldPose = composeWorldPose(poseAdapter, id, pc.compose);
79
- const worldAABB = poseDescriptorForNode(d, node).getBounds(worldPose);
81
+ const g = poseDescriptorForNode(d, node);
82
+ const worldAABB = g.getBounds(worldPose);
80
83
  const plane = planeOf(session.view, node.layer);
81
84
  const at = plane ? toPlane(plane, center) : center;
82
85
  if (!testInside(id, worldPose, worldAABB, layout, at)) return;
83
- if (!session.admits(id)) return;
84
- if (layout.acceptsDrop) {
86
+ const verdict = session.verdict(id);
87
+ if (verdict === false) return;
88
+ const refused = refusalOf(verdict);
89
+ const view = containerView(pc, g, worldPose);
90
+ const content = boxOf(g, view.toStrategy(childFrameAt(poseAdapter, id, worldPose)));
91
+ if (refused === null && layout.acceptsDrop) {
85
92
  const arg = {
86
93
  id,
87
- bounds: worldAABB
94
+ bounds: content
88
95
  };
89
- for (const c of dragged) if (!layout.acceptsDrop(arg, carryDragged(session, c, plane).arg)) return;
96
+ for (const c of dragged) if (!layout.acceptsDrop(arg, draggedInView(view, carryDragged(session, c, plane).arg))) return;
90
97
  }
91
98
  candidates.push({
92
99
  id,
93
100
  bounds: worldAABB,
101
+ content,
102
+ view,
94
103
  layout,
95
104
  zPath,
96
105
  depth: zPath.length,
97
- plane
106
+ plane,
107
+ ...refused !== null ? { refused } : {}
98
108
  });
99
109
  };
100
110
  const walk = (parentId, parentPath) => {
@@ -1 +1 @@
1
- {"version":3,"file":"container.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/container.ts"],"sourcesContent":["import { pointInPath } from '@weasel-js/geom';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { DropRegion, LayoutContainer, LayoutStrategy } from '../../../../layout/types';\nimport type { LayoutDep } from '../../depSchema';\nimport { planeOf } from '../../planeInput';\nimport type { MoveSession } from '../session';\nimport { carryDragged, type DraggedChild } from './dragged';\n\nexport interface Bounds4 { x: number; y: number; width: number; height: number }\nexport function pointInBounds(b: Bounds4, at: { x: number; y: number }): boolean {\n return at.x >= b.x && at.x < b.x + b.width && at.y >= b.y && at.y < b.y + b.height;\n}\n\ntype Layout = LayoutStrategy<unknown>;\nexport interface Candidate {\n id: NodeId;\n bounds: Bounds4;\n layout: LayoutStrategy<unknown>;\n zPath: number[];\n depth: number;\n /** The edited plane into this container's. */\n plane: PlaneMap | null;\n}\n\n/** Whether a world point falls in a drop region, which is authored relative to\n * the top-left of the container's world bounds. */\nfunction regionContains(\n region: DropRegion,\n bounds: { x: number; y: number },\n point: { x: number; y: number },\n): boolean {\n const local = { x: point.x - bounds.x, y: point.y - bounds.y };\n return typeof region === 'function'\n ? region(local)\n : pointInPath(region, local.x, local.y);\n}\n\nfunction chooseContainer(\n scene: Scene<unknown, string, unknown>,\n mode: NonNullable<LayoutDep['dropTarget']>,\n candidates: readonly Candidate[],\n): Candidate | null {\n let dest: Candidate | null = null;\n if (mode === 'topmost') {\n // Painted last wins, in the scene's own render order — which crosses\n // subtrees and layers, where a sibling-index path cannot.\n const byId = new Map<NodeId, Candidate>(candidates.map((c) => [c.id, c]));\n for (const id of scene.renderOrder()) dest = byId.get(id) ?? dest;\n } else {\n // Deepest wins; sibling-index path breaks ties (higher z = later index).\n for (const c of candidates) {\n if (dest === null) { dest = c; continue; }\n if (c.depth > dest.depth) { dest = c; continue; }\n if (c.depth < dest.depth) continue;\n let cAfter = false;\n for (let i = 0; i < c.zPath.length; i++) {\n if (c.zPath[i] > dest.zPath[i]) { cAfter = true; break; }\n if (c.zPath[i] < dest.zPath[i]) { cAfter = false; break; }\n }\n if (cAfter) dest = c;\n }\n }\n return dest;\n}\n\n/** The layout container that takes the drop at `center`, or null. */\nexport function pickContainer(\n session: MoveSession,\n dragged: readonly DraggedChild[],\n center: { x: number; y: number },\n): Candidate | null {\n const layoutDep = session.layout;\n if (!layoutDep) return null;\n const scene = session.scene;\n const pc = session.pc;\n const poseAdapter = scenePoseAdapter(scene);\n const d = session.projection;\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const candidates: Candidate[] = [];\n const mode = layoutDep.dropTarget ?? 'innermost';\n const testInside = (\n id: NodeId, cPose: unknown, aabb: Bounds4, layout: Layout, at: { x: number; y: number },\n ): boolean => {\n const region = layout.dropRegion?.({ id: id as string, bounds: aabb }) ?? null;\n if (region) return regionContains(region, aabb, at);\n if (mode === 'region') return false;\n if (layout.contains) return layout.contains(cPose, at);\n return pointInBounds(aabb, at);\n };\n const consider = (id: NodeId, zPath: number[]): void => {\n const layout = layoutDep.getLayout(id as string);\n if (!layout) return;\n const node = scene.get(id);\n if (!node) return;\n const worldPose = composeWorldPose(poseAdapter, id as string, pc.compose);\n const worldAABB = poseDescriptorForNode(d, node).getBounds(worldPose);\n const plane = planeOf(session.view, node.layer);\n const at = plane ? toPlane(plane, center) : center;\n if (!testInside(id, worldPose, worldAABB, layout, at)) return;\n if (!session.admits(id)) return;\n if (layout.acceptsDrop) {\n const arg: LayoutContainer = { id: id as string, bounds: worldAABB };\n for (const c of dragged) if (!layout.acceptsDrop(arg, carryDragged(session, c, plane).arg)) return;\n }\n candidates.push({\n id,\n bounds: worldAABB,\n layout,\n zPath,\n depth: zPath.length,\n plane,\n });\n };\n const walk = (parentId: NodeId | null, parentPath: number[]): void => {\n const childIds = parentId === null ? scene.roots : scene.childrenOf(parentId);\n for (let i = 0; i < childIds.length; i++) {\n // A dragged root's subtree goes with it: dropping into one of its own\n // descendants would reparent it under itself.\n if (draggedIds.has(childIds[i])) continue;\n const childPath = [...parentPath, i];\n consider(childIds[i], childPath);\n walk(childIds[i], childPath);\n }\n };\n walk(null, []);\n\n return chooseContainer(scene, mode, candidates);\n}\n"],"mappings":";;;;;;;;;AAaA,SAAgB,cAAc,GAAY,IAAuC;CAC/E,OAAO,GAAG,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE,SAAS,GAAG,KAAK,EAAE,KAAK,GAAG,IAAI,EAAE,IAAI,EAAE;AAC9E;;;AAeA,SAAS,eACP,QACA,QACA,OACS;CACT,MAAM,QAAQ;EAAE,GAAG,MAAM,IAAI,OAAO;EAAG,GAAG,MAAM,IAAI,OAAO;CAAE;CAC7D,OAAO,OAAO,WAAW,aACrB,OAAO,KAAK,IACZ,YAAY,QAAQ,MAAM,GAAG,MAAM,CAAC;AAC1C;AAEA,SAAS,gBACP,OACA,MACA,YACkB;CAClB,IAAI,OAAyB;CAC7B,IAAI,SAAS,WAAW;EAGtB,MAAM,OAAO,IAAI,IAAuB,WAAW,KAAK,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;EACxE,KAAK,MAAM,MAAM,MAAM,YAAY,GAAG,OAAO,KAAK,IAAI,EAAE,KAAK;CAC/D,OAEE,KAAK,MAAM,KAAK,YAAY;EAC1B,IAAI,SAAS,MAAM;GAAE,OAAO;GAAG;EAAU;EACzC,IAAI,EAAE,QAAQ,KAAK,OAAO;GAAE,OAAO;GAAG;EAAU;EAChD,IAAI,EAAE,QAAQ,KAAK,OAAO;EAC1B,IAAI,SAAS;EACb,KAAK,IAAI,IAAI,GAAG,IAAI,EAAE,MAAM,QAAQ,KAAK;GACvC,IAAI,EAAE,MAAM,KAAK,KAAK,MAAM,IAAI;IAAE,SAAS;IAAM;GAAO;GACxD,IAAI,EAAE,MAAM,KAAK,KAAK,MAAM,IAAI;IAAE,SAAS;IAAO;GAAO;EAC3D;EACA,IAAI,QAAQ,OAAO;CACrB;CAEF,OAAO;AACT;;AAGA,SAAgB,cACd,SACA,SACA,QACkB;CAClB,MAAM,YAAY,QAAQ;CAC1B,IAAI,CAAC,WAAW,OAAO;CACvB,MAAM,QAAQ,QAAQ;CACtB,MAAM,KAAK,QAAQ;CACnB,MAAM,cAAc,iBAAiB,KAAK;CAC1C,MAAM,IAAI,QAAQ;CAClB,MAAM,aAAa,IAAI,IAAY,QAAQ,KAAK,MAAM,EAAE,EAAE,CAAC;CAC3D,MAAM,aAA0B,CAAC;CACjC,MAAM,OAAO,UAAU,cAAc;CACrC,MAAM,cACJ,IAAY,OAAgB,MAAe,QAAgB,OAC/C;EACZ,MAAM,SAAS,OAAO,aAAa;GAAM;GAAc,QAAQ;EAAK,CAAC,KAAK;EAC1E,IAAI,QAAQ,OAAO,eAAe,QAAQ,MAAM,EAAE;EAClD,IAAI,SAAS,UAAU,OAAO;EAC9B,IAAI,OAAO,UAAU,OAAO,OAAO,SAAS,OAAO,EAAE;EACrD,OAAO,cAAc,MAAM,EAAE;CAC/B;CACA,MAAM,YAAY,IAAY,UAA0B;EACtD,MAAM,SAAS,UAAU,UAAU,EAAY;EAC/C,IAAI,CAAC,QAAQ;EACb,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,IAAI,CAAC,MAAM;EACX,MAAM,YAAY,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACxE,MAAM,YAAY,sBAAsB,GAAG,IAAI,CAAC,CAAC,UAAU,SAAS;EACpE,MAAM,QAAQ,QAAQ,QAAQ,MAAM,KAAK,KAAK;EAC9C,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM,IAAI;EAC5C,IAAI,CAAC,WAAW,IAAI,WAAW,WAAW,QAAQ,EAAE,GAAG;EACvD,IAAI,CAAC,QAAQ,OAAO,EAAE,GAAG;EACzB,IAAI,OAAO,aAAa;GACtB,MAAM,MAAuB;IAAM;IAAc,QAAQ;GAAU;GACnE,KAAK,MAAM,KAAK,SAAS,IAAI,CAAC,OAAO,YAAY,KAAK,aAAa,SAAS,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG;EAC9F;EACA,WAAW,KAAK;GACd;GACA,QAAQ;GACR;GACA;GACA,OAAO,MAAM;GACb;EACF,CAAC;CACH;CACA,MAAM,QAAQ,UAAyB,eAA+B;EACpE,MAAM,WAAW,aAAa,OAAO,MAAM,QAAQ,MAAM,WAAW,QAAQ;EAC5E,KAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;GAGxC,IAAI,WAAW,IAAI,SAAS,EAAE,GAAG;GACjC,MAAM,YAAY,CAAC,GAAG,YAAY,CAAC;GACnC,SAAS,SAAS,IAAI,SAAS;GAC/B,KAAK,SAAS,IAAI,SAAS;EAC7B;CACF;CACA,KAAK,MAAM,CAAC,CAAC;CAEb,OAAO,gBAAgB,OAAO,MAAM,UAAU;AAChD"}
1
+ {"version":3,"file":"container.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/container.ts"],"sourcesContent":["import { pointInPath } from '@weasel-js/geom';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { childFrameAt, composeWorldPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { DropRegion, LayoutContainer, LayoutStrategy } from '../../../../layout/types';\nimport type { LayoutDep } from '../../depSchema';\nimport { planeOf } from '../../planeInput';\nimport type { MoveSession } from '../session';\nimport { carryDragged, type DraggedChild } from './dragged';\nimport { refusalOf } from '../../dropVerdict';\nimport type { StrategyView } from 'core/scene/strategyView';\nimport { boxOf, containerView, draggedInView } from './view';\n\nexport interface Bounds4 { x: number; y: number; width: number; height: number }\nexport function pointInBounds(b: Bounds4, at: { x: number; y: number }): boolean {\n return at.x >= b.x && at.x < b.x + b.width && at.y >= b.y && at.y < b.y + b.height;\n}\n\ntype Layout = LayoutStrategy<unknown>;\nexport interface Candidate {\n id: NodeId;\n /** The container's body in world: what the pointer is tested against. */\n bounds: Bounds4;\n /** Its content's frame, `bounds` moved by its scroll offset, in `view`'s\n * space: the `LayoutContainer.bounds` its strategy is handed, so the slots\n * it places agree with its children as they are shown. */\n content: Bounds4;\n /** The container as its strategy sees it: upright, in its own frame. */\n view: StrategyView<unknown>;\n layout: LayoutStrategy<unknown>;\n zPath: number[];\n depth: number;\n /** The edited plane into this container's. */\n plane: PlaneMap | null;\n /** The reason it refuses the drop, when it does: it still blocks the containers around it. */\n refused?: string;\n}\n\n/** Whether a world point falls in a drop region, which is authored relative to\n * the top-left of the container's world bounds. */\nfunction regionContains(\n region: DropRegion,\n bounds: { x: number; y: number },\n point: { x: number; y: number },\n): boolean {\n const local = { x: point.x - bounds.x, y: point.y - bounds.y };\n return typeof region === 'function'\n ? region(local)\n : pointInPath(region, local.x, local.y);\n}\n\nfunction chooseContainer(\n scene: Scene<unknown, string, unknown>,\n mode: NonNullable<LayoutDep['dropTarget']>,\n candidates: readonly Candidate[],\n): Candidate | null {\n let dest: Candidate | null = null;\n if (mode === 'topmost') {\n // Painted last wins, in the scene's own render order — which crosses\n // subtrees and layers, where a sibling-index path cannot.\n const byId = new Map<NodeId, Candidate>(candidates.map((c) => [c.id, c]));\n for (const id of scene.renderOrder()) dest = byId.get(id) ?? dest;\n } else {\n // Deepest wins; sibling-index path breaks ties (higher z = later index).\n for (const c of candidates) {\n if (dest === null) { dest = c; continue; }\n if (c.depth > dest.depth) { dest = c; continue; }\n if (c.depth < dest.depth) continue;\n let cAfter = false;\n for (let i = 0; i < c.zPath.length; i++) {\n if (c.zPath[i] > dest.zPath[i]) { cAfter = true; break; }\n if (c.zPath[i] < dest.zPath[i]) { cAfter = false; break; }\n }\n if (cAfter) dest = c;\n }\n }\n return dest;\n}\n\n/** The layout container that takes the drop at `center`, or null. */\nexport function pickContainer(\n session: MoveSession,\n dragged: readonly DraggedChild[],\n center: { x: number; y: number },\n): Candidate | null {\n const layoutDep = session.layout;\n if (!layoutDep) return null;\n const scene = session.scene;\n const pc = session.pc;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const d = session.projection;\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const candidates: Candidate[] = [];\n const mode = layoutDep.dropTarget ?? 'innermost';\n const testInside = (\n id: NodeId, cPose: unknown, aabb: Bounds4, layout: Layout, at: { x: number; y: number },\n ): boolean => {\n const region = layout.dropRegion?.({ id: id as string, bounds: aabb }) ?? null;\n if (region) return regionContains(region, aabb, at);\n if (mode === 'region') return false;\n if (layout.contains) return layout.contains(cPose, at);\n return pointInBounds(aabb, at);\n };\n const consider = (id: NodeId, zPath: number[]): void => {\n const layout = layoutDep.getLayout(id as string);\n if (!layout) return;\n const node = scene.get(id);\n if (!node) return;\n const worldPose = composeWorldPose(poseAdapter, id as string, pc.compose);\n const g = poseDescriptorForNode(d, node);\n const worldAABB = g.getBounds(worldPose);\n const plane = planeOf(session.view, node.layer);\n const at = plane ? toPlane(plane, center) : center;\n if (!testInside(id, worldPose, worldAABB, layout, at)) return;\n const verdict = session.verdict(id);\n if (verdict === false) return;\n const refused = refusalOf(verdict);\n const view = containerView(pc, g, worldPose);\n const content = boxOf(g, view.toStrategy(childFrameAt(poseAdapter, id as string, worldPose)));\n if (refused === null && layout.acceptsDrop) {\n const arg: LayoutContainer = { id: id as string, bounds: content };\n for (const c of dragged) {\n if (!layout.acceptsDrop(arg, draggedInView(view, carryDragged(session, c, plane).arg))) return;\n }\n }\n candidates.push({\n id,\n bounds: worldAABB,\n content,\n view,\n layout,\n zPath,\n depth: zPath.length,\n plane,\n ...(refused !== null ? { refused } : {}),\n });\n };\n const walk = (parentId: NodeId | null, parentPath: number[]): void => {\n const childIds = parentId === null ? scene.roots : scene.childrenOf(parentId);\n for (let i = 0; i < childIds.length; i++) {\n // A dragged root's subtree goes with it: dropping into one of its own\n // descendants would reparent it under itself.\n if (draggedIds.has(childIds[i])) continue;\n const childPath = [...parentPath, i];\n consider(childIds[i], childPath);\n walk(childIds[i], childPath);\n }\n };\n walk(null, []);\n\n return chooseContainer(scene, mode, candidates);\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { toPlane } from "../../../../core/viewport/parallax.js";
2
2
  import { composeWorldPose } from "../../../../core/scene/composeFrame.js";
3
3
  import { poseDescriptorForNode, translatePoseViaDescriptor } from "../../../../core/geometry/poseDescriptor.js";
4
- import { scenePoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
4
+ import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
5
5
  import { carryPose, invertPlane, planeOf } from "../../planeInput.js";
6
6
  import { grabbedPoseAdapter, planeDelta } from "../delta.js";
7
7
 
@@ -10,7 +10,7 @@ import { grabbedPoseAdapter, planeDelta } from "../delta.js";
10
10
  function gatherDragged(session, delta) {
11
11
  const scene = session.scene;
12
12
  const pc = session.pc;
13
- const poseAdapter = scenePoseAdapter(scene);
13
+ const poseAdapter = sceneViewPoseAdapter(scene);
14
14
  const { dx, dy } = delta;
15
15
  const d = session.projection;
16
16
  const grabAdapter = grabbedPoseAdapter(session, poseAdapter);
@@ -1 +1 @@
1
- {"version":3,"file":"dragged.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dragged.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode, translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutDragged } from '../../../../layout/types';\nimport { carryPose, invertPlane, planeOf } from '../../planeInput';\nimport { grabbedPoseAdapter, planeDelta } from '../delta';\nimport type { MoveSession } from '../session';\n\nexport interface DraggedChild {\n id: NodeId;\n arg: LayoutDragged<unknown>;\n center: { x: number; y: number };\n}\n\n/** Each dragged root in world, in the edited plane. */\nexport function gatherDragged(session: MoveSession, delta: { dx: number; dy: number }): DraggedChild[] {\n const scene = session.scene;\n const pc = session.pc;\n const poseAdapter = scenePoseAdapter(scene);\n const { dx, dy } = delta;\n // Each dragged preview in WORLD: compose the committed start pose up the\n // parent chain, then add the world drag delta (same math as `applyReparent`).\n // The LayoutStrategy contract is world-framed, so every pose handed to it\n // below is composed to world; reflow results are rebased back to local.\n // A selection spanning planes is gathered in the edited plane, and handed\n // to each container carried into the plane that container is stored in.\n const d = session.projection;\n const grabAdapter = grabbedPoseAdapter(session, poseAdapter);\n const dragged: DraggedChild[] = [];\n for (const id of session.ids) {\n const node = scene.get(id);\n if (!node) continue;\n const startWorld = composeWorldPose(grabAdapter, id as string, pc.compose);\n const g = poseDescriptorForNode(d, node);\n const own = planeDelta(session, id, dx, dy);\n const toEdited = invertPlane(planeOf(session.view, node.layer));\n const world = carryPose(g, translatePoseViaDescriptor(startWorld, own.dx, own.dy, g), toEdited);\n const b = g.getBounds(world);\n dragged.push({\n id,\n arg: {\n id: id as string,\n originPose: carryPose(g, startWorld, toEdited),\n pose: world,\n sourceContainerId: (node.parent ?? null) as string | null,\n },\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n });\n }\n return dragged;\n}\n\n/** `c` carried into the plane `m` maps to; `c` itself when `m` is null. */\nexport function carryDragged(session: MoveSession, c: DraggedChild, m: PlaneMap | null): DraggedChild {\n const { scene, projection: d } = session;\n if (m === null) return c;\n const g = poseDescriptorForNode(d, scene.get(c.id)!);\n return {\n id: c.id,\n arg: { ...c.arg, originPose: carryPose(g, c.arg.originPose, m), pose: carryPose(g, c.arg.pose, m) },\n center: toPlane(m, c.center),\n };\n}\n\n/** Center of the bounds of everything dragged. */\nexport function selectionCenter(session: MoveSession, dragged: readonly DraggedChild[]): { x: number; y: number } {\n const d = session.projection;\n // The selection lands as a unit, so one point decides the container: the\n // center of the whole dragged group. Hit-testing each child on its own\n // would scatter a selection straddling two containers.\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const c of dragged) {\n const b = d.getBounds(c.arg.pose);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,cAAc,SAAsB,OAAmD;CACrG,MAAM,QAAQ,QAAQ;CACtB,MAAM,KAAK,QAAQ;CACnB,MAAM,cAAc,iBAAiB,KAAK;CAC1C,MAAM,EAAE,IAAI,OAAO;CAOnB,MAAM,IAAI,QAAQ;CAClB,MAAM,cAAc,mBAAmB,SAAS,WAAW;CAC3D,MAAM,UAA0B,CAAC;CACjC,KAAK,MAAM,MAAM,QAAQ,KAAK;EAC5B,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,IAAI,CAAC,MAAM;EACX,MAAM,aAAa,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACzE,MAAM,IAAI,sBAAsB,GAAG,IAAI;EACvC,MAAM,MAAM,WAAW,SAAS,IAAI,IAAI,EAAE;EAC1C,MAAM,WAAW,YAAY,QAAQ,QAAQ,MAAM,KAAK,KAAK,CAAC;EAC9D,MAAM,QAAQ,UAAU,GAAG,2BAA2B,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,QAAQ;EAC9F,MAAM,IAAI,EAAE,UAAU,KAAK;EAC3B,QAAQ,KAAK;GACX;GACA,KAAK;IACC;IACJ,YAAY,UAAU,GAAG,YAAY,QAAQ;IAC7C,MAAM;IACN,mBAAoB,KAAK,UAAU;GACrC;GACA,QAAQ;IAAE,GAAG,EAAE,IAAI,EAAE,QAAQ;IAAG,GAAG,EAAE,IAAI,EAAE,SAAS;GAAE;EACxD,CAAC;CACH;CACA,OAAO;AACT;;AAGA,SAAgB,aAAa,SAAsB,GAAiB,GAAkC;CACpG,MAAM,EAAE,OAAO,YAAY,MAAM;CACjC,IAAI,MAAM,MAAM,OAAO;CACvB,MAAM,IAAI,sBAAsB,GAAG,MAAM,IAAI,EAAE,EAAE,CAAE;CACnD,OAAO;EACL,IAAI,EAAE;EACN,KAAK;GAAE,GAAG,EAAE;GAAK,YAAY,UAAU,GAAG,EAAE,IAAI,YAAY,CAAC;GAAG,MAAM,UAAU,GAAG,EAAE,IAAI,MAAM,CAAC;EAAE;EAClG,QAAQ,QAAQ,GAAG,EAAE,MAAM;CAC7B;AACF;;AAGA,SAAgB,gBAAgB,SAAsB,SAA4D;CAChH,MAAM,IAAI,QAAQ;CAIlB,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CACX,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI;EAChC,OAAO,KAAK,IAAI,MAAM,EAAE,CAAC;EACzB,OAAO,KAAK,IAAI,MAAM,EAAE,CAAC;EACzB,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK;EACnC,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM;CACtC;CACA,OAAO;EAAE,IAAI,OAAO,QAAQ;EAAG,IAAI,OAAO,QAAQ;CAAE;AACtD"}
1
+ {"version":3,"file":"dragged.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dragged.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode, translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport { toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutDragged } from '../../../../layout/types';\nimport { carryPose, invertPlane, planeOf } from '../../planeInput';\nimport { grabbedPoseAdapter, planeDelta } from '../delta';\nimport type { MoveSession } from '../session';\n\nexport interface DraggedChild {\n id: NodeId;\n arg: LayoutDragged<unknown>;\n center: { x: number; y: number };\n}\n\n/** Each dragged root in world, in the edited plane. */\nexport function gatherDragged(session: MoveSession, delta: { dx: number; dy: number }): DraggedChild[] {\n const scene = session.scene;\n const pc = session.pc;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const { dx, dy } = delta;\n // Each dragged preview in WORLD: compose the committed start pose up the\n // parent chain, then add the world drag delta (same math as `applyReparent`).\n // The LayoutStrategy contract is world-framed, so every pose handed to it\n // below is composed to world; reflow results are rebased back to local.\n // A selection spanning planes is gathered in the edited plane, and handed\n // to each container carried into the plane that container is stored in.\n const d = session.projection;\n const grabAdapter = grabbedPoseAdapter(session, poseAdapter);\n const dragged: DraggedChild[] = [];\n for (const id of session.ids) {\n const node = scene.get(id);\n if (!node) continue;\n const startWorld = composeWorldPose(grabAdapter, id as string, pc.compose);\n const g = poseDescriptorForNode(d, node);\n const own = planeDelta(session, id, dx, dy);\n const toEdited = invertPlane(planeOf(session.view, node.layer));\n const world = carryPose(g, translatePoseViaDescriptor(startWorld, own.dx, own.dy, g), toEdited);\n const b = g.getBounds(world);\n dragged.push({\n id,\n arg: {\n id: id as string,\n originPose: carryPose(g, startWorld, toEdited),\n pose: world,\n sourceContainerId: (node.parent ?? null) as string | null,\n },\n center: { x: b.x + b.width / 2, y: b.y + b.height / 2 },\n });\n }\n return dragged;\n}\n\n/** `c` carried into the plane `m` maps to; `c` itself when `m` is null. */\nexport function carryDragged(session: MoveSession, c: DraggedChild, m: PlaneMap | null): DraggedChild {\n const { scene, projection: d } = session;\n if (m === null) return c;\n const g = poseDescriptorForNode(d, scene.get(c.id)!);\n return {\n id: c.id,\n arg: { ...c.arg, originPose: carryPose(g, c.arg.originPose, m), pose: carryPose(g, c.arg.pose, m) },\n center: toPlane(m, c.center),\n };\n}\n\n/** Center of the bounds of everything dragged. */\nexport function selectionCenter(session: MoveSession, dragged: readonly DraggedChild[]): { x: number; y: number } {\n const d = session.projection;\n // The selection lands as a unit, so one point decides the container: the\n // center of the whole dragged group. Hit-testing each child on its own\n // would scatter a selection straddling two containers.\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const c of dragged) {\n const b = d.getBounds(c.arg.pose);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n return { x: (minX + maxX) / 2, y: (minY + maxY) / 2 };\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,cAAc,SAAsB,OAAmD;CACrG,MAAM,QAAQ,QAAQ;CACtB,MAAM,KAAK,QAAQ;CACnB,MAAM,cAAc,qBAAqB,KAAK;CAC9C,MAAM,EAAE,IAAI,OAAO;CAOnB,MAAM,IAAI,QAAQ;CAClB,MAAM,cAAc,mBAAmB,SAAS,WAAW;CAC3D,MAAM,UAA0B,CAAC;CACjC,KAAK,MAAM,MAAM,QAAQ,KAAK;EAC5B,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,IAAI,CAAC,MAAM;EACX,MAAM,aAAa,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACzE,MAAM,IAAI,sBAAsB,GAAG,IAAI;EACvC,MAAM,MAAM,WAAW,SAAS,IAAI,IAAI,EAAE;EAC1C,MAAM,WAAW,YAAY,QAAQ,QAAQ,MAAM,KAAK,KAAK,CAAC;EAC9D,MAAM,QAAQ,UAAU,GAAG,2BAA2B,YAAY,IAAI,IAAI,IAAI,IAAI,CAAC,GAAG,QAAQ;EAC9F,MAAM,IAAI,EAAE,UAAU,KAAK;EAC3B,QAAQ,KAAK;GACX;GACA,KAAK;IACC;IACJ,YAAY,UAAU,GAAG,YAAY,QAAQ;IAC7C,MAAM;IACN,mBAAoB,KAAK,UAAU;GACrC;GACA,QAAQ;IAAE,GAAG,EAAE,IAAI,EAAE,QAAQ;IAAG,GAAG,EAAE,IAAI,EAAE,SAAS;GAAE;EACxD,CAAC;CACH;CACA,OAAO;AACT;;AAGA,SAAgB,aAAa,SAAsB,GAAiB,GAAkC;CACpG,MAAM,EAAE,OAAO,YAAY,MAAM;CACjC,IAAI,MAAM,MAAM,OAAO;CACvB,MAAM,IAAI,sBAAsB,GAAG,MAAM,IAAI,EAAE,EAAE,CAAE;CACnD,OAAO;EACL,IAAI,EAAE;EACN,KAAK;GAAE,GAAG,EAAE;GAAK,YAAY,UAAU,GAAG,EAAE,IAAI,YAAY,CAAC;GAAG,MAAM,UAAU,GAAG,EAAE,IAAI,MAAM,CAAC;EAAE;EAClG,QAAQ,QAAQ,GAAG,EAAE,MAAM;CAC7B;AACF;;AAGA,SAAgB,gBAAgB,SAAsB,SAA4D;CAChH,MAAM,IAAI,QAAQ;CAIlB,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,OAAO;CACX,KAAK,MAAM,KAAK,SAAS;EACvB,MAAM,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI;EAChC,OAAO,KAAK,IAAI,MAAM,EAAE,CAAC;EACzB,OAAO,KAAK,IAAI,MAAM,EAAE,CAAC;EACzB,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,KAAK;EACnC,OAAO,KAAK,IAAI,MAAM,EAAE,IAAI,EAAE,MAAM;CACtC;CACA,OAAO;EAAE,IAAI,OAAO,QAAQ;EAAG,IAAI,OAAO,QAAQ;CAAE;AACtD"}
@@ -1,9 +1,10 @@
1
1
  import { toPlane } from "../../../../core/viewport/parallax.js";
2
2
  import { composeWorldPose, rebaseLocalPose } from "../../../../core/scene/composeFrame.js";
3
- import { translatePoseViaDescriptor } from "../../../../core/geometry/poseDescriptor.js";
4
- import { scenePoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
3
+ import { poseDescriptorForNode, translatePoseViaDescriptor } from "../../../../core/geometry/poseDescriptor.js";
4
+ import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
5
5
  import { carriedDescendants, sceneCarrySource } from "../../../../core/scene/carryDescendants.js";
6
6
  import { asNodeId } from "../../../../core/scene/types.js";
7
+ import { boxOf, containerView, draggedInView, pointInView } from "./view.js";
7
8
  import { carryDragged, gatherDragged, selectionCenter } from "./dragged.js";
8
9
  import { pickContainer } from "./container.js";
9
10
 
@@ -28,12 +29,12 @@ function groupBySourceContainer(dragged, exclude) {
28
29
  * any of them: a container that cannot take every member takes none. */
29
30
  function placeAll(session, dest, container, dragged, probeOffset) {
30
31
  const { scene, pc } = session;
31
- const poseAdapter = scenePoseAdapter(scene);
32
+ const poseAdapter = sceneViewPoseAdapter(scene);
32
33
  const draggedIds = new Set(dragged.map((c) => c.id));
33
- const layout = dest.layout;
34
+ const { layout, view } = dest;
34
35
  const working = scene.childrenOf(dest.id).map((cid) => ({
35
36
  id: cid,
36
- pose: composeWorldPose(poseAdapter, cid, pc.compose)
37
+ pose: view.toStrategy(composeWorldPose(poseAdapter, cid, pc.compose))
37
38
  }));
38
39
  const setWorking = (id, pose) => {
39
40
  const at = working.findIndex((c) => c.id === id);
@@ -51,25 +52,28 @@ function placeAll(session, dest, container, dragged, probeOffset) {
51
52
  const destPlane = dest.plane;
52
53
  for (const edited of dragged) {
53
54
  const dc = carryDragged(session, edited, destPlane);
55
+ const arg = draggedInView(view, dc.arg);
54
56
  const children = working.map((c) => ({ ...c }));
55
- const targets = layout.getDropTargets(container, children, dc.arg);
57
+ const targets = layout.getDropTargets(container, children, arg);
56
58
  const probe = {
57
59
  x: edited.center.x + probeOffset.x,
58
60
  y: edited.center.y + probeOffset.y
59
61
  };
60
- const target = layout.snap.pickTarget(targets, destPlane ? toPlane(destPlane, probe) : probe);
62
+ const g = poseDescriptorForNode(session.projection, scene.get(edited.id));
63
+ const at = pointInView(view, g, dc.arg.pose, destPlane ? toPlane(destPlane, probe) : probe);
64
+ const target = layout.snap.pickTarget(targets, at);
61
65
  if (!target) return null;
62
66
  placements.push({
63
- dragged: dc.arg,
67
+ dragged: arg,
64
68
  children,
65
69
  target
66
70
  });
67
- const poses = layout.reflowPoses(container, children, dc.arg, target);
71
+ const poses = layout.reflowPoses(container, children, arg, target);
68
72
  for (const [cid, pose] of poses) {
69
73
  setWorking(cid, pose);
70
- if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), pose);
74
+ if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), view.toWorld(pose));
71
75
  }
72
- setWorking(dc.arg.id, poses.get(dc.arg.id) ?? target.pose);
76
+ setWorking(arg.id, poses.get(arg.id) ?? target.pose);
73
77
  }
74
78
  return {
75
79
  placements,
@@ -79,7 +83,7 @@ function placeAll(session, dest, container, dragged, probeOffset) {
79
83
  /** World poses of the leftovers that moved in each container the selection left. */
80
84
  function sourceReflow(session, dragged, destId) {
81
85
  const { scene, pc, projection: d } = session;
82
- const poseAdapter = scenePoseAdapter(scene);
86
+ const poseAdapter = sceneViewPoseAdapter(scene);
83
87
  const sourceReflow = /* @__PURE__ */ new Map();
84
88
  const layoutDep = session.layout;
85
89
  if (!layoutDep) return sourceReflow;
@@ -90,15 +94,18 @@ function sourceReflow(session, dragged, destId) {
90
94
  const srcLayout = layoutDep.getLayout(srcId);
91
95
  const srcNode = scene.get(asNodeId(srcId));
92
96
  if (!srcLayout || !srcNode) continue;
97
+ const g = poseDescriptorForNode(d, srcNode);
98
+ const view = containerView(pc, g, composeWorldPose(poseAdapter, srcId, pc.compose));
93
99
  const srcContainer = {
94
100
  id: srcId,
95
- bounds: d.getBounds(composeWorldPose(poseAdapter, srcId, pc.compose))
101
+ bounds: boxOf(g, view.upright)
96
102
  };
97
103
  const srcChildren = scene.childrenOf(asNodeId(srcId)).filter((cid) => !leaving.has(cid)).map((cid) => ({
98
104
  id: cid,
99
- pose: composeWorldPose(poseAdapter, cid, pc.compose)
105
+ pose: view.toStrategy(composeWorldPose(poseAdapter, cid, pc.compose))
100
106
  }));
101
- for (const [cid, pose] of srcLayout.childPoses(srcContainer, srcChildren)) {
107
+ for (const [cid, placed] of srcLayout.childPoses(srcContainer, srcChildren)) {
108
+ const pose = view.toWorld(placed);
102
109
  const cur = d.getBounds(composeWorldPose(poseAdapter, cid, pc.compose));
103
110
  const next = d.getBounds(pose);
104
111
  if (cur.x === next.x && cur.y === next.y && cur.width === next.width && cur.height === next.height) continue;
@@ -110,7 +117,7 @@ function sourceReflow(session, dragged, destId) {
110
117
  /** The stored poses that bring `id`'s descendants along to `world`, where a reflow shows it. */
111
118
  function reflowCarry(session, id, world, moving) {
112
119
  const { scene, pc, projection: d } = session;
113
- const a = d.getBounds(composeWorldPose(scenePoseAdapter(scene), id, pc.compose));
120
+ const a = d.getBounds(composeWorldPose(sceneViewPoseAdapter(scene), id, pc.compose));
114
121
  const b = d.getBounds(world);
115
122
  const dx = b.x - a.x;
116
123
  const dy = b.y - a.y;
@@ -121,7 +128,7 @@ function reflowCarry(session, id, world, moving) {
121
128
  function runDropPass(session, delta, pointer) {
122
129
  if (!session.layout) return null;
123
130
  const { scene, pc } = session;
124
- const poseAdapter = scenePoseAdapter(scene);
131
+ const poseAdapter = sceneViewPoseAdapter(scene);
125
132
  const dragged = gatherDragged(session, delta);
126
133
  if (dragged.length === 0) return null;
127
134
  const dropCenter = selectionCenter(session, dragged);
@@ -135,9 +142,19 @@ function runDropPass(session, delta, pointer) {
135
142
  pass: null,
136
143
  reflow: /* @__PURE__ */ new Map()
137
144
  };
145
+ if (dest.refused !== void 0) return {
146
+ dropCenter,
147
+ pass: null,
148
+ reflow: /* @__PURE__ */ new Map(),
149
+ refused: {
150
+ id: dest.id,
151
+ bounds: dest.bounds,
152
+ reason: dest.refused
153
+ }
154
+ };
138
155
  const container = {
139
156
  id: dest.id,
140
- bounds: dest.bounds
157
+ bounds: dest.content
141
158
  };
142
159
  const placed = placeAll(session, dest, container, dragged, probeOffset);
143
160
  if (!placed) return {
@@ -168,6 +185,7 @@ function runDropPass(session, delta, pointer) {
168
185
  pass: {
169
186
  layout: dest.layout,
170
187
  container,
188
+ view: dest.view,
171
189
  placements: placed.placements,
172
190
  sourceReflow: leftovers,
173
191
  reflowIds
@@ -1 +1 @@
1
- {"version":3,"file":"dropPass.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dropPass.ts"],"sourcesContent":["import { asNodeId, type NodeId } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, rebaseLocalPose } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport { carriedDescendants, sceneCarrySource } from 'core/scene/carryDescendants';\nimport { translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport type { LayoutChild, LayoutContainer } from '../../../../layout/types';\nimport type { MoveSession } from '../session';\nimport { pickContainer, type Candidate } from './container';\nimport { carryDragged, gatherDragged, selectionCenter, type DraggedChild } from './dragged';\nimport type { DropPass, LayoutPlacement } from './types';\n\n/** Dragged ids grouped by the container they are leaving, skipping any that\n * stay put (`exclude` is the destination) or that had no container. */\nexport function groupBySourceContainer(\n dragged: ReadonlyArray<{ id: NodeId; sourceContainerId: string | null }>,\n exclude: string | null,\n): Map<string, Set<NodeId>> {\n const out = new Map<string, Set<NodeId>>();\n for (const d of dragged) {\n const src = d.sourceContainerId;\n if (!src || src === exclude) continue;\n let set = out.get(src);\n if (!set) { set = new Set<NodeId>(); out.set(src, set); }\n set.add(d.id);\n }\n return out;\n}\n\n/** Place each dragged child in `dest` in turn. Null when the snap rejects\n * any of them: a container that cannot take every member takes none. */\nfunction placeAll(\n session: MoveSession,\n dest: Candidate,\n container: LayoutContainer,\n dragged: readonly DraggedChild[],\n probeOffset: { x: number; y: number },\n): { placements: LayoutPlacement[]; destReflow: Map<NodeId, unknown> } | null {\n const { scene, pc } = session;\n const poseAdapter = scenePoseAdapter(scene);\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const layout = dest.layout;\n // The container state the placements run against, advanced by each one.\n const working: LayoutChild<unknown>[] = scene.childrenOf(dest.id).map((cid) => ({\n id: cid as string,\n pose: composeWorldPose(poseAdapter, cid as string, pc.compose),\n }));\n const setWorking = (id: string, pose: unknown): void => {\n const at = working.findIndex((c) => c.id === id);\n if (at >= 0) working[at] = { id, pose };\n else working.push({ id, pose });\n };\n\n const placements: LayoutPlacement[] = [];\n const destReflow = new Map<NodeId, unknown>();\n const destPlane = dest.plane;\n for (const edited of dragged) {\n const dc = carryDragged(session, edited, destPlane);\n const children = working.map((c) => ({ ...c }));\n const targets = layout.getDropTargets(container, children, dc.arg);\n const probe = { x: edited.center.x + probeOffset.x, y: edited.center.y + probeOffset.y };\n const target = layout.snap.pickTarget(targets, destPlane ? toPlane(destPlane, probe) : probe);\n // All-or-nothing: a container that cannot take every member takes none\n // rather than splitting the selection between two homes.\n if (!target) return null;\n placements.push({ dragged: dc.arg, children, target });\n const poses = layout.reflowPoses(container, children, dc.arg, target);\n for (const [cid, pose] of poses) {\n setWorking(cid, pose);\n if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), pose);\n }\n setWorking(dc.arg.id, poses.get(dc.arg.id) ?? target.pose);\n }\n return { placements, destReflow };\n}\n\n/** World poses of the leftovers that moved in each container the selection left. */\nfunction sourceReflow(\n session: MoveSession, dragged: readonly DraggedChild[], destId: string,\n): Map<string, unknown> {\n const { scene, pc, projection: d } = session;\n const poseAdapter = scenePoseAdapter(scene);\n // Source reflow (cross-container) → fold changed leftovers into previews.\n // One pass per container the selection left behind, with everything that\n // left it withdrawn at once.\n const sourceReflow = new Map<string, unknown>();\n const layoutDep = session.layout;\n if (!layoutDep) return sourceReflow;\n for (const [srcId, leaving] of groupBySourceContainer(dragged.map((c) => ({\n id: c.id,\n sourceContainerId: c.arg.sourceContainerId,\n })), destId)) {\n const srcLayout = layoutDep.getLayout(srcId);\n const srcNode = scene.get(asNodeId(srcId));\n if (!srcLayout || !srcNode) continue;\n const srcContainer: LayoutContainer = {\n id: srcId,\n bounds: d.getBounds(composeWorldPose(poseAdapter, srcId, pc.compose)),\n };\n const srcChildren: LayoutChild<unknown>[] = scene.childrenOf(asNodeId(srcId))\n .filter((cid) => !leaving.has(cid))\n .map((cid) => ({\n id: cid as string,\n pose: composeWorldPose(poseAdapter, cid as string, pc.compose),\n }));\n for (const [cid, pose] of srcLayout.childPoses(srcContainer, srcChildren)) {\n const cur = d.getBounds(composeWorldPose(poseAdapter, cid, pc.compose));\n const next = d.getBounds(pose);\n const same = cur.x === next.x && cur.y === next.y\n && cur.width === next.width && cur.height === next.height;\n if (same) continue;\n sourceReflow.set(cid, pose); // WORLD — rebased at each consumption point\n }\n }\n return sourceReflow;\n}\n\n/** The stored poses that bring `id`'s descendants along to `world`, where a reflow shows it. */\nfunction reflowCarry(\n session: MoveSession, id: NodeId, world: unknown, moving: (id: NodeId) => boolean,\n): Map<NodeId, unknown> {\n const { scene, pc, projection: d } = session;\n const a = d.getBounds(composeWorldPose(scenePoseAdapter(scene), id as string, pc.compose));\n const b = d.getBounds(world);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (dx === 0 && dy === 0) return new Map();\n return carriedDescendants(sceneCarrySource(scene), id, (pose) => translatePoseViaDescriptor(pose, dx, dy, d), moving);\n}\n\n/** One frame's layout result, or null with no layout dep or nothing dragged. */\nexport function runDropPass(\n session: MoveSession,\n delta: { dx: number; dy: number },\n pointer: { x: number; y: number },\n): DropPass | null {\n if (!session.layout) return null;\n const { scene, pc } = session;\n const poseAdapter = scenePoseAdapter(scene);\n const dragged = gatherDragged(session, delta);\n if (dragged.length === 0) return null;\n const dropCenter = selectionCenter(session, dragged);\n // Each child is snapped at its own position, displaced by however far the\n // pointer sits from that center — the group keeps its shape, and a lone\n // child is still probed at the pointer itself.\n const probeOffset = {\n x: pointer.x - dropCenter.x,\n y: pointer.y - dropCenter.y,\n };\n\n const dest = pickContainer(session, dragged, dropCenter);\n if (!dest) return { dropCenter, pass: null, reflow: new Map() };\n\n const container: LayoutContainer = { id: dest.id as string, bounds: dest.bounds };\n const placed = placeAll(session, dest, container, dragged, probeOffset);\n if (!placed) return { dropCenter, pass: null, reflow: new Map() };\n\n // Destination reflow → fold into previews (the dragged children keep their\n // pointer-following ghosts). `reflowPoses` returns world; previews are\n // local, so rebase to the child's current parent frame first.\n const reflow = new Map<NodeId, unknown>();\n const reflowIds = new Set<NodeId>();\n for (const [cid, pose] of placed.destReflow) {\n const parent = scene.get(cid)?.parent ?? null;\n reflow.set(cid, rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(cid);\n }\n\n const leftovers = sourceReflow(session, dragged, container.id);\n for (const [cid, pose] of leftovers) {\n const parent = scene.get(asNodeId(cid))?.parent ?? null;\n reflow.set(asNodeId(cid), rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(asNodeId(cid));\n }\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n for (const [cid, pose] of [...placed.destReflow, ...leftovers] as [string, unknown][]) {\n for (const [id, carried] of reflowCarry(session, asNodeId(cid), pose, (d) => reflow.has(d) || draggedIds.has(d))) {\n reflow.set(id, carried);\n reflowIds.add(id);\n }\n }\n\n return {\n dropCenter,\n pass: { layout: dest.layout, container, placements: placed.placements, sourceReflow: leftovers, reflowIds },\n reflow,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dropPass.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/dropPass.ts"],"sourcesContent":["import { asNodeId, type NodeId } from 'core/scene/types';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose, rebaseLocalPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport { carriedDescendants, sceneCarrySource } from 'core/scene/carryDescendants';\nimport { poseDescriptorForNode, translatePoseViaDescriptor } from 'core/geometry/poseDescriptor';\nimport type { LayoutChild, LayoutContainer } from '../../../../layout/types';\nimport type { MoveSession } from '../session';\nimport { pickContainer, type Candidate } from './container';\nimport { carryDragged, gatherDragged, selectionCenter, type DraggedChild } from './dragged';\nimport type { DropPass, LayoutPlacement } from './types';\nimport { boxOf, containerView, draggedInView, pointInView } from './view';\n\n/** Dragged ids grouped by the container they are leaving, skipping any that\n * stay put (`exclude` is the destination) or that had no container. */\nexport function groupBySourceContainer(\n dragged: ReadonlyArray<{ id: NodeId; sourceContainerId: string | null }>,\n exclude: string | null,\n): Map<string, Set<NodeId>> {\n const out = new Map<string, Set<NodeId>>();\n for (const d of dragged) {\n const src = d.sourceContainerId;\n if (!src || src === exclude) continue;\n let set = out.get(src);\n if (!set) { set = new Set<NodeId>(); out.set(src, set); }\n set.add(d.id);\n }\n return out;\n}\n\n/** Place each dragged child in `dest` in turn. Null when the snap rejects\n * any of them: a container that cannot take every member takes none. */\nfunction placeAll(\n session: MoveSession,\n dest: Candidate,\n container: LayoutContainer,\n dragged: readonly DraggedChild[],\n probeOffset: { x: number; y: number },\n): { placements: LayoutPlacement[]; destReflow: Map<NodeId, unknown> } | null {\n const { scene, pc } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n const { layout, view } = dest;\n // The container state the placements run against, advanced by each one,\n // in the strategy's space.\n const working: LayoutChild<unknown>[] = scene.childrenOf(dest.id).map((cid) => ({\n id: cid as string,\n pose: view.toStrategy(composeWorldPose(poseAdapter, cid as string, pc.compose)),\n }));\n const setWorking = (id: string, pose: unknown): void => {\n const at = working.findIndex((c) => c.id === id);\n if (at >= 0) working[at] = { id, pose };\n else working.push({ id, pose });\n };\n\n const placements: LayoutPlacement[] = [];\n const destReflow = new Map<NodeId, unknown>();\n const destPlane = dest.plane;\n for (const edited of dragged) {\n const dc = carryDragged(session, edited, destPlane);\n const arg = draggedInView(view, dc.arg);\n const children = working.map((c) => ({ ...c }));\n const targets = layout.getDropTargets(container, children, arg);\n const probe = { x: edited.center.x + probeOffset.x, y: edited.center.y + probeOffset.y };\n const g = poseDescriptorForNode(session.projection, scene.get(edited.id)!);\n const at = pointInView(view, g, dc.arg.pose, destPlane ? toPlane(destPlane, probe) : probe);\n const target = layout.snap.pickTarget(targets, at);\n // All-or-nothing: a container that cannot take every member takes none\n // rather than splitting the selection between two homes.\n if (!target) return null;\n placements.push({ dragged: arg, children, target });\n const poses = layout.reflowPoses(container, children, arg, target);\n for (const [cid, pose] of poses) {\n setWorking(cid, pose);\n if (!draggedIds.has(asNodeId(cid))) destReflow.set(asNodeId(cid), view.toWorld(pose));\n }\n setWorking(arg.id, poses.get(arg.id) ?? target.pose);\n }\n return { placements, destReflow };\n}\n\n/** World poses of the leftovers that moved in each container the selection left. */\nfunction sourceReflow(\n session: MoveSession, dragged: readonly DraggedChild[], destId: string,\n): Map<string, unknown> {\n const { scene, pc, projection: d } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n // Source reflow (cross-container) → fold changed leftovers into previews.\n // One pass per container the selection left behind, with everything that\n // left it withdrawn at once.\n const sourceReflow = new Map<string, unknown>();\n const layoutDep = session.layout;\n if (!layoutDep) return sourceReflow;\n for (const [srcId, leaving] of groupBySourceContainer(dragged.map((c) => ({\n id: c.id,\n sourceContainerId: c.arg.sourceContainerId,\n })), destId)) {\n const srcLayout = layoutDep.getLayout(srcId);\n const srcNode = scene.get(asNodeId(srcId));\n if (!srcLayout || !srcNode) continue;\n const g = poseDescriptorForNode(d, srcNode);\n const view = containerView(pc, g, composeWorldPose(poseAdapter, srcId, pc.compose));\n const srcContainer: LayoutContainer = { id: srcId, bounds: boxOf(g, view.upright) };\n const srcChildren: LayoutChild<unknown>[] = scene.childrenOf(asNodeId(srcId))\n .filter((cid) => !leaving.has(cid))\n .map((cid) => ({\n id: cid as string,\n pose: view.toStrategy(composeWorldPose(poseAdapter, cid as string, pc.compose)),\n }));\n for (const [cid, placed] of srcLayout.childPoses(srcContainer, srcChildren)) {\n const pose = view.toWorld(placed);\n const cur = d.getBounds(composeWorldPose(poseAdapter, cid, pc.compose));\n const next = d.getBounds(pose);\n const same = cur.x === next.x && cur.y === next.y\n && cur.width === next.width && cur.height === next.height;\n if (same) continue;\n sourceReflow.set(cid, pose); // WORLD — rebased at each consumption point\n }\n }\n return sourceReflow;\n}\n\n/** The stored poses that bring `id`'s descendants along to `world`, where a reflow shows it. */\nfunction reflowCarry(\n session: MoveSession, id: NodeId, world: unknown, moving: (id: NodeId) => boolean,\n): Map<NodeId, unknown> {\n const { scene, pc, projection: d } = session;\n const a = d.getBounds(composeWorldPose(sceneViewPoseAdapter(scene), id as string, pc.compose));\n const b = d.getBounds(world);\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n if (dx === 0 && dy === 0) return new Map();\n return carriedDescendants(sceneCarrySource(scene), id, (pose) => translatePoseViaDescriptor(pose, dx, dy, d), moving);\n}\n\n/** One frame's layout result, or null with no layout dep or nothing dragged. */\nexport function runDropPass(\n session: MoveSession,\n delta: { dx: number; dy: number },\n pointer: { x: number; y: number },\n): DropPass | null {\n if (!session.layout) return null;\n const { scene, pc } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const dragged = gatherDragged(session, delta);\n if (dragged.length === 0) return null;\n const dropCenter = selectionCenter(session, dragged);\n // Each child is snapped at its own position, displaced by however far the\n // pointer sits from that center — the group keeps its shape, and a lone\n // child is still probed at the pointer itself.\n const probeOffset = {\n x: pointer.x - dropCenter.x,\n y: pointer.y - dropCenter.y,\n };\n\n const dest = pickContainer(session, dragged, dropCenter);\n if (!dest) return { dropCenter, pass: null, reflow: new Map() };\n if (dest.refused !== undefined) {\n return { dropCenter, pass: null, reflow: new Map(), refused: { id: dest.id, bounds: dest.bounds, reason: dest.refused } };\n }\n\n const container: LayoutContainer = { id: dest.id as string, bounds: dest.content };\n const placed = placeAll(session, dest, container, dragged, probeOffset);\n if (!placed) return { dropCenter, pass: null, reflow: new Map() };\n\n // Destination reflow → fold into previews (the dragged children keep their\n // pointer-following ghosts). `reflowPoses` returns world; previews are\n // local, so rebase to the child's current parent frame first.\n const reflow = new Map<NodeId, unknown>();\n const reflowIds = new Set<NodeId>();\n for (const [cid, pose] of placed.destReflow) {\n const parent = scene.get(cid)?.parent ?? null;\n reflow.set(cid, rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(cid);\n }\n\n const leftovers = sourceReflow(session, dragged, container.id);\n for (const [cid, pose] of leftovers) {\n const parent = scene.get(asNodeId(cid))?.parent ?? null;\n reflow.set(asNodeId(cid), rebaseLocalPose(poseAdapter, pose, parent, pc.compose, pc.decompose));\n reflowIds.add(asNodeId(cid));\n }\n const draggedIds = new Set<NodeId>(dragged.map((c) => c.id));\n for (const [cid, pose] of [...placed.destReflow, ...leftovers] as [string, unknown][]) {\n for (const [id, carried] of reflowCarry(session, asNodeId(cid), pose, (d) => reflow.has(d) || draggedIds.has(d))) {\n reflow.set(id, carried);\n reflowIds.add(id);\n }\n }\n\n return {\n dropCenter,\n pass: {\n layout: dest.layout, container, view: dest.view, placements: placed.placements, sourceReflow: leftovers, reflowIds,\n },\n reflow,\n };\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { toPlane } from "../../../../core/viewport/parallax.js";
2
2
  import { composeWorldPose } from "../../../../core/scene/composeFrame.js";
3
3
  import { poseDescriptorForNode } from "../../../../core/geometry/poseDescriptor.js";
4
- import { scenePoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
4
+ import { sceneViewPoseAdapter } from "../../../../core/scene/scenePoseAdapter.js";
5
5
  import { planeOf } from "../../planeInput.js";
6
6
  import { pointInBounds } from "./container.js";
7
7
 
@@ -18,7 +18,7 @@ function resolveLayoutExits(session, dropCenter, ids) {
18
18
  const center = dropCenter;
19
19
  if (!layoutDep || !center) return out;
20
20
  const { scene, pc, projection: d } = session;
21
- const poseAdapter = scenePoseAdapter(scene);
21
+ const poseAdapter = sceneViewPoseAdapter(scene);
22
22
  const excluded = /* @__PURE__ */ new Set([...session.ids, ...session.cascadeIds]);
23
23
  const holds = (id, layout) => {
24
24
  const node = scene.get(id);
@@ -1 +1 @@
1
- {"version":3,"file":"exits.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/exits.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { scenePoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutStrategy } from '../../../../layout/types';\nimport { planeOf } from '../../planeInput';\nimport type { MoveSession } from '../session';\nimport { pointInBounds } from './container';\n\n/** Where each dragged root that leaves its layout container on release lands.\n * A root leaves when the drop center falls outside the body of the layout\n * container holding it, and lands under the innermost plain container beneath\n * the drop that admits it (`canDropInto`) — a layout container there has\n * already declined it — or at the top level of its layer. A root whose parent\n * has no layout is not this pass's to move; `reparentOnDrop` decides for those. */\nexport function resolveLayoutExits(\n session: MoveSession, dropCenter: { x: number; y: number } | null, ids: Iterable<NodeId>,\n): Map<NodeId, NodeId | null> {\n const out = new Map<NodeId, NodeId | null>();\n const layoutDep = session.layout;\n const center = dropCenter;\n if (!layoutDep || !center) return out;\n const { scene, pc, projection: d } = session;\n const poseAdapter = scenePoseAdapter(scene);\n const excluded = new Set<NodeId>([...session.ids, ...session.cascadeIds]);\n const holds = (id: NodeId, layout: LayoutStrategy<unknown> | null): boolean => {\n const node = scene.get(id)!;\n const plane = planeOf(session.view, node.layer);\n const at = plane ? toPlane(plane, center) : center;\n const pose = composeWorldPose(poseAdapter, id as string, pc.compose);\n if (layout?.contains) return layout.contains(pose, at);\n const b = poseDescriptorForNode(d, node).getBounds(pose);\n return pointInBounds(b, at);\n };\n const landings = new Map<string, NodeId | null>();\n const landingOn = (layer: string): NodeId | null => {\n if (landings.has(layer)) return landings.get(layer)!;\n // Deepest wins; among equals, the later sibling (painted over the other).\n let best: NodeId | null = null;\n let bestDepth = -1;\n const walk = (parentId: NodeId | null, depth: number): void => {\n for (const id of parentId === null ? scene.roots : scene.childrenOf(parentId)) {\n if (excluded.has(id)) continue;\n const node = scene.get(id);\n if (!node) continue;\n if (node.layer === layer && depth >= bestDepth\n && layoutDep.getLayout(id as string) === null && holds(id, null) && session.admits(id)) {\n best = id;\n bestDepth = depth;\n }\n walk(id, depth + 1);\n }\n };\n walk(null, 0);\n landings.set(layer, best);\n return best;\n };\n for (const id of ids) {\n const node = scene.get(id);\n const parent = node?.parent ?? null;\n if (!node || parent === null) continue;\n const layout = layoutDep.getLayout(parent as string);\n if (!layout || holds(parent, layout)) continue;\n out.set(id, landingOn(node.layer));\n }\n return out;\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,mBACd,SAAsB,YAA6C,KACvC;CAC5B,MAAM,sBAAM,IAAI,IAA2B;CAC3C,MAAM,YAAY,QAAQ;CAC1B,MAAM,SAAS;CACf,IAAI,CAAC,aAAa,CAAC,QAAQ,OAAO;CAClC,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,cAAc,iBAAiB,KAAK;CAC1C,MAAM,2BAAW,IAAI,IAAY,CAAC,GAAG,QAAQ,KAAK,GAAG,QAAQ,UAAU,CAAC;CACxE,MAAM,SAAS,IAAY,WAAoD;EAC7E,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,QAAQ,QAAQ,QAAQ,MAAM,KAAK,KAAK;EAC9C,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM,IAAI;EAC5C,MAAM,OAAO,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACnE,IAAI,QAAQ,UAAU,OAAO,OAAO,SAAS,MAAM,EAAE;EACrD,MAAM,IAAI,sBAAsB,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI;EACvD,OAAO,cAAc,GAAG,EAAE;CAC5B;CACA,MAAM,2BAAW,IAAI,IAA2B;CAChD,MAAM,aAAa,UAAiC;EAClD,IAAI,SAAS,IAAI,KAAK,GAAG,OAAO,SAAS,IAAI,KAAK;EAElD,IAAI,OAAsB;EAC1B,IAAI,YAAY;EAChB,MAAM,QAAQ,UAAyB,UAAwB;GAC7D,KAAK,MAAM,MAAM,aAAa,OAAO,MAAM,QAAQ,MAAM,WAAW,QAAQ,GAAG;IAC7E,IAAI,SAAS,IAAI,EAAE,GAAG;IACtB,MAAM,OAAO,MAAM,IAAI,EAAE;IACzB,IAAI,CAAC,MAAM;IACX,IAAI,KAAK,UAAU,SAAS,SAAS,aAChC,UAAU,UAAU,EAAY,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,QAAQ,OAAO,EAAE,GAAG;KACxF,OAAO;KACP,YAAY;IACd;IACA,KAAK,IAAI,QAAQ,CAAC;GACpB;EACF;EACA,KAAK,MAAM,CAAC;EACZ,SAAS,IAAI,OAAO,IAAI;EACxB,OAAO;CACT;CACA,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,SAAS,MAAM,UAAU;EAC/B,IAAI,CAAC,QAAQ,WAAW,MAAM;EAC9B,MAAM,SAAS,UAAU,UAAU,MAAgB;EACnD,IAAI,CAAC,UAAU,MAAM,QAAQ,MAAM,GAAG;EACtC,IAAI,IAAI,IAAI,UAAU,KAAK,KAAK,CAAC;CACnC;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"exits.js","names":[],"sources":["../../../../../src/interactions/actions/move/layout/exits.ts"],"sourcesContent":["import type { NodeId } from 'core/scene/types';\nimport { poseDescriptorForNode } from 'core/geometry/poseDescriptor';\nimport { toPlane } from 'core/viewport/parallax';\nimport { composeWorldPose } from 'core/scene/composePose';\nimport { sceneViewPoseAdapter } from 'core/scene/scenePoseAdapter';\nimport type { LayoutStrategy } from '../../../../layout/types';\nimport { planeOf } from '../../planeInput';\nimport type { MoveSession } from '../session';\nimport { pointInBounds } from './container';\n\n/** Where each dragged root that leaves its layout container on release lands.\n * A root leaves when the drop center falls outside the body of the layout\n * container holding it, and lands under the innermost plain container beneath\n * the drop that admits it (`canDropInto`) — a layout container there has\n * already declined it — or at the top level of its layer. A root whose parent\n * has no layout is not this pass's to move; `reparentOnDrop` decides for those. */\nexport function resolveLayoutExits(\n session: MoveSession, dropCenter: { x: number; y: number } | null, ids: Iterable<NodeId>,\n): Map<NodeId, NodeId | null> {\n const out = new Map<NodeId, NodeId | null>();\n const layoutDep = session.layout;\n const center = dropCenter;\n if (!layoutDep || !center) return out;\n const { scene, pc, projection: d } = session;\n const poseAdapter = sceneViewPoseAdapter(scene);\n const excluded = new Set<NodeId>([...session.ids, ...session.cascadeIds]);\n const holds = (id: NodeId, layout: LayoutStrategy<unknown> | null): boolean => {\n const node = scene.get(id)!;\n const plane = planeOf(session.view, node.layer);\n const at = plane ? toPlane(plane, center) : center;\n const pose = composeWorldPose(poseAdapter, id as string, pc.compose);\n if (layout?.contains) return layout.contains(pose, at);\n const b = poseDescriptorForNode(d, node).getBounds(pose);\n return pointInBounds(b, at);\n };\n const landings = new Map<string, NodeId | null>();\n const landingOn = (layer: string): NodeId | null => {\n if (landings.has(layer)) return landings.get(layer)!;\n // Deepest wins; among equals, the later sibling (painted over the other).\n let best: NodeId | null = null;\n let bestDepth = -1;\n const walk = (parentId: NodeId | null, depth: number): void => {\n for (const id of parentId === null ? scene.roots : scene.childrenOf(parentId)) {\n if (excluded.has(id)) continue;\n const node = scene.get(id);\n if (!node) continue;\n if (node.layer === layer && depth >= bestDepth\n && layoutDep.getLayout(id as string) === null && holds(id, null) && session.admits(id)) {\n best = id;\n bestDepth = depth;\n }\n walk(id, depth + 1);\n }\n };\n walk(null, 0);\n landings.set(layer, best);\n return best;\n };\n for (const id of ids) {\n const node = scene.get(id);\n const parent = node?.parent ?? null;\n if (!node || parent === null) continue;\n const layout = layoutDep.getLayout(parent as string);\n if (!layout || holds(parent, layout)) continue;\n out.set(id, landingOn(node.layer));\n }\n return out;\n}\n"],"mappings":";;;;;;;;;;;;;;AAgBA,SAAgB,mBACd,SAAsB,YAA6C,KACvC;CAC5B,MAAM,sBAAM,IAAI,IAA2B;CAC3C,MAAM,YAAY,QAAQ;CAC1B,MAAM,SAAS;CACf,IAAI,CAAC,aAAa,CAAC,QAAQ,OAAO;CAClC,MAAM,EAAE,OAAO,IAAI,YAAY,MAAM;CACrC,MAAM,cAAc,qBAAqB,KAAK;CAC9C,MAAM,2BAAW,IAAI,IAAY,CAAC,GAAG,QAAQ,KAAK,GAAG,QAAQ,UAAU,CAAC;CACxE,MAAM,SAAS,IAAY,WAAoD;EAC7E,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,QAAQ,QAAQ,QAAQ,MAAM,KAAK,KAAK;EAC9C,MAAM,KAAK,QAAQ,QAAQ,OAAO,MAAM,IAAI;EAC5C,MAAM,OAAO,iBAAiB,aAAa,IAAc,GAAG,OAAO;EACnE,IAAI,QAAQ,UAAU,OAAO,OAAO,SAAS,MAAM,EAAE;EACrD,MAAM,IAAI,sBAAsB,GAAG,IAAI,CAAC,CAAC,UAAU,IAAI;EACvD,OAAO,cAAc,GAAG,EAAE;CAC5B;CACA,MAAM,2BAAW,IAAI,IAA2B;CAChD,MAAM,aAAa,UAAiC;EAClD,IAAI,SAAS,IAAI,KAAK,GAAG,OAAO,SAAS,IAAI,KAAK;EAElD,IAAI,OAAsB;EAC1B,IAAI,YAAY;EAChB,MAAM,QAAQ,UAAyB,UAAwB;GAC7D,KAAK,MAAM,MAAM,aAAa,OAAO,MAAM,QAAQ,MAAM,WAAW,QAAQ,GAAG;IAC7E,IAAI,SAAS,IAAI,EAAE,GAAG;IACtB,MAAM,OAAO,MAAM,IAAI,EAAE;IACzB,IAAI,CAAC,MAAM;IACX,IAAI,KAAK,UAAU,SAAS,SAAS,aAChC,UAAU,UAAU,EAAY,MAAM,QAAQ,MAAM,IAAI,IAAI,KAAK,QAAQ,OAAO,EAAE,GAAG;KACxF,OAAO;KACP,YAAY;IACd;IACA,KAAK,IAAI,QAAQ,CAAC;GACpB;EACF;EACA,KAAK,MAAM,CAAC;EACZ,SAAS,IAAI,OAAO,IAAI;EACxB,OAAO;CACT;CACA,KAAK,MAAM,MAAM,KAAK;EACpB,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,MAAM,SAAS,MAAM,UAAU;EAC/B,IAAI,CAAC,QAAQ,WAAW,MAAM;EAC9B,MAAM,SAAS,UAAU,UAAU,MAAgB;EACnD,IAAI,CAAC,UAAU,MAAM,QAAQ,MAAM,GAAG;EACtC,IAAI,IAAI,IAAI,UAAU,KAAK,KAAK,CAAC;CACnC;CACA,OAAO;AACT"}