@weasel-js/core 1.9.3 → 1.10.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 (1139) hide show
  1. package/CHANGELOG.md +1106 -0
  2. package/README.md +7 -5
  3. package/dist/WeaselProvider.js +5 -7
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +91 -93
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  7. package/dist/affordances/cornerResize.js +27 -18
  8. package/dist/affordances/cornerResize.js.map +1 -1
  9. package/dist/affordances/hitAffordanceRegions.js +65 -104
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js.map +1 -1
  12. package/dist/affordances/rotationHandle.js +22 -21
  13. package/dist/affordances/rotationHandle.js.map +1 -1
  14. package/dist/animation/behaviors/coast.js +21 -0
  15. package/dist/animation/behaviors/coast.js.map +1 -0
  16. package/dist/animation/behaviors/coastByWrite.js +107 -0
  17. package/dist/animation/behaviors/coastByWrite.js.map +1 -0
  18. package/dist/animation/behaviors/coastOnTargets.js +94 -0
  19. package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
  20. package/dist/animation/behaviors/momentum.js +38 -88
  21. package/dist/animation/behaviors/momentum.js.map +1 -1
  22. package/dist/animation/clipTargets.js +12 -0
  23. package/dist/animation/clipTargets.js.map +1 -0
  24. package/dist/animation/index.js +15 -20
  25. package/dist/animation/poseHelpers.js +112 -33
  26. package/dist/animation/poseHelpers.js.map +1 -1
  27. package/dist/animation/poseTarget.js +115 -0
  28. package/dist/animation/poseTarget.js.map +1 -0
  29. package/dist/animation/reflow.js +113 -83
  30. package/dist/animation/reflow.js.map +1 -1
  31. package/dist/animation/rewind.js +66 -0
  32. package/dist/animation/rewind.js.map +1 -0
  33. package/dist/animation/rig/bindRig.js +85 -53
  34. package/dist/animation/rig/bindRig.js.map +1 -1
  35. package/dist/animation/rig/rigNode.js +93 -0
  36. package/dist/animation/rig/rigNode.js.map +1 -0
  37. package/dist/animation/rig/rigSeat.js +26 -0
  38. package/dist/animation/rig/rigSeat.js.map +1 -0
  39. package/dist/animation/rig/skinBinding.js +56 -0
  40. package/dist/animation/rig/skinBinding.js.map +1 -0
  41. package/dist/animation/rig/useRig.js +31 -16
  42. package/dist/animation/rig/useRig.js.map +1 -1
  43. package/dist/animation/wrappers/animateLifecycle.js +32 -24
  44. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  45. package/dist/animation/wrappers/animateOnSetPose.js +31 -29
  46. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  47. package/dist/animation/wrappers/instantPose.js +13 -0
  48. package/dist/animation/wrappers/instantPose.js.map +1 -0
  49. package/dist/animation/writtenPoseTarget.js +33 -0
  50. package/dist/animation/writtenPoseTarget.js.map +1 -0
  51. package/dist/{autoPoseDescriptor-vCdt55xm.d.ts → autoPoseDescriptor-DHg5KqaJ.d.ts} +1 -1
  52. package/dist/barrel/canvas.js +31 -0
  53. package/dist/barrel/chrome.js +16 -0
  54. package/dist/barrel/input.js +18 -0
  55. package/dist/barrel/interactions.js +38 -0
  56. package/dist/barrel/paint.js +11 -0
  57. package/dist/barrel/paths.js +12 -0
  58. package/dist/barrel/renderer.js +14 -0
  59. package/dist/barrel/routing.js +57 -0
  60. package/dist/barrel/scene.js +37 -0
  61. package/dist/barrel/text.js +9 -0
  62. package/dist/barrel/viewport.js +42 -0
  63. package/dist/canvas/Canvas.js +280 -559
  64. package/dist/canvas/Canvas.js.map +1 -1
  65. package/dist/canvas/CanvasView.js +147 -167
  66. package/dist/canvas/CanvasView.js.map +1 -1
  67. package/dist/canvas/CursorCoordsHud.js +53 -49
  68. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  69. package/dist/canvas/DrawCanvas.js +40 -51
  70. package/dist/canvas/DrawCanvas.js.map +1 -1
  71. package/dist/canvas/ModalityHud.js.map +1 -1
  72. package/dist/canvas/NodeShape.js +55 -374
  73. package/dist/canvas/NodeShape.js.map +1 -1
  74. package/dist/canvas/PickHud.js +50 -47
  75. package/dist/canvas/PickHud.js.map +1 -1
  76. package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
  77. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
  78. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +126 -0
  79. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
  81. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  82. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +64 -0
  83. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -0
  84. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +16 -0
  85. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -0
  86. package/dist/canvas/SceneCanvas/coordTrace.js +46 -0
  87. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -0
  88. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +138 -85
  89. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  90. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +9 -8
  91. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  92. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/features.js +74 -43
  94. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  95. package/dist/canvas/SceneCanvas/isDev.js +12 -0
  96. package/dist/canvas/SceneCanvas/isDev.js.map +1 -0
  97. package/dist/canvas/SceneCanvas/poseGeometry.js +31 -34
  98. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  99. package/dist/canvas/SceneCanvas/poseRegistrars.js +13 -0
  100. package/dist/canvas/SceneCanvas/poseRegistrars.js.map +1 -0
  101. package/dist/canvas/SceneCanvas/props.js +39 -0
  102. package/dist/canvas/SceneCanvas/props.js.map +1 -0
  103. package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
  104. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
  106. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  107. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +21 -62
  108. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  109. package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
  110. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
  112. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
  113. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
  114. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
  115. package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
  116. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
  117. package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
  118. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
  119. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
  120. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  121. package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
  122. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
  123. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
  124. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
  125. package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
  126. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
  127. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +48 -48
  128. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  129. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
  130. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
  131. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
  132. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
  133. package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
  134. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
  135. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
  136. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
  137. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +74 -78
  138. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  139. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
  140. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
  141. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
  142. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
  143. package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
  144. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
  145. package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
  146. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  147. package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
  148. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
  149. package/dist/canvas/SceneCanvas.js +311 -969
  150. package/dist/canvas/SceneCanvas.js.map +1 -1
  151. package/dist/canvas/SceneViewCanvas.js +42 -46
  152. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  153. package/dist/canvas/adapterDerivedPath.js +26 -0
  154. package/dist/canvas/adapterDerivedPath.js.map +1 -0
  155. package/dist/canvas/affordanceAt.js +11 -1
  156. package/dist/canvas/affordanceAt.js.map +1 -1
  157. package/dist/canvas/buildSceneLayer.js +111 -0
  158. package/dist/canvas/buildSceneLayer.js.map +1 -0
  159. package/dist/canvas/buildSceneTree.js +16 -19
  160. package/dist/canvas/buildSceneTree.js.map +1 -1
  161. package/dist/canvas/canvasRenderer.js +67 -55
  162. package/dist/canvas/canvasRenderer.js.map +1 -1
  163. package/dist/canvas/colorOverrides.js.map +1 -1
  164. package/dist/canvas/defaultDrawOne.js +12 -12
  165. package/dist/canvas/defaultDrawOne.js.map +1 -1
  166. package/dist/canvas/deps/areaSelect.js +4 -4
  167. package/dist/canvas/deps/areaSelect.js.map +1 -1
  168. package/dist/canvas/deps/changes.js +13 -0
  169. package/dist/canvas/deps/changes.js.map +1 -0
  170. package/dist/canvas/deps/debug.js.map +1 -1
  171. package/dist/canvas/deps/editAnchors.js +38 -57
  172. package/dist/canvas/deps/editAnchors.js.map +1 -1
  173. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  174. package/dist/canvas/deps/hitTestArea.js +31 -26
  175. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  176. package/dist/canvas/deps/insert.js +130 -91
  177. package/dist/canvas/deps/insert.js.map +1 -1
  178. package/dist/canvas/deps/lassoSelect.js +5 -5
  179. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  180. package/dist/canvas/deps/poseDescriptor.js +1 -1
  181. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  182. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  183. package/dist/canvas/deps/slice.js +26 -26
  184. package/dist/canvas/deps/slice.js.map +1 -1
  185. package/dist/canvas/deps/textEdit.js +6 -5
  186. package/dist/canvas/deps/textEdit.js.map +1 -1
  187. package/dist/canvas/deps/view.js.map +1 -1
  188. package/dist/canvas/derivedPath.js +47 -22
  189. package/dist/canvas/derivedPath.js.map +1 -1
  190. package/dist/canvas/drawEnvelope.js +8 -4
  191. package/dist/canvas/drawEnvelope.js.map +1 -1
  192. package/dist/canvas/getNodeAtPoint.js +4 -8
  193. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  194. package/dist/canvas/hud.module.js +1 -1
  195. package/dist/canvas/hud.module.js.map +1 -1
  196. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  197. package/dist/canvas/kitRequirements.js +2 -2
  198. package/dist/canvas/kitRequirements.js.map +1 -1
  199. package/dist/canvas/layerOrder.js +13 -6
  200. package/dist/canvas/layerOrder.js.map +1 -1
  201. package/dist/canvas/layerSlots.js +6 -1
  202. package/dist/canvas/layerSlots.js.map +1 -1
  203. package/dist/canvas/nodeShapes/derivedPainter.js +34 -0
  204. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -0
  205. package/dist/canvas/nodeShapes/imagePainter.js +87 -0
  206. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -0
  207. package/dist/canvas/nodeShapes/memo.js +9 -0
  208. package/dist/canvas/nodeShapes/memo.js.map +1 -0
  209. package/dist/canvas/nodeShapes/nodePaint.js +68 -0
  210. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -0
  211. package/dist/canvas/nodeShapes/pathPainter.js +39 -0
  212. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -0
  213. package/dist/canvas/nodeShapes/poseBox.js +20 -0
  214. package/dist/canvas/nodeShapes/poseBox.js.map +1 -0
  215. package/dist/canvas/nodeShapes/rectFallbackPainter.js +38 -0
  216. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -0
  217. package/dist/canvas/nodeShapes/shapePainter.js +72 -0
  218. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -0
  219. package/dist/canvas/nodeShapes/textPainter.js +55 -0
  220. package/dist/canvas/nodeShapes/textPainter.js.map +1 -0
  221. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  222. package/dist/canvas/paintCull.js +11 -14
  223. package/dist/canvas/paintCull.js.map +1 -1
  224. package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
  225. package/dist/canvas/paintedCursorLayer.js.map +1 -0
  226. package/dist/canvas/pickWalk.js +59 -68
  227. package/dist/canvas/pickWalk.js.map +1 -1
  228. package/dist/canvas/planeClips.js +18 -19
  229. package/dist/canvas/planeClips.js.map +1 -1
  230. package/dist/canvas/poseCascade.js +41 -0
  231. package/dist/canvas/poseCascade.js.map +1 -0
  232. package/dist/canvas/poseRotation.js +9 -23
  233. package/dist/canvas/poseRotation.js.map +1 -1
  234. package/dist/canvas/rasterReadback.js +22 -0
  235. package/dist/canvas/rasterReadback.js.map +1 -0
  236. package/dist/canvas/renderDebugSnapshot.js +11 -11
  237. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  238. package/dist/canvas/renderNeeds.js +3 -3
  239. package/dist/canvas/renderNeeds.js.map +1 -1
  240. package/dist/canvas/renderSceneToPixels.js +64 -81
  241. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  242. package/dist/canvas/sceneAdapter.js +68 -214
  243. package/dist/canvas/sceneAdapter.js.map +1 -1
  244. package/dist/canvas/sceneClipboard.js +112 -0
  245. package/dist/canvas/sceneClipboard.js.map +1 -0
  246. package/dist/canvas/sceneLayerPaint.js +4 -4
  247. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  248. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  249. package/dist/canvas/sceneViewRender.js +39 -39
  250. package/dist/canvas/sceneViewRender.js.map +1 -1
  251. package/dist/canvas/slopsDebugLayer.js +4 -4
  252. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  253. package/dist/canvas/surface.module.js +6 -0
  254. package/dist/canvas/surface.module.js.map +1 -0
  255. package/dist/canvas/surfaceBox.js +16 -0
  256. package/dist/canvas/surfaceBox.js.map +1 -0
  257. package/dist/canvas/useCanvasRenderer.js +26 -6
  258. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  259. package/dist/canvas/useCanvasSurface.js +31 -0
  260. package/dist/canvas/useCanvasSurface.js.map +1 -0
  261. package/dist/canvas/useCanvasView.js +67 -0
  262. package/dist/canvas/useCanvasView.js.map +1 -0
  263. package/dist/canvas/useFrameLoop.js +39 -31
  264. package/dist/canvas/useFrameLoop.js.map +1 -1
  265. package/dist/canvas/useHostAnchor.js +35 -33
  266. package/dist/canvas/useHostAnchor.js.map +1 -1
  267. package/dist/canvas/useLateContentRedraw.js +8 -8
  268. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  269. package/dist/canvas/useSceneLayerList.js +11 -0
  270. package/dist/canvas/useSceneLayerList.js.map +1 -0
  271. package/dist/canvas/useSurfaceInput.js +42 -0
  272. package/dist/canvas/useSurfaceInput.js.map +1 -0
  273. package/dist/canvas/useToolCursor.js +29 -0
  274. package/dist/canvas/useToolCursor.js.map +1 -0
  275. package/dist/canvas/useViewHelpers.js +46 -85
  276. package/dist/canvas/useViewHelpers.js.map +1 -1
  277. package/dist/canvas/viewInputs.js.map +1 -1
  278. package/dist/canvas/viewRegistry.js +25 -27
  279. package/dist/canvas/viewRegistry.js.map +1 -1
  280. package/dist/canvas/watchElementMove.js +43 -0
  281. package/dist/canvas/watchElementMove.js.map +1 -0
  282. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  283. package/dist/clipboard.d.ts +16 -19
  284. package/dist/{types-B_9g6hMM.d.ts → clone-2a5hVbBd.d.ts} +123 -74
  285. package/dist/clone.d.ts +4 -7
  286. package/dist/clone.js +0 -2
  287. package/dist/core/device/index.js +5 -4
  288. package/dist/core/device/targets.js.map +1 -1
  289. package/dist/core/device/useDeviceProfile.js +38 -44
  290. package/dist/core/device/useDeviceProfile.js.map +1 -1
  291. package/dist/core/device/watchDevicePixelRatio.js +17 -0
  292. package/dist/core/device/watchDevicePixelRatio.js.map +1 -0
  293. package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
  294. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
  295. package/dist/core/geometry/pathPoseDescriptor.js +88 -0
  296. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
  297. package/dist/core/geometry/poseDescriptor.js +68 -19
  298. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  299. package/dist/core/geometry/regionHit.js +31 -34
  300. package/dist/core/geometry/regionHit.js.map +1 -1
  301. package/dist/core/geometry/targetFrame.js +94 -0
  302. package/dist/core/geometry/targetFrame.js.map +1 -0
  303. package/dist/core/geometry/unionBounds.js +30 -29
  304. package/dist/core/geometry/unionBounds.js.map +1 -1
  305. package/dist/core/isPlainObject.js +2 -11
  306. package/dist/core/layers/backgroundFill.js +31 -0
  307. package/dist/core/layers/backgroundFill.js.map +1 -0
  308. package/dist/{features/groups → core/layers}/children.js +1 -1
  309. package/dist/core/layers/children.js.map +1 -0
  310. package/dist/core/layers/gateLayer.js +13 -0
  311. package/dist/core/layers/gateLayer.js.map +1 -0
  312. package/dist/core/layers/layerGroup.js +40 -0
  313. package/dist/core/layers/layerGroup.js.map +1 -0
  314. package/dist/core/layers/render.js +50 -76
  315. package/dist/core/layers/render.js.map +1 -1
  316. package/dist/core/ops/arrange.js +1 -0
  317. package/dist/core/ops/arrange.js.map +1 -1
  318. package/dist/core/ops/create.js +10 -5
  319. package/dist/core/ops/create.js.map +1 -1
  320. package/dist/core/ops/createHistory.js +9 -9
  321. package/dist/core/ops/createHistory.js.map +1 -1
  322. package/dist/core/ops/delete.js +12 -24
  323. package/dist/core/ops/delete.js.map +1 -1
  324. package/dist/core/ops/reorder/index.js +43 -40
  325. package/dist/core/ops/reorder/index.js.map +1 -1
  326. package/dist/core/ops/reorder/setChildOrder.js +34 -0
  327. package/dist/core/ops/reorder/setChildOrder.js.map +1 -0
  328. package/dist/core/paint/meshKind.js +16 -0
  329. package/dist/core/paint/meshKind.js.map +1 -0
  330. package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +282 -105
  331. package/dist/core/paint/meshKindLazy.js.map +1 -0
  332. package/dist/core/paint/paintKindEntry.js +8 -0
  333. package/dist/core/paint/paintKindEntry.js.map +1 -0
  334. package/dist/core/paint/paintKinds.js +144 -0
  335. package/dist/core/paint/paintKinds.js.map +1 -0
  336. package/dist/core/paint/registerMesh.js +7 -0
  337. package/dist/core/paint/registerMesh.js.map +1 -0
  338. package/dist/core/scene/NodeProperties.js.map +1 -1
  339. package/dist/core/scene/NodeRouting.js.map +1 -1
  340. package/dist/core/scene/appliedLog.js +37 -0
  341. package/dist/core/scene/appliedLog.js.map +1 -0
  342. package/dist/core/scene/arrivalWindow.js +102 -0
  343. package/dist/core/scene/arrivalWindow.js.map +1 -0
  344. package/dist/core/scene/boundOps.js +40 -0
  345. package/dist/core/scene/boundOps.js.map +1 -0
  346. package/dist/core/scene/composeFrame.js +9 -6
  347. package/dist/core/scene/composeFrame.js.map +1 -1
  348. package/dist/{features/groups → core/scene}/composePose.js +18 -18
  349. package/dist/core/scene/composePose.js.map +1 -0
  350. package/dist/core/scene/depMemo.js +31 -6
  351. package/dist/core/scene/depMemo.js.map +1 -1
  352. package/dist/core/scene/derivedPath.js +19 -20
  353. package/dist/core/scene/derivedPath.js.map +1 -1
  354. package/dist/core/scene/editMode.js +26 -0
  355. package/dist/core/scene/editMode.js.map +1 -0
  356. package/dist/core/scene/effectivePose.js +38 -39
  357. package/dist/core/scene/effectivePose.js.map +1 -1
  358. package/dist/core/scene/fieldEdits.js +98 -0
  359. package/dist/core/scene/fieldEdits.js.map +1 -0
  360. package/dist/core/scene/historyFacade.js +130 -0
  361. package/dist/core/scene/historyFacade.js.map +1 -0
  362. package/dist/core/scene/historyForm.js +6 -0
  363. package/dist/core/scene/historyForm.js.map +1 -0
  364. package/dist/core/scene/kitOps.js +185 -0
  365. package/dist/core/scene/kitOps.js.map +1 -0
  366. package/dist/core/scene/kitRegistry.js.map +1 -1
  367. package/dist/core/scene/layerStack.js +131 -0
  368. package/dist/core/scene/layerStack.js.map +1 -0
  369. package/dist/core/scene/layoutPass.js +58 -59
  370. package/dist/core/scene/layoutPass.js.map +1 -1
  371. package/dist/core/scene/lockGuard.js +37 -0
  372. package/dist/core/scene/lockGuard.js.map +1 -0
  373. package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
  374. package/dist/core/scene/nestedHit.js.map +1 -0
  375. package/dist/core/scene/nodeFnFields.js +10 -11
  376. package/dist/core/scene/nodeFnFields.js.map +1 -1
  377. package/dist/core/scene/nodeMemo.js +45 -19
  378. package/dist/core/scene/nodeMemo.js.map +1 -1
  379. package/dist/core/scene/nodeStore.js +127 -0
  380. package/dist/core/scene/nodeStore.js.map +1 -0
  381. package/dist/core/scene/notifier.js +37 -0
  382. package/dist/core/scene/notifier.js.map +1 -0
  383. package/dist/core/scene/opTable.js +50 -0
  384. package/dist/core/scene/opTable.js.map +1 -0
  385. package/dist/core/scene/outerOps.js +66 -0
  386. package/dist/core/scene/outerOps.js.map +1 -0
  387. package/dist/core/scene/poseFeed.js +38 -38
  388. package/dist/core/scene/poseFeed.js.map +1 -1
  389. package/dist/core/scene/poseHold.js +39 -0
  390. package/dist/core/scene/poseHold.js.map +1 -0
  391. package/dist/core/scene/poseOverrides.js +44 -40
  392. package/dist/core/scene/poseOverrides.js.map +1 -1
  393. package/dist/core/scene/poseSnapshot.js.map +1 -1
  394. package/dist/core/scene/reconcileSpecs.js +3 -2
  395. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  396. package/dist/core/scene/recorder.js +86 -0
  397. package/dist/core/scene/recorder.js.map +1 -0
  398. package/dist/core/scene/renderOrder.js +84 -0
  399. package/dist/core/scene/renderOrder.js.map +1 -0
  400. package/dist/core/scene/scene.js +80 -1266
  401. package/dist/core/scene/scene.js.map +1 -1
  402. package/dist/core/scene/sceneEdits.js +58 -0
  403. package/dist/core/scene/sceneEdits.js.map +1 -0
  404. package/dist/core/scene/sceneMutators.js +49 -0
  405. package/dist/core/scene/sceneMutators.js.map +1 -0
  406. package/dist/core/scene/scenePoseAdapter.js +16 -0
  407. package/dist/core/scene/scenePoseAdapter.js.map +1 -0
  408. package/dist/core/scene/sceneRecording.js +90 -0
  409. package/dist/core/scene/sceneRecording.js.map +1 -0
  410. package/dist/core/scene/sceneSelection.js +28 -0
  411. package/dist/core/scene/sceneSelection.js.map +1 -0
  412. package/dist/core/scene/sceneState.js +49 -0
  413. package/dist/core/scene/sceneState.js.map +1 -0
  414. package/dist/core/scene/serialization.js +71 -0
  415. package/dist/core/scene/serialization.js.map +1 -0
  416. package/dist/core/scene/staleReplay.js +51 -0
  417. package/dist/core/scene/staleReplay.js.map +1 -0
  418. package/dist/core/scene/statedFields.js +9 -0
  419. package/dist/core/scene/statedFields.js.map +1 -0
  420. package/dist/core/scene/treeEdits.js +127 -0
  421. package/dist/core/scene/treeEdits.js.map +1 -0
  422. package/dist/core/scene/treeOrder.js +13 -0
  423. package/dist/core/scene/treeOrder.js.map +1 -0
  424. package/dist/core/scene/treeReads.js +26 -0
  425. package/dist/core/scene/treeReads.js.map +1 -0
  426. package/dist/core/scene/types.js.map +1 -1
  427. package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
  428. package/dist/core/scene/unionOfChildren.js.map +1 -0
  429. package/dist/core/scene/unitScopes.js +13 -0
  430. package/dist/core/scene/unitScopes.js.map +1 -0
  431. package/dist/core/scene/useScene.js.map +1 -1
  432. package/dist/core/selection/readOnlySelection.js +32 -0
  433. package/dist/core/selection/readOnlySelection.js.map +1 -0
  434. package/dist/core/selection/usePublishSceneSelection.js +26 -0
  435. package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
  436. package/dist/core/selection/useSelection.js +34 -25
  437. package/dist/core/selection/useSelection.js.map +1 -1
  438. package/dist/core/shapeKinds.js.map +1 -1
  439. package/dist/core/stylus/stylus.js.map +1 -1
  440. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  441. package/dist/core/usePaintKinds.js +1 -1
  442. package/dist/core/usePaintKinds.js.map +1 -1
  443. package/dist/core/viewport/clientToWorld.js.map +1 -1
  444. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  445. package/dist/core/viewport/parallax.js.map +1 -1
  446. package/dist/core/viewport/screenSlop.js +11 -11
  447. package/dist/core/viewport/screenSlop.js.map +1 -1
  448. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  449. package/dist/core/viewport/useDecayLoop.js +8 -8
  450. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  451. package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
  452. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
  453. package/dist/core/viewport/useViewAnimation.js +102 -43
  454. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  455. package/dist/core/viewport/view.js +9 -9
  456. package/dist/core/viewport/view.js.map +1 -1
  457. package/dist/core/viewport/wheelHandler.js.map +1 -1
  458. package/dist/core/viewport/zoomBounds.js +10 -8
  459. package/dist/core/viewport/zoomBounds.js.map +1 -1
  460. package/dist/{cornerHandles-BCrDp_mH.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
  461. package/dist/debug/createDebugOverlayLayer.js +97 -97
  462. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  463. package/dist/debug/createDebugSink.js.map +1 -1
  464. package/dist/debug/flag.js +2 -41
  465. package/dist/debug/frameStats.js.map +1 -1
  466. package/dist/debug/useDebugSink.js +52 -0
  467. package/dist/debug/useDebugSink.js.map +1 -0
  468. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  469. package/dist/features/chrome-caps/conditions.js.map +1 -1
  470. package/dist/features/chrome-caps/defaults.js.map +1 -1
  471. package/dist/features/chrome-caps/resolve.js.map +1 -1
  472. package/dist/features/chrome-caps/useChromeCaps.js +54 -0
  473. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
  474. package/dist/features/chrome-caps/useHoverTracking.js +22 -17
  475. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  476. package/dist/features/ingestion/contentHandlers.js +28 -19
  477. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  478. package/dist/features/ingestion/imageHandler.js +21 -24
  479. package/dist/features/ingestion/imageHandler.js.map +1 -1
  480. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  481. package/dist/features/ingestion/placement.js +16 -0
  482. package/dist/features/ingestion/placement.js.map +1 -0
  483. package/dist/features/ingestion/registerKitHandlers.js +7 -7
  484. package/dist/features/ingestion/svgHandler.js +5 -0
  485. package/dist/features/ingestion/svgHandler.js.map +1 -1
  486. package/dist/features/ingestion/textHandler.js +28 -0
  487. package/dist/features/ingestion/textHandler.js.map +1 -0
  488. package/dist/features/ingestion/useCanvasIngestion.js +48 -0
  489. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
  490. package/dist/features/ingestion/weaselJsonHandler.js +22 -14
  491. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  492. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  493. package/dist/features/modes/modeLayers.js +7 -7
  494. package/dist/features/modes/modeLayers.js.map +1 -1
  495. package/dist/features/paths/editablePath.js +47 -0
  496. package/dist/features/paths/editablePath.js.map +1 -0
  497. package/dist/features/paths/index.js +9 -14
  498. package/dist/features/paths/pathEditState.js +41 -0
  499. package/dist/features/paths/pathEditState.js.map +1 -0
  500. package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
  501. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  502. package/dist/features/paths/pathLayer.js +3 -2
  503. package/dist/features/paths/pathLayer.js.map +1 -1
  504. package/dist/features/paths/penPreviewLayer.js +86 -88
  505. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  506. package/dist/features/paths/usePathEdit.js +34 -0
  507. package/dist/features/paths/usePathEdit.js.map +1 -0
  508. package/dist/features/poseRun/usePoseRun.js +44 -52
  509. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  510. package/dist/features/selection/overlay.js +171 -179
  511. package/dist/features/selection/overlay.js.map +1 -1
  512. package/dist/features/text/index.js +6 -0
  513. package/dist/features/text/textLayer.js +1 -1
  514. package/dist/features/text/textLayer.js.map +1 -1
  515. package/dist/features/text/useSceneTextEdit.js +100 -93
  516. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  517. package/dist/features/viewports/viewportLayer.js +25 -36
  518. package/dist/features/viewports/viewportLayer.js.map +1 -1
  519. package/dist/index.d.ts +8473 -9141
  520. package/dist/index.js +269 -307
  521. package/dist/input/keyState.js +38 -39
  522. package/dist/input/keyState.js.map +1 -1
  523. package/dist/input/useKeyModifiers.js +11 -0
  524. package/dist/input/useKeyModifiers.js.map +1 -0
  525. package/dist/interactions/actions/actionShortcuts.js.map +1 -1
  526. package/dist/interactions/actions/{defaults/align.js → align/action.js} +18 -20
  527. package/dist/interactions/actions/align/action.js.map +1 -0
  528. package/dist/interactions/actions/align/align.js +20 -20
  529. package/dist/interactions/actions/align/align.js.map +1 -1
  530. package/dist/interactions/actions/booleans/action.js +65 -0
  531. package/dist/interactions/actions/booleans/action.js.map +1 -0
  532. package/dist/interactions/actions/booleans/booleans.js +69 -78
  533. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  534. package/dist/interactions/actions/booleans/operands.js +40 -0
  535. package/dist/interactions/actions/booleans/operands.js.map +1 -0
  536. package/dist/interactions/actions/booleans/pieces.js +45 -0
  537. package/dist/interactions/actions/booleans/pieces.js.map +1 -0
  538. package/dist/interactions/actions/booleans/placement.js +24 -0
  539. package/dist/interactions/actions/booleans/placement.js.map +1 -0
  540. package/dist/interactions/actions/booleans/useBooleans.js +11 -9
  541. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  542. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  543. package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +31 -15
  544. package/dist/interactions/actions/clipboard/action.js.map +1 -0
  545. package/dist/interactions/actions/clipboard/clipboardOps.js +44 -42
  546. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  547. package/dist/interactions/actions/clipboard/materializePaste.js +10 -7
  548. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
  549. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  550. package/dist/interactions/actions/clone/action.js +98 -0
  551. package/dist/interactions/actions/clone/action.js.map +1 -0
  552. package/dist/interactions/actions/clone/behaviors.js +52 -0
  553. package/dist/interactions/actions/clone/behaviors.js.map +1 -0
  554. package/dist/interactions/actions/defaultCommitAdapter.js +7 -32
  555. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  556. package/dist/interactions/actions/defaults/anchorEditing.js +60 -84
  557. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  558. package/dist/interactions/actions/defaults/areaSelect.js +35 -38
  559. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  560. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  561. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  562. package/dist/interactions/actions/defaults/copySubtree.js +40 -0
  563. package/dist/interactions/actions/defaults/copySubtree.js.map +1 -0
  564. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  565. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  566. package/dist/interactions/actions/defaults/duplicate.js +13 -53
  567. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  568. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  569. package/dist/interactions/actions/defaults/group.js +40 -50
  570. package/dist/interactions/actions/defaults/group.js.map +1 -1
  571. package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
  572. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
  573. package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
  574. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
  575. package/dist/interactions/actions/defaults/ingest.js +44 -38
  576. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  577. package/dist/interactions/actions/defaults/insertPathAnchor.js +11 -12
  578. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  579. package/dist/interactions/actions/defaults/nudge.js +40 -69
  580. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  581. package/dist/interactions/actions/defaults/nudgeSteps.js +37 -0
  582. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -0
  583. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  584. package/dist/interactions/actions/defaults/reorder.js +2 -0
  585. package/dist/interactions/actions/defaults/reorder.js.map +1 -1
  586. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  587. package/dist/interactions/actions/defaults/setFill.js +14 -8
  588. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  589. package/dist/interactions/actions/defaults/setFillOpacity.js +7 -4
  590. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  591. package/dist/interactions/actions/defaults/setStroke.js +12 -12
  592. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  593. package/dist/interactions/actions/defaults/setStrokeOpacity.js +6 -6
  594. package/dist/interactions/actions/defaults/sliceOps.js +8 -10
  595. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  596. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  597. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  598. package/dist/interactions/actions/defaults/viewportDragPan.js +37 -26
  599. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  600. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  601. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  602. package/dist/interactions/actions/distribute/action.js +66 -0
  603. package/dist/interactions/actions/distribute/action.js.map +1 -0
  604. package/dist/interactions/actions/distribute/distribute.js +11 -11
  605. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  606. package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +7 -9
  607. package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
  608. package/dist/interactions/actions/edit-anchors/geometry.js +30 -27
  609. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  610. package/dist/interactions/actions/flip/action.js +124 -0
  611. package/dist/interactions/actions/flip/action.js.map +1 -0
  612. package/dist/interactions/actions/flip/helpers.js +30 -17
  613. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  614. package/dist/interactions/actions/gestureFrames.js +18 -0
  615. package/dist/interactions/actions/gestureFrames.js.map +1 -0
  616. package/dist/interactions/actions/gestureLifecycle.js +47 -20
  617. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  618. package/dist/interactions/actions/hitSelection.js +8 -0
  619. package/dist/interactions/actions/hitSelection.js.map +1 -0
  620. package/dist/interactions/actions/insert/action.js +72 -0
  621. package/dist/interactions/actions/insert/action.js.map +1 -0
  622. package/dist/interactions/actions/insert/commit.js +28 -0
  623. package/dist/interactions/actions/insert/commit.js.map +1 -0
  624. package/dist/interactions/actions/insert/extras.js +65 -0
  625. package/dist/interactions/actions/insert/extras.js.map +1 -0
  626. package/dist/interactions/actions/insert/frame.js +48 -0
  627. package/dist/interactions/actions/insert/frame.js.map +1 -0
  628. package/dist/interactions/actions/insert/geometry.js +35 -0
  629. package/dist/interactions/actions/insert/geometry.js.map +1 -0
  630. package/dist/interactions/actions/insert/rotateAction.js +21 -0
  631. package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
  632. package/dist/interactions/actions/insert/session.js +59 -0
  633. package/dist/interactions/actions/insert/session.js.map +1 -0
  634. package/dist/interactions/actions/insert/shape.js +34 -0
  635. package/dist/interactions/actions/insert/shape.js.map +1 -0
  636. package/dist/interactions/actions/lasso-select/action.js +143 -0
  637. package/dist/interactions/actions/lasso-select/action.js.map +1 -0
  638. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +14 -18
  639. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -1
  640. package/dist/interactions/actions/move/action.js +87 -0
  641. package/dist/interactions/actions/move/action.js.map +1 -0
  642. package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
  643. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
  644. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
  645. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
  646. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +5 -5
  647. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -1
  648. package/dist/interactions/actions/move/behaviors/snapToContainer.js +39 -27
  649. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  650. package/dist/interactions/actions/move/capture.js +99 -0
  651. package/dist/interactions/actions/move/capture.js.map +1 -0
  652. package/dist/interactions/actions/move/commit/index.js +41 -0
  653. package/dist/interactions/actions/move/commit/index.js.map +1 -0
  654. package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
  655. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
  656. package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
  657. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
  658. package/dist/interactions/actions/move/commit/rebase.js +18 -0
  659. package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
  660. package/dist/interactions/actions/move/commit/reparent.js +65 -0
  661. package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
  662. package/dist/interactions/actions/move/delta.js +51 -0
  663. package/dist/interactions/actions/move/delta.js.map +1 -0
  664. package/dist/interactions/actions/move/frame.js +59 -0
  665. package/dist/interactions/actions/move/frame.js.map +1 -0
  666. package/dist/interactions/actions/move/gestureAdapter.js +22 -30
  667. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  668. package/dist/interactions/actions/move/landedDescendants.js +33 -0
  669. package/dist/interactions/actions/move/landedDescendants.js.map +1 -0
  670. package/dist/interactions/actions/move/layout/container.js +94 -0
  671. package/dist/interactions/actions/move/layout/container.js.map +1 -0
  672. package/dist/interactions/actions/move/layout/dragged.js +58 -0
  673. package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
  674. package/dist/interactions/actions/move/layout/dropPass.js +122 -0
  675. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
  676. package/dist/interactions/actions/move/layout/exits.js +38 -0
  677. package/dist/interactions/actions/move/layout/exits.js.map +1 -0
  678. package/dist/interactions/actions/move/layout/glide.js +48 -0
  679. package/dist/interactions/actions/move/layout/glide.js.map +1 -0
  680. package/dist/interactions/actions/move/session.js +63 -0
  681. package/dist/interactions/actions/move/session.js.map +1 -0
  682. package/dist/interactions/actions/move/translate.js +61 -0
  683. package/dist/interactions/actions/move/translate.js.map +1 -0
  684. package/dist/interactions/actions/outlines/createOutlines.js +16 -63
  685. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  686. package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
  687. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
  688. package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
  689. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
  690. package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
  691. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
  692. package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
  693. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
  694. package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
  695. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
  696. package/dist/interactions/actions/planeInput.js.map +1 -1
  697. package/dist/interactions/actions/pointerState.js +12 -0
  698. package/dist/interactions/actions/pointerState.js.map +1 -0
  699. package/dist/interactions/actions/poseDescriptorDep.js +16 -4
  700. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  701. package/dist/interactions/actions/poseFrame.js +25 -20
  702. package/dist/interactions/actions/poseFrame.js.map +1 -1
  703. package/dist/interactions/actions/resize/action.js +55 -0
  704. package/dist/interactions/actions/resize/action.js.map +1 -0
  705. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
  706. package/dist/interactions/actions/resize/boxFrame.js +16 -0
  707. package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
  708. package/dist/interactions/actions/resize/capture.js +85 -0
  709. package/dist/interactions/actions/resize/capture.js.map +1 -0
  710. package/dist/interactions/actions/resize/commit.js +69 -0
  711. package/dist/interactions/actions/resize/commit.js.map +1 -0
  712. package/dist/interactions/actions/resize/frame.js +74 -0
  713. package/dist/interactions/actions/resize/frame.js.map +1 -0
  714. package/dist/interactions/actions/resize/pointSnap.js +111 -0
  715. package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
  716. package/dist/interactions/actions/resize/ruleBounds.js +9 -0
  717. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
  718. package/dist/interactions/actions/resize/session.js +49 -0
  719. package/dist/interactions/actions/resize/session.js.map +1 -0
  720. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  721. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  722. package/dist/interactions/actions/rotate/action.js +56 -0
  723. package/dist/interactions/actions/rotate/action.js.map +1 -0
  724. package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
  725. package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
  726. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
  727. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
  728. package/dist/interactions/actions/rotate/commit.js +40 -0
  729. package/dist/interactions/actions/rotate/commit.js.map +1 -0
  730. package/dist/interactions/actions/rotate/frame.js +65 -0
  731. package/dist/interactions/actions/rotate/frame.js.map +1 -0
  732. package/dist/interactions/actions/rotate/handle.js +12 -12
  733. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  734. package/dist/interactions/actions/rotate/session.js +92 -0
  735. package/dist/interactions/actions/rotate/session.js.map +1 -0
  736. package/dist/interactions/actions/selectionSubtree.js +69 -0
  737. package/dist/interactions/actions/selectionSubtree.js.map +1 -0
  738. package/dist/interactions/actions/spatialReference.js.map +1 -1
  739. package/dist/interactions/actions/useStandardActions.js +87 -78
  740. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  741. package/dist/interactions/gestures/dragGesture/dragGesture.js +4 -7
  742. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -1
  743. package/dist/interactions/gestures/dragGesture/dragPointOf.js +23 -0
  744. package/dist/interactions/gestures/dragGesture/dragPointOf.js.map +1 -0
  745. package/dist/interactions/gestures/handleDrag/handleDrag.js +21 -26
  746. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -1
  747. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +62 -41
  748. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  749. package/dist/interactions/gestures/shared/originProjection.js +1 -1
  750. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  751. package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
  752. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  753. package/dist/interactions/gestures/shared/snap.js.map +1 -1
  754. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +8 -4
  755. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -1
  756. package/dist/layout/arrivals.js +20 -23
  757. package/dist/layout/arrivals.js.map +1 -1
  758. package/dist/math-CYUjoyyU.d.ts +33 -0
  759. package/dist/math.d.ts +5 -3
  760. package/dist/math.js +6 -6
  761. package/dist/mesh.d.ts +4 -268
  762. package/dist/mesh.js +3 -7
  763. package/dist/move.d.ts +14 -11
  764. package/dist/{originProjection-DEklpDc_.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
  765. package/dist/patterns-builtin.d.ts +1 -118
  766. package/dist/patterns-builtin.js +2 -3
  767. package/dist/{poseDescriptor-D-OH-tu5.d.ts → poseDescriptor-Bqk-11Rl.d.ts} +26 -36
  768. package/dist/renderer.d.ts +1 -91
  769. package/dist/renderer.js +2 -18
  770. package/dist/resize.d.ts +10 -22
  771. package/dist/resize.js +6 -6
  772. package/dist/style.css +1 -1
  773. package/dist/test-hook/install.js +12 -6
  774. package/dist/test-hook/install.js.map +1 -1
  775. package/dist/test-hook/useTestHook.js +22 -0
  776. package/dist/test-hook/useTestHook.js.map +1 -0
  777. package/dist/test-seams-D0pyV3pR.d.ts +149 -0
  778. package/dist/test-seams.d.ts +4 -4
  779. package/dist/test-seams.js +2 -2
  780. package/dist/tools/builtin/bone/boneActions.js +130 -0
  781. package/dist/tools/builtin/bone/boneActions.js.map +1 -0
  782. package/dist/tools/builtin/bone/boneOverlay.js +58 -0
  783. package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
  784. package/dist/tools/builtin/bone/placedRig.js +24 -0
  785. package/dist/tools/builtin/bone/placedRig.js.map +1 -0
  786. package/dist/tools/builtin/bone/rigEditState.js +21 -0
  787. package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
  788. package/dist/tools/builtin/bone/useBoneTool.js +98 -0
  789. package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
  790. package/dist/tools/builtin/ellipse/useEllipseTool.js +1 -0
  791. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  792. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  793. package/dist/tools/builtin/hand/useHandTool.js +1 -0
  794. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  795. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  796. package/dist/tools/builtin/lasso/useLassoTool.js +11 -11
  797. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  798. package/dist/tools/builtin/line/useLineTool.js +1 -0
  799. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  800. package/dist/tools/builtin/pen/usePenTool.js +198 -150
  801. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  802. package/dist/tools/builtin/pencil/usePencilTool.js +1 -0
  803. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  804. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  805. package/dist/tools/builtin/polygon/usePolygonTool.js +13 -8
  806. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  807. package/dist/tools/builtin/rect/useRectTool.js +1 -0
  808. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  809. package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
  810. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
  811. package/dist/tools/builtin/select/selectionContributions.js +25 -24
  812. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  813. package/dist/tools/builtin/select/useSelectTool.js +42 -67
  814. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  815. package/dist/tools/builtin/shared/pointerFollower.js +17 -0
  816. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -0
  817. package/dist/tools/builtin/slice/useSliceTool.js +72 -82
  818. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  819. package/dist/tools/builtin/star/useStarTool.js +22 -16
  820. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  821. package/dist/tools/builtin/text/useTextTool.js +9 -0
  822. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  823. package/dist/tools/builtin/weight/useWeightTool.js +77 -0
  824. package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
  825. package/dist/tools/builtin/weight/weightActions.js +112 -0
  826. package/dist/tools/builtin/weight/weightActions.js.map +1 -0
  827. package/dist/tools/builtin/weight/weightOverlay.js +61 -0
  828. package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
  829. package/dist/tools/overlayBinding.js.map +1 -1
  830. package/dist/tools/useKeybindings.js +12 -22
  831. package/dist/tools/useKeybindings.js.map +1 -1
  832. package/dist/{types-A37hYkeR.d.ts → types-CIKDwlsP.d.ts} +113 -169
  833. package/dist/util/color.js +3 -3
  834. package/dist/util/color.js.map +1 -1
  835. package/dist/util/paint.js +1 -1
  836. package/dist/util/paint.js.map +1 -1
  837. package/dist/version.js +1 -1
  838. package/package.json +28 -21
  839. package/dist/animation/colorHelpers.js +0 -135
  840. package/dist/animation/colorHelpers.js.map +0 -1
  841. package/dist/animation/colorRegistry.js +0 -37
  842. package/dist/animation/colorRegistry.js.map +0 -1
  843. package/dist/animation/engine/axes.js +0 -36
  844. package/dist/animation/engine/axes.js.map +0 -1
  845. package/dist/animation/engine/codec.js +0 -170
  846. package/dist/animation/engine/codec.js.map +0 -1
  847. package/dist/animation/engine/integrator.js +0 -12
  848. package/dist/animation/engine/integrator.js.map +0 -1
  849. package/dist/animation/loop.js +0 -62
  850. package/dist/animation/loop.js.map +0 -1
  851. package/dist/animation/observe.js +0 -23
  852. package/dist/animation/observe.js.map +0 -1
  853. package/dist/animation/rig/blendPoses.js +0 -43
  854. package/dist/animation/rig/blendPoses.js.map +0 -1
  855. package/dist/animation/rig/mirrorPose.js +0 -19
  856. package/dist/animation/rig/mirrorPose.js.map +0 -1
  857. package/dist/animation/rig/resolveSkeleton.js +0 -33
  858. package/dist/animation/rig/resolveSkeleton.js.map +0 -1
  859. package/dist/animation/rig/solveIk.js +0 -103
  860. package/dist/animation/rig/solveIk.js.map +0 -1
  861. package/dist/animation/rig/types.js +0 -12
  862. package/dist/animation/rig/types.js.map +0 -1
  863. package/dist/animation/slew.js +0 -27
  864. package/dist/animation/slew.js.map +0 -1
  865. package/dist/animation/stagger.js +0 -138
  866. package/dist/animation/stagger.js.map +0 -1
  867. package/dist/animation/timeline/booking.js +0 -106
  868. package/dist/animation/timeline/booking.js.map +0 -1
  869. package/dist/animation/timeline/createTimeline.js +0 -116
  870. package/dist/animation/timeline/createTimeline.js.map +0 -1
  871. package/dist/animation/timeline/sampleTrack.js +0 -71
  872. package/dist/animation/timeline/sampleTrack.js.map +0 -1
  873. package/dist/animation/useAnimator.js +0 -378
  874. package/dist/animation/useAnimator.js.map +0 -1
  875. package/dist/builtins-C-VgUlWI.d.ts +0 -4514
  876. package/dist/canvas/MinimapCanvas.js +0 -139
  877. package/dist/canvas/MinimapCanvas.js.map +0 -1
  878. package/dist/canvas/deps/poseComposition.js +0 -11
  879. package/dist/canvas/deps/poseComposition.js.map +0 -1
  880. package/dist/canvas/minimapMath.js +0 -80
  881. package/dist/canvas/minimapMath.js.map +0 -1
  882. package/dist/canvas/toolPreview.js +0 -39
  883. package/dist/canvas/toolPreview.js.map +0 -1
  884. package/dist/core/adapters/arrayAdapter.js +0 -85
  885. package/dist/core/adapters/arrayAdapter.js.map +0 -1
  886. package/dist/core/adapters/useArrayAdapter.js +0 -13
  887. package/dist/core/adapters/useArrayAdapter.js.map +0 -1
  888. package/dist/core/fillInPoseFrame.js +0 -102
  889. package/dist/core/fillInPoseFrame.js.map +0 -1
  890. package/dist/core/geometry/poseRotation.js +0 -58
  891. package/dist/core/geometry/poseRotation.js.map +0 -1
  892. package/dist/core/gradient.js +0 -136
  893. package/dist/core/gradient.js.map +0 -1
  894. package/dist/core/isPlainObject.js.map +0 -1
  895. package/dist/core/markerInset.js +0 -24
  896. package/dist/core/markerInset.js.map +0 -1
  897. package/dist/core/mixed.js +0 -6
  898. package/dist/core/mixed.js.map +0 -1
  899. package/dist/core/paintKinds.js +0 -156
  900. package/dist/core/paintKinds.js.map +0 -1
  901. package/dist/core/strokeMarkerShapes.js +0 -139
  902. package/dist/core/strokeMarkerShapes.js.map +0 -1
  903. package/dist/core/strokeMarkers.js +0 -28
  904. package/dist/core/strokeMarkers.js.map +0 -1
  905. package/dist/core/viewport/meanScale.js +0 -8
  906. package/dist/core/viewport/meanScale.js.map +0 -1
  907. package/dist/core/viewport/pxExtent.js +0 -42
  908. package/dist/core/viewport/pxExtent.js.map +0 -1
  909. package/dist/debug/flag.js.map +0 -1
  910. package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
  911. package/dist/features/focus/gateLayer.js +0 -14
  912. package/dist/features/focus/gateLayer.js.map +0 -1
  913. package/dist/features/focus/useCanvasFocus.js +0 -29
  914. package/dist/features/focus/useCanvasFocus.js.map +0 -1
  915. package/dist/features/groups/children.js.map +0 -1
  916. package/dist/features/groups/composePose.js.map +0 -1
  917. package/dist/features/groups/nestedHit.js.map +0 -1
  918. package/dist/features/groups/unionOfChildren.js.map +0 -1
  919. package/dist/features/images/imageCache.js +0 -94
  920. package/dist/features/images/imageCache.js.map +0 -1
  921. package/dist/features/ingestion/index.js +0 -8
  922. package/dist/features/meshPaint/bake.js +0 -79
  923. package/dist/features/meshPaint/bake.js.map +0 -1
  924. package/dist/features/meshPaint/bakeCache.js +0 -59
  925. package/dist/features/meshPaint/bakeCache.js.map +0 -1
  926. package/dist/features/meshPaint/handles.js +0 -86
  927. package/dist/features/meshPaint/handles.js.map +0 -1
  928. package/dist/features/meshPaint/lazyKind.js.map +0 -1
  929. package/dist/features/meshPaint/meshPaint.js +0 -236
  930. package/dist/features/meshPaint/meshPaint.js.map +0 -1
  931. package/dist/features/meshPaint/meshShader.js +0 -6
  932. package/dist/features/meshPaint/meshShader.js.map +0 -1
  933. package/dist/features/meshPaint/register.js +0 -7
  934. package/dist/features/meshPaint/register.js.map +0 -1
  935. package/dist/features/meshPaint/surface.js +0 -110
  936. package/dist/features/meshPaint/surface.js.map +0 -1
  937. package/dist/features/minimap/actions.js +0 -53
  938. package/dist/features/minimap/actions.js.map +0 -1
  939. package/dist/features/minimap/createMinimapContribution.js +0 -96
  940. package/dist/features/minimap/createMinimapContribution.js.map +0 -1
  941. package/dist/features/minimap/layers.js +0 -103
  942. package/dist/features/minimap/layers.js.map +0 -1
  943. package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
  944. package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
  945. package/dist/features/parallax/createParallaxLayer.js +0 -26
  946. package/dist/features/parallax/createParallaxLayer.js.map +0 -1
  947. package/dist/features/parallax/createParallaxPlane.js +0 -26
  948. package/dist/features/parallax/createParallaxPlane.js.map +0 -1
  949. package/dist/features/paths/anchorEdits.js +0 -156
  950. package/dist/features/paths/anchorEdits.js.map +0 -1
  951. package/dist/features/paths/anchors.js +0 -154
  952. package/dist/features/paths/anchors.js.map +0 -1
  953. package/dist/features/paths/booleans.js +0 -2
  954. package/dist/features/paths/markerCommands.js +0 -148
  955. package/dist/features/paths/markerCommands.js.map +0 -1
  956. package/dist/features/paths/markerSites.js +0 -59
  957. package/dist/features/paths/markerSites.js.map +0 -1
  958. package/dist/features/paths/markers.js +0 -95
  959. package/dist/features/paths/markers.js.map +0 -1
  960. package/dist/features/paths/nearestAnchor.js +0 -36
  961. package/dist/features/paths/nearestAnchor.js.map +0 -1
  962. package/dist/features/paths/pathInWorld.js +0 -41
  963. package/dist/features/paths/pathInWorld.js.map +0 -1
  964. package/dist/features/paths/poseDescriptor.js +0 -39
  965. package/dist/features/paths/poseDescriptor.js.map +0 -1
  966. package/dist/features/paths/tessellate/dash.js +0 -52
  967. package/dist/features/paths/tessellate/dash.js.map +0 -1
  968. package/dist/features/paths/tessellate/insets.js +0 -32
  969. package/dist/features/paths/tessellate/insets.js.map +0 -1
  970. package/dist/features/paths/tessellate/metric.js +0 -72
  971. package/dist/features/paths/tessellate/metric.js.map +0 -1
  972. package/dist/features/paths/tessellate/stroke.js +0 -170
  973. package/dist/features/paths/tessellate/stroke.js.map +0 -1
  974. package/dist/features/paths/tessellate/vertexWidths.js +0 -32
  975. package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
  976. package/dist/features/patterns/index.js +0 -23
  977. package/dist/features/patterns/index.js.map +0 -1
  978. package/dist/features/patterns/patterns-builtin.js +0 -38
  979. package/dist/features/patterns/patterns-builtin.js.map +0 -1
  980. package/dist/features/patterns/resolveSpec.js +0 -57
  981. package/dist/features/patterns/resolveSpec.js.map +0 -1
  982. package/dist/features/patterns/tileGeometry.js +0 -158
  983. package/dist/features/patterns/tileGeometry.js.map +0 -1
  984. package/dist/features/pointer/PointerContext.js +0 -45
  985. package/dist/features/pointer/PointerContext.js.map +0 -1
  986. package/dist/features/selection/SelectionContext.js +0 -46
  987. package/dist/features/selection/SelectionContext.js.map +0 -1
  988. package/dist/features/simulation/createSimulation.js +0 -61
  989. package/dist/features/simulation/createSimulation.js.map +0 -1
  990. package/dist/features/simulation/types.js +0 -6
  991. package/dist/features/simulation/types.js.map +0 -1
  992. package/dist/features/simulation/useSimulation.js +0 -74
  993. package/dist/features/simulation/useSimulation.js.map +0 -1
  994. package/dist/features/text/domRuns.js +0 -258
  995. package/dist/features/text/domRuns.js.map +0 -1
  996. package/dist/features/text/fitTextPose.js +0 -38
  997. package/dist/features/text/fitTextPose.js.map +0 -1
  998. package/dist/features/text/hitTest.js +0 -45
  999. package/dist/features/text/hitTest.js.map +0 -1
  1000. package/dist/features/text/renderLabel.js +0 -14
  1001. package/dist/features/text/renderLabel.js.map +0 -1
  1002. package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
  1003. package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
  1004. package/dist/features/text/runs/flagRange.js +0 -53
  1005. package/dist/features/text/runs/flagRange.js.map +0 -1
  1006. package/dist/features/text/runs/rangeStyle.js +0 -135
  1007. package/dist/features/text/runs/rangeStyle.js.map +0 -1
  1008. package/dist/features/text/textCommand.js +0 -59
  1009. package/dist/features/text/textCommand.js.map +0 -1
  1010. package/dist/features/text/textToPath.js +0 -181
  1011. package/dist/features/text/textToPath.js.map +0 -1
  1012. package/dist/features/text/useTextEdit.js +0 -467
  1013. package/dist/features/text/useTextEdit.js.map +0 -1
  1014. package/dist/features/tiling/createTiledLayer.js +0 -63
  1015. package/dist/features/tiling/createTiledLayer.js.map +0 -1
  1016. package/dist/features/tiling/tiledProject.js +0 -14
  1017. package/dist/features/tiling/tiledProject.js.map +0 -1
  1018. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
  1019. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
  1020. package/dist/interactions/actions/defaults/align.js.map +0 -1
  1021. package/dist/interactions/actions/defaults/booleans.js +0 -52
  1022. package/dist/interactions/actions/defaults/booleans.js.map +0 -1
  1023. package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
  1024. package/dist/interactions/actions/defaults/clone.js +0 -107
  1025. package/dist/interactions/actions/defaults/clone.js.map +0 -1
  1026. package/dist/interactions/actions/defaults/createOutlines.js +0 -47
  1027. package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
  1028. package/dist/interactions/actions/defaults/distribute.js +0 -66
  1029. package/dist/interactions/actions/defaults/distribute.js.map +0 -1
  1030. package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
  1031. package/dist/interactions/actions/defaults/flip.js +0 -119
  1032. package/dist/interactions/actions/defaults/flip.js.map +0 -1
  1033. package/dist/interactions/actions/defaults/freshNodeId.js +0 -10
  1034. package/dist/interactions/actions/defaults/freshNodeId.js.map +0 -1
  1035. package/dist/interactions/actions/defaults/insert.js +0 -288
  1036. package/dist/interactions/actions/defaults/insert.js.map +0 -1
  1037. package/dist/interactions/actions/defaults/lassoSelect.js +0 -156
  1038. package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
  1039. package/dist/interactions/actions/defaults/move.js +0 -760
  1040. package/dist/interactions/actions/defaults/move.js.map +0 -1
  1041. package/dist/interactions/actions/defaults/resize.js +0 -335
  1042. package/dist/interactions/actions/defaults/resize.js.map +0 -1
  1043. package/dist/interactions/actions/defaults/rotate.js +0 -184
  1044. package/dist/interactions/actions/defaults/rotate.js.map +0 -1
  1045. package/dist/interactions/actions/previewOverrides.js +0 -25
  1046. package/dist/interactions/actions/previewOverrides.js.map +0 -1
  1047. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
  1048. package/dist/math-Drrw4ewZ.d.ts +0 -160
  1049. package/dist/registerProgram-BMZRDgrh.d.ts +0 -197
  1050. package/dist/renderer/DrawCommand.js +0 -6
  1051. package/dist/renderer/DrawCommand.js.map +0 -1
  1052. package/dist/renderer/WeaselRenderer.js +0 -331
  1053. package/dist/renderer/WeaselRenderer.js.map +0 -1
  1054. package/dist/renderer/batchClip.js +0 -46
  1055. package/dist/renderer/batchClip.js.map +0 -1
  1056. package/dist/renderer/cache/GLImageCache.js +0 -64
  1057. package/dist/renderer/cache/GLImageCache.js.map +0 -1
  1058. package/dist/renderer/cache/GLMeshCache.js +0 -102
  1059. package/dist/renderer/cache/GLMeshCache.js.map +0 -1
  1060. package/dist/renderer/cache/GLTextureCache.js +0 -51
  1061. package/dist/renderer/cache/GLTextureCache.js.map +0 -1
  1062. package/dist/renderer/cache/GradientRampAtlas.js +0 -82
  1063. package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
  1064. package/dist/renderer/cache/cache.js +0 -13
  1065. package/dist/renderer/cache/cache.js.map +0 -1
  1066. package/dist/renderer/cache/markerCommandCache.js +0 -63
  1067. package/dist/renderer/cache/markerCommandCache.js.map +0 -1
  1068. package/dist/renderer/cache/outlineMeshCache.js +0 -15
  1069. package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
  1070. package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
  1071. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
  1072. package/dist/renderer/cache/strokeMeshCache.js +0 -55
  1073. package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
  1074. package/dist/renderer/cullDrawCommands.js +0 -90
  1075. package/dist/renderer/cullDrawCommands.js.map +0 -1
  1076. package/dist/renderer/draw.js +0 -1135
  1077. package/dist/renderer/draw.js.map +0 -1
  1078. package/dist/renderer/drawBatch.js +0 -198
  1079. package/dist/renderer/drawBatch.js.map +0 -1
  1080. package/dist/renderer/effects/EffectTargets.js +0 -45
  1081. package/dist/renderer/effects/EffectTargets.js.map +0 -1
  1082. package/dist/renderer/effects/builtins.js +0 -31
  1083. package/dist/renderer/effects/builtins.js.map +0 -1
  1084. package/dist/renderer/effects/composite.js +0 -9
  1085. package/dist/renderer/effects/composite.js.map +0 -1
  1086. package/dist/renderer/effects/effectPrelude.js +0 -10
  1087. package/dist/renderer/effects/effectPrelude.js.map +0 -1
  1088. package/dist/renderer/effects/types.js +0 -10
  1089. package/dist/renderer/effects/types.js.map +0 -1
  1090. package/dist/renderer/glyphOutlineMesh.js +0 -67
  1091. package/dist/renderer/glyphOutlineMesh.js.map +0 -1
  1092. package/dist/renderer/index.js +0 -19
  1093. package/dist/renderer/math/color.js +0 -341
  1094. package/dist/renderer/math/color.js.map +0 -1
  1095. package/dist/renderer/math/mat3.js +0 -76
  1096. package/dist/renderer/math/mat3.js.map +0 -1
  1097. package/dist/renderer/math/patternSpace.js +0 -22
  1098. package/dist/renderer/math/patternSpace.js.map +0 -1
  1099. package/dist/renderer/math/viewToMat3.js +0 -19
  1100. package/dist/renderer/math/viewToMat3.js.map +0 -1
  1101. package/dist/renderer/paintResources.js +0 -18
  1102. package/dist/renderer/paintResources.js.map +0 -1
  1103. package/dist/renderer/paintScratch.js +0 -37
  1104. package/dist/renderer/paintScratch.js.map +0 -1
  1105. package/dist/renderer/shaders/ShaderProgram.js +0 -74
  1106. package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
  1107. package/dist/renderer/shaders/batchFill.js +0 -119
  1108. package/dist/renderer/shaders/batchFill.js.map +0 -1
  1109. package/dist/renderer/shaders/customPrelude.js +0 -34
  1110. package/dist/renderer/shaders/customPrelude.js.map +0 -1
  1111. package/dist/renderer/shaders/extractUniformNames.js +0 -184
  1112. package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
  1113. package/dist/renderer/shaders/glyphPaint.js +0 -61
  1114. package/dist/renderer/shaders/glyphPaint.js.map +0 -1
  1115. package/dist/renderer/shaders/gradFill.js +0 -30
  1116. package/dist/renderer/shaders/gradFill.js.map +0 -1
  1117. package/dist/renderer/shaders/imageFill.js +0 -14
  1118. package/dist/renderer/shaders/imageFill.js.map +0 -1
  1119. package/dist/renderer/shaders/pathFill.js +0 -13
  1120. package/dist/renderer/shaders/pathFill.js.map +0 -1
  1121. package/dist/renderer/shaders/patternFill.js +0 -24
  1122. package/dist/renderer/shaders/patternFill.js.map +0 -1
  1123. package/dist/renderer/shaders/registerProgram.js +0 -18
  1124. package/dist/renderer/shaders/registerProgram.js.map +0 -1
  1125. package/dist/renderer/spriteSheet.js +0 -14
  1126. package/dist/renderer/spriteSheet.js.map +0 -1
  1127. package/dist/renderer/state/GroupState.js +0 -77
  1128. package/dist/renderer/state/GroupState.js.map +0 -1
  1129. package/dist/renderer/strokeLengths.js +0 -50
  1130. package/dist/renderer/strokeLengths.js.map +0 -1
  1131. package/dist/renderer/syntheticItalic.js +0 -6
  1132. package/dist/renderer/syntheticItalic.js.map +0 -1
  1133. package/dist/renderer/textures/registerTexture.js +0 -14
  1134. package/dist/renderer/textures/registerTexture.js.map +0 -1
  1135. package/dist/scheduling/useVisibleRaf.js +0 -69
  1136. package/dist/scheduling/useVisibleRaf.js.map +0 -1
  1137. package/dist/test-seams-CuIxe0xY.d.ts +0 -356
  1138. package/dist/tools/prefs.js +0 -62
  1139. package/dist/tools/prefs.js.map +0 -1
@@ -0,0 +1,59 @@
1
+ import { useOptionalViewRegistry as e } from "../viewRegistry.js";
2
+ import { worldPointAt as t } from "./worldPointAt.js";
3
+ import { never as n } from "../../features/chrome-caps/conditions.js";
4
+ import { featureChromeRules as r } from "./features.js";
5
+ import { useHoverTracking as i } from "../../features/chrome-caps/useHoverTracking.js";
6
+ import { useChromeCaps as a } from "../../features/chrome-caps/useChromeCaps.js";
7
+ import { useCallback as o, useMemo as s } from "react";
8
+ import { useLatest as c } from "@weasel-js/react";
9
+ //#region src/canvas/SceneCanvas/useSceneChrome.ts
10
+ function l(n) {
11
+ let { canvasApiRef: r, viewRef: a, nodeAtPointRef: o, enabled: s } = n, c = e();
12
+ return i({
13
+ nodeAtClientPoint: (e, n) => {
14
+ let i = r.current;
15
+ if (!i) return null;
16
+ let s = c?.resolver.at(null, e, n), l = s?.view ?? a.current, [u, d] = t(i, s, e, n), f = s?.id == null ? void 0 : c?.list().find((e) => e.id === s.id), p = o.current?.(u, d, f ? {
17
+ scale: l.scale,
18
+ layerIsPainted: f.layerIsPainted
19
+ } : l);
20
+ return p ? { id: p.id } : null;
21
+ },
22
+ enabled: s
23
+ });
24
+ }
25
+ function u(e) {
26
+ let { enabled: t, selectable: i, rotateOff: a, chromeVisibility: o } = e;
27
+ return s(() => {
28
+ let e = r(t);
29
+ return i || (e["action.marquee"] = n, e["action.lasso"] = n), a && (e["selection.rotation-handle"] = n), {
30
+ ...e,
31
+ ...o
32
+ };
33
+ }, [
34
+ o,
35
+ i,
36
+ a,
37
+ t
38
+ ]);
39
+ }
40
+ function d(e) {
41
+ let { viewRef: t, dispatcher: n } = e, r = a(e.source), i = c(e.selection), s = o(() => ({
42
+ selection: i.current,
43
+ view: t.current,
44
+ action: n.getActiveAction()
45
+ }), [
46
+ n,
47
+ i,
48
+ t
49
+ ]);
50
+ return {
51
+ chromeCaps: r,
52
+ getIsVisible: o(() => r.isVisible(s()), [r, s]),
53
+ getRuleCtx: o(() => r.ruleCtx(s()), [r, s])
54
+ };
55
+ }
56
+ //#endregion
57
+ export { u as useChromeRules, l as useSceneHover, d as useSurfaceChromeCaps };
58
+
59
+ //# sourceMappingURL=useSceneChrome.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSceneChrome.js","names":["useSceneHover","args","surfaceViewRegistry","useOptionalViewRegistry","useHoverTracking","api","canvasApiRef","target","clientX","clientY","view","viewRef","x","y","worldPointAt","reg","r","hit","nodeAtPointRef","useChromeRules","useMemo","defaults","featureChromeRules","enabled","selectable","never","rotateOff","chromeVisibility","useSurfaceChromeCaps","chromeCaps","useChromeCaps","committedSelectionRef","useLatest","currentRuleInputs","useCallback","dispatcher"],"sources":["../../../src/canvas/SceneCanvas/useSceneChrome.ts"],"sourcesContent":["import { useCallback, useMemo, type RefObject } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { Dispatcher, RuleCtx } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport type { View } from 'core/viewport/view';\nimport { never, useHoverTracking, type HoverTracking, type VisibilityRules } from 'features/chrome-caps';\nimport {\n useChromeCaps,\n type ChromeCaps,\n type ChromeCapsSource,\n type ViewRuleInputs,\n} from 'features/chrome-caps/useChromeCaps';\nimport type { CanvasExtensionApi } from '../canvasExtension';\nimport { useOptionalViewRegistry } from '../viewRegistry';\nimport { featureChromeRules, type BaseFeature } from './features';\nimport type { NodeAtPoint } from './useNodeAtPoint';\nimport { worldPointAt } from './worldPointAt';\n\n/**\n * The node under the pointer, for `RuleCtx.hover`. One lookup, not a\n * client-to-world thunk beside a picker: the point and the camera its\n * tolerance converts against have to come from the same view. Hover has no\n * pointer to capture, so whichever view is under the cursor owns the point.\n */\nexport function useSceneHover(args: {\n canvasApiRef: RefObject<Pick<CanvasExtensionApi, 'clientToWorld'> | null>;\n /** The surface's own camera, for a point no declared view claims. */\n viewRef: { readonly current: View };\n nodeAtPointRef: { readonly current: NodeAtPoint | undefined };\n enabled: boolean;\n}): HoverTracking {\n const { canvasApiRef, viewRef, nodeAtPointRef, enabled } = args;\n const surfaceViewRegistry = useOptionalViewRegistry();\n return useHoverTracking({\n nodeAtClientPoint: (clientX, clientY) => {\n const api = canvasApiRef.current;\n if (!api) return null;\n const target = surfaceViewRegistry?.resolver.at(null, clientX, clientY);\n const view = target?.view ?? viewRef.current;\n const [x, y] = worldPointAt(api, target, clientX, clientY);\n // A view judges its own layers; the surface's gate is the picker's default.\n const reg = target?.id != null\n ? surfaceViewRegistry?.list().find((r) => r.id === target.id)\n : undefined;\n const hit = nodeAtPointRef.current?.(\n x, y, reg ? { scale: view.scale, layerIsPainted: reg.layerIsPainted } : view,\n );\n return hit ? { id: hit.id as NodeId } : null;\n },\n enabled,\n });\n}\n\n/**\n * The surface's chrome-visibility rules: the presets' defaults under the\n * consumer's `chromeVisibility`, which wins.\n *\n * An unselectable canvas hides the marquee and lasso by default: every\n * selection write no-ops there, so the select tool's empty-drag binding still\n * claims the gesture, keeping it from falling through to an ambient drag such\n * as insert, but paints nothing. `rotateOff` hides the rotation handle.\n */\nexport function useChromeRules(args: {\n enabled: ReadonlySet<BaseFeature>;\n selectable: boolean;\n /** `selectTool.rotate === false`. */\n rotateOff: boolean;\n chromeVisibility: VisibilityRules | undefined;\n}): VisibilityRules {\n const { enabled, selectable, rotateOff, chromeVisibility } = args;\n return useMemo(() => {\n const defaults = featureChromeRules(enabled);\n if (!selectable) {\n defaults['action.marquee'] = never;\n defaults['action.lasso'] = never;\n }\n if (rotateOff) defaults['selection.rotation-handle'] = never;\n return { ...defaults, ...chromeVisibility };\n }, [chromeVisibility, selectable, rotateOff, enabled]);\n}\n\n/** The chrome-caps answers for the surface's own view. */\nexport function useSurfaceChromeCaps(args: {\n source: ChromeCapsSource;\n /** The selection as rendered. `SelectionApi.current` can be a live getter\n * that runs ahead of the commit the painted chrome was built from. */\n selection: readonly NodeId[];\n viewRef: { readonly current: View };\n dispatcher: Pick<Dispatcher, 'getActiveAction'>;\n}): {\n chromeCaps: ChromeCaps;\n getIsVisible: () => (id: string) => boolean;\n getRuleCtx: () => RuleCtx | undefined;\n} {\n const { viewRef, dispatcher } = args;\n const chromeCaps = useChromeCaps(args.source);\n const committedSelectionRef = useLatest(args.selection);\n const currentRuleInputs = useCallback((): ViewRuleInputs => ({\n selection: committedSelectionRef.current,\n view: viewRef.current,\n action: dispatcher.getActiveAction(),\n }), [dispatcher, committedSelectionRef, viewRef]);\n const getIsVisible = useCallback(\n (): ((id: string) => boolean) => chromeCaps.isVisible(currentRuleInputs()),\n [chromeCaps, currentRuleInputs],\n );\n const getRuleCtx = useCallback(\n () => chromeCaps.ruleCtx(currentRuleInputs()),\n [chromeCaps, currentRuleInputs],\n );\n return { chromeCaps, getIsVisible, getRuleCtx };\n}\n"],"mappings":";;;;;;;;;AAwBA,SAAgBA,EAAc,GAMZ;CAChB,IAAM,EAAE,iBAAc,YAAS,mBAAgB,eAAYC,GACrDC,IAAsBC,EAAwB;CACpD,OAAOC,EAAiB;EACtB,oBAAoB,GAAS,MAAY;GACvC,IAAMC,IAAMC,EAAa;GACzB,IAAI,CAACD,GAAK,OAAO;GACjB,IAAME,IAASL,GAAqB,SAAS,GAAG,MAAMM,GAASC,CAAO,GAChEC,IAAOH,GAAQ,QAAQI,EAAQ,SAC/B,CAACC,GAAGC,KAAKC,EAAaT,GAAKE,GAAQC,GAASC,CAAO,GAEnDM,IAAMR,GAAQ,MAAM,OAEtB,KAAA,IADAL,GAAqB,KAAK,CAAC,CAAC,MAAM,MAAMc,EAAE,OAAOT,EAAO,EAAE,GAExDU,IAAMC,EAAe,UACzBN,GAAGC,GAAGE,IAAM;IAAE,OAAOL,EAAK;IAAO,gBAAgBK,EAAI;GAAe,IAAIL,CAC1E;GACA,OAAOO,IAAM,EAAE,IAAIA,EAAI,GAAa,IAAI;EAC1C;EACA;CACF,CAAC;AACH;AAWA,SAAgBE,EAAe,GAMX;CAClB,IAAM,EAAE,YAAS,eAAY,cAAW,wBAAqBlB;CAC7D,OAAOmB,QAAc;EACnB,IAAMC,IAAWC,EAAmBC,CAAO;EAM3C,OALKC,MACH,EAAS,oBAAoBC,GAC7B,EAAS,kBAAkBA,IAEzBC,MAAW,EAAS,+BAA+BD,IAChD;GAAE,GAAGJ;GAAU,GAAGM;EAAiB;CAC5C,GAAG;EAACA;EAAkBH;EAAYE;EAAWH;CAAO,CAAC;AACvD;AAGA,SAAgBK,EAAqB,GAWnC;CACA,IAAM,EAAE,YAAS,kBAAe3B,GAC1B4B,IAAaC,EAAc7B,EAAK,MAAM,GACtC8B,IAAwBC,EAAU/B,EAAK,SAAS,GAChDgC,IAAoBC,SAAmC;EAC3D,WAAWH,EAAsB;EACjC,MAAMpB,EAAQ;EACd,QAAQwB,EAAW,gBAAgB;CACrC,IAAI;EAACA;EAAYJ;EAAuBpB;CAAO,CAAC;CAShD,OAAO;EAAE;EAAY,cARAuB,QACcL,EAAW,UAAUI,EAAkB,CAAC,GACzE,CAACJ,GAAYI,CAAiB,CAMX;EAAc,YAJhBC,QACXL,EAAW,QAAQI,EAAkB,CAAC,GAC5C,CAACJ,GAAYI,CAAiB,CAEG;CAAW;AAChD"}
@@ -0,0 +1,23 @@
1
+ import { useMemo as e } from "react";
2
+ //#region src/canvas/SceneCanvas/useSceneRedrawSources.ts
3
+ function t(t) {
4
+ let { supplied: n, scene: r, heldModifiers: i, animator: a, modes: o } = t;
5
+ return e(() => [
6
+ ...n ?? [],
7
+ r,
8
+ r.overrides,
9
+ i,
10
+ ...a ? [{ subscribe: (e) => a.onTick(e) }] : [],
11
+ ...o ? [o] : []
12
+ ], [
13
+ r,
14
+ i,
15
+ a,
16
+ o,
17
+ n
18
+ ]);
19
+ }
20
+ //#endregion
21
+ export { t as useSceneRedrawSources };
22
+
23
+ //# sourceMappingURL=useSceneRedrawSources.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSceneRedrawSources.js","names":["useSceneRedrawSources","args","useMemo","supplied","scene","heldModifiers","animator","repaint","modes"],"sources":["../../../src/canvas/SceneCanvas/useSceneRedrawSources.ts"],"sourcesContent":["import { useMemo } from 'react';\nimport type { RedrawSource } from '../../core/layers/render';\n\n/**\n * What repaints a `<SceneCanvas>` besides its own render: the caller's\n * sources, then the canvas's. Neither a scene write nor an override write\n * renders the component, and an override write does not bump the scene version\n * either. An animator frame repaints for a `drawOne` reading\n * `animator.colorOverrides`.\n */\nexport function useSceneRedrawSources(args: {\n /** `<SceneCanvas redrawOn>`. */\n supplied: readonly RedrawSource[] | undefined;\n scene: RedrawSource & { overrides: RedrawSource };\n heldModifiers: RedrawSource;\n animator: { onTick(listener: () => void): () => void } | undefined;\n modes: RedrawSource | undefined;\n}): readonly RedrawSource[] {\n const { supplied, scene, heldModifiers, animator, modes } = args;\n return useMemo((): readonly RedrawSource[] => [\n ...(supplied ?? []),\n scene,\n scene.overrides,\n heldModifiers,\n ...(animator ? [{ subscribe: (repaint: () => void) => animator.onTick(repaint) }] : []),\n ...(modes ? [modes] : []),\n ], [scene, heldModifiers, animator, modes, supplied]);\n}\n"],"mappings":";;AAUA,SAAgBA,EAAsB,GAOV;CAC1B,IAAM,EAAE,aAAU,UAAO,kBAAe,aAAU,aAAUC;CAC5D,OAAOC,QAAuC;EAC5C,GAAIC,KAAY,CAAC;EACjBC;EACAA,EAAM;EACNC;EACA,GAAIC,IAAW,CAAC,EAAE,YAAY,MAAwBA,EAAS,OAAOC,CAAO,EAAE,CAAC,IAAI,CAAC;EACrF,GAAIC,IAAQ,CAACA,CAAK,IAAI,CAAC;CACzB,GAAG;EAACJ;EAAOC;EAAeC;EAAUE;EAAOL;CAAQ,CAAC;AACtD"}
@@ -1,128 +1,124 @@
1
1
  import { rectFromPlane as e, toPlane as t } from "../../core/viewport/parallax.js";
2
- import { meanScale as n } from "../../core/viewport/meanScale.js";
3
- import { asNodeId as r } from "../../core/scene/types.js";
4
- import { poseDescriptorForNode as i } from "../../core/geometry/poseDescriptor.js";
5
- import { AUTO_POSE_DESCRIPTOR as a } from "../../interactions/actions/resize/autoPoseDescriptor.js";
6
- import { findShapeInk as o, shapeCoversPoint as s } from "../NodeShape.js";
2
+ import { framedBounds as n, poseDescriptorForNode as r } from "../../core/geometry/poseDescriptor.js";
3
+ import { AUTO_POSE_DESCRIPTOR as i } from "../../core/geometry/autoPoseDescriptor.js";
4
+ import { findShapeInk as a, shapeCoversPoint as o } from "../NodeShape.js";
5
+ import { asNodeId as s } from "../../core/scene/types.js";
7
6
  import { pickWalk as c, scenePickSource as l, scenePlaneOf as u } from "../pickWalk.js";
8
7
  import { pickTopMostHit as d } from "../../tools/builtin/pickTopMostHit.js";
9
8
  import { useSelectTool as f } from "../../tools/builtin/select/useSelectTool.js";
10
9
  import { snap as p } from "../../interactions/gestures/shared/snap.js";
11
10
  import { poseContains as m, poseContainsRotated as h } from "./poseGeometry.js";
12
- import { pathContainsPoint as g } from "@weasel-js/geom";
13
- import { useMemo as _ } from "react";
14
- import { useLatest as v } from "@weasel-js/react";
11
+ import { meanScale as g, pathContainsPoint as _ } from "@weasel-js/geom";
12
+ import { useMemo as v } from "react";
13
+ import { useLatest as y } from "@weasel-js/react";
15
14
  //#region src/canvas/SceneCanvas/useSceneSelectTool.ts
16
- var y = 4;
17
- function b(e) {
15
+ var b = 4;
16
+ function x(e) {
18
17
  return e && typeof e.x == "number" && typeof e.y == "number" ? {
19
18
  x: e.x,
20
19
  y: e.y,
21
20
  scale: e.scale
22
21
  } : null;
23
22
  }
24
- function x(x) {
25
- let { scene: S, adapter: C, geometry: w, selectTool: T, getView: E, alphaOf: D, layerIsPainted: O } = x, k = x.poseDescriptor ?? a, A = w?.pickEvery, j = w?.boundsOf, M = (w?.picking ?? "shape") === "shape", N = w?.pickTolerancePx ?? y, P = T?.move, F = T?.snap, I = _(() => {
26
- let e = { ...P ?? {} };
27
- if (F) {
23
+ function S(S) {
24
+ let { scene: C, adapter: w, geometry: T, selectTool: E, getView: D, alphaOf: O, layerIsPainted: k } = S, A = S.poseDescriptor ?? i, j = T?.pickEvery, M = T?.boundsOf, N = (T?.picking ?? "shape") === "shape", P = T?.pickTolerancePx ?? b, F = E?.move, I = E?.snap, L = v(() => {
25
+ let e = { ...F ?? {} };
26
+ if (I) {
28
27
  let t = e.behaviors ?? [];
29
- e.behaviors = [p(F), ...t];
28
+ e.behaviors = [p(I), ...t];
30
29
  }
31
30
  return e;
32
- }, [P, F]), L = _(() => (e, r, i) => {
33
- if (A) {
34
- let t = A(e, r);
31
+ }, [F, I]), R = v(() => (e, n, r) => {
32
+ if (j) {
33
+ let t = j(e, n);
35
34
  return t == null ? [] : Array.isArray(t) ? t : [t];
36
35
  }
37
- let a = i ?? E?.() ?? null, u = i?.alphaOf ?? D, d = i?.layerIsPainted ?? O, f = b(a), p = l(S, {
38
- getPose: (e) => C.getWorldPose(e),
39
- ...u ? { alphaOf: u } : {},
40
- ...d ? { layerIsPainted: d } : {},
41
- ...f ? { camera: f } : {}
42
- }), _ = (e, r, i) => {
43
- let a = n(i), c = {
44
- px: N,
45
- scale: i
36
+ let i = r ?? D?.() ?? null, s = r?.alphaOf ?? O, u = r?.layerIsPainted ?? k, d = x(i), f = l(C, {
37
+ getPose: (e) => w.getWorldPose(e),
38
+ ...s ? { alphaOf: s } : {},
39
+ ...u ? { layerIsPainted: u } : {},
40
+ ...d ? { camera: d } : {}
41
+ }), p = (e, n, r) => {
42
+ let i = g(r), s = {
43
+ px: P,
44
+ scale: r
46
45
  };
47
46
  return {
48
- hits: (t, n, i) => {
49
- let l = M ? o(t, n, { scale: a }) : null, u = {
50
- ...c,
51
- px: c.px + (l?.outsetPx ?? 0),
47
+ hits: (t, r, c) => {
48
+ let l = N ? a(t, r, { scale: i }) : null, u = {
49
+ ...s,
50
+ px: s.px + (l?.outsetPx ?? 0),
52
51
  reach: l?.outset ?? 0
53
52
  };
54
- return (i ? m(i, e, r, u, k) : h(n, e, r, u, k)) ? !M || s(t, n, e, r, {
55
- tolerance: c,
56
- scale: a,
57
- derivedPath: i
53
+ return (c ? m(c, e, n, u, A) : h(r, e, n, u, A)) ? !N || o(t, r, e, n, {
54
+ tolerance: s,
55
+ scale: i,
56
+ derivedPath: c
58
57
  }) : !1;
59
58
  },
60
- clipAdmits: (t) => g(t, e, r),
61
- inPlane: (n) => {
62
- let a = t(n, {
59
+ clipAdmits: (t) => _(t, e, n),
60
+ inPlane: (i) => {
61
+ let a = t(i, {
63
62
  x: e,
64
- y: r
63
+ y: n
65
64
  });
66
- return _(a.x, a.y, {
67
- x: i.x / n.scale.x,
68
- y: i.y / n.scale.y
65
+ return p(a.x, a.y, {
66
+ x: r.x / i.scale.x,
67
+ y: r.y / i.scale.y
69
68
  });
70
69
  }
71
70
  };
72
71
  };
73
- return c(p, _(e, r, a?.scale ?? {
72
+ return c(f, p(e, n, i?.scale ?? {
74
73
  x: 1,
75
74
  y: 1
76
75
  }));
77
76
  }, [
78
- S,
79
77
  C,
80
- A,
81
- M,
78
+ w,
79
+ j,
82
80
  N,
83
- E,
81
+ P,
84
82
  D,
85
83
  O,
86
- k
87
- ]), R = v(E), z = _(() => (e, t) => {
88
- let n = S.get(r(e)), i = b(t ?? R.current?.() ?? null);
89
- return !n || !i ? null : u(S.layers, i)?.(n.layer) ?? null;
90
- }, [S, R]), B = _(() => (t, n, a) => {
91
- let o = S.get(r(t));
84
+ k,
85
+ A
86
+ ]), z = y(D), B = v(() => (e, t) => {
87
+ let n = C.get(s(e)), r = x(t ?? z.current?.() ?? null);
88
+ return !n || !r ? null : u(C.layers, r)?.(n.layer) ?? null;
89
+ }, [C, z]), V = v(() => (t, i, a) => {
90
+ let o = C.get(s(t));
92
91
  if (!o) return null;
93
- let s = i(k, o), c = s.getBounds(n), l = s.getRotation?.(n) ?? c.rotation ?? 0, u = l ? {
94
- ...c,
95
- rotation: l
96
- } : c, d = z(t, a);
97
- return d ? e(d, u) : u;
92
+ let c = n(i, r(A, o)), l = B(t, a);
93
+ return l ? e(l, c) : c;
98
94
  }, [
99
- S,
100
- k,
101
- z
102
- ]), V = _(() => (e, t) => j ? j(e) : S.get(r(e)) ? B(e, C.getWorldPose(e), t) : null, [
103
- S,
104
95
  C,
105
- j,
96
+ A,
106
97
  B
98
+ ]), H = v(() => (e, t) => M ? M(e) : C.get(s(e)) ? V(e, w.getWorldPose(e), t) : null, [
99
+ C,
100
+ w,
101
+ M,
102
+ V
107
103
  ]);
108
104
  return {
109
- selectTool: f(C, {
110
- pickEvery: L,
111
- ...T?.pickBest ? { pickBest: T.pickBest } : {},
112
- ...T?.extendClickLocked ? { extendClickLocked: T.extendClickLocked } : {}
105
+ selectTool: f(w, {
106
+ pickEvery: R,
107
+ ...E?.pickBest ? { pickBest: E.pickBest } : {},
108
+ ...E?.extendClickLocked ? { extendClickLocked: E.extendClickLocked } : {}
113
109
  }),
114
- pickEvery: L,
115
- pickBest: _(() => (e, t, n) => {
116
- let r = L(e, t, n);
117
- return d(r, C);
118
- }, [L, C]),
119
- boundsOf: V,
120
- boundsOfPose: B,
121
- planeOfNode: z,
122
- moveOptions: I
110
+ pickEvery: R,
111
+ pickBest: v(() => (e, t, n) => {
112
+ let r = R(e, t, n);
113
+ return d(r, w);
114
+ }, [R, w]),
115
+ boundsOf: H,
116
+ boundsOfPose: V,
117
+ planeOfNode: B,
118
+ moveOptions: L
123
119
  };
124
120
  }
125
121
  //#endregion
126
- export { y as DEFAULT_PICK_TOLERANCE_PX, x as useSceneSelectTool };
122
+ export { b as DEFAULT_PICK_TOLERANCE_PX, S as useSceneSelectTool };
127
123
 
128
124
  //# sourceMappingURL=useSceneSelectTool.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useSceneSelectTool.js","names":["snap","snapBehavior","DEFAULT_PICK_TOLERANCE_PX","cameraOf","v","useSceneSelectTool","opts","args","d","AUTO_POSE_DESCRIPTOR","pickEveryProp","geometry","boundsOfProp","shapePicking","pickTolerancePx","moveOptions","snap$1","wiredMoveOptions","useMemo","merged","existing","snap","wiredHitBody","r","wx","wy","asked","view","getView","viewAlpha","alphaOf","viewLayers","layerIsPainted","camera","src","scenePickSource","scene","adapter","id","pointQuery","scale","meanScale","s","tolerance","ink","findShapeInk","n","pose","slop","derived","poseContains","px","py","poseContainsRotated","shapeCoversPoint","pathContainsPoint","clip","p","toPlane","m","pickWalk","getViewRef","useLatest","wiredPlaneOfNode","asNodeId","scenePlaneOf","wiredBoundsOfPose","g","poseDescriptorForNode","b","rot","own","plane","rectFromPlane","wiredBoundsOf","useSelectTool","ids","pickTopMostHit"],"sources":["../../../src/canvas/SceneCanvas/useSceneSelectTool.ts"],"sourcesContent":["/**\n * Scene-aware select-tool synthesis for `<SceneCanvas>`: a `useSelectTool`\n * over the caller's scene adapter, configured with kit-default pickEvery /\n * boundsOf derived from pose shape. Caller-supplied `pickEvery` / `boundsOf`\n * overrides via the `geometry` arg take precedence.\n */\nimport { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { SceneCanvasAdapter } from '../sceneAdapter';\nimport { pickWalk, scenePickSource, scenePlaneOf, type PickQuery, type ViewPickGates } from 'canvas/pickWalk';\nimport { rectFromPlane, toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { pathContainsPoint } from '@weasel-js/geom';\nimport { useSelectTool, type Bounds } from 'tools/builtin/select';\nimport { pickTopMostHit, type PickTopMostHitAdapter } from 'tools/builtin/pickTopMostHit';\nimport type { Node, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { UseMoveOptions } from 'interactions/actions/move/options';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport type { SnapStrategy } from 'interactions/gestures/types';\nimport { snap as snapBehavior } from 'interactions/gestures/shared/snap';\nimport { poseDescriptorForNode, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport { AUTO_POSE_DESCRIPTOR } from 'interactions/actions/resize/autoPoseDescriptor';\nimport { poseContains, poseContainsRotated } from './poseGeometry';\nimport { shapeCoversPoint, findShapeInk } from 'canvas/NodeShape';\nimport { meanScale } from 'core/viewport/meanScale';\n\n/**\n * Default grab slop around a shape's outline, in screen pixels.\n *\n * Four is the same number the path-pose stroke test has always used, and it's\n * the difference between a hairline being clickable and not: a 1px stroke is\n * half a world unit of reach at scale 1, which no pointing device can hit\n * reliably. It also lets a filled shape be grabbed a few pixels outside its\n * edge, which is what makes edge-adjacent dragging feel possible.\n */\nexport const DEFAULT_PICK_TOLERANCE_PX = 4;\n\n/** The view a pick is asked for. A world point carries neither the scale it\n * was produced under nor what that view paints, so a caller picking for a\n * view other than the surface's says both. A gate left out is the one this\n * hook was built with. */\nexport interface PickView extends ViewPickGates {\n scale: { x: number; y: number };\n /** The rest of the asking camera. Supplied, it lets a parallax layer be\n * picked through its plane; left out, every layer is taken to move with\n * the camera. */\n x?: number;\n y?: number;\n}\n\n/** A pick view that names a whole camera, or null. */\nfunction cameraOf(v: Pick<PickView, 'scale' | 'x' | 'y'> | null): View | null {\n return v && typeof v.x === 'number' && typeof v.y === 'number'\n ? { x: v.x, y: v.y, scale: v.scale }\n : null;\n}\n\nexport interface UseSceneSelectToolArgs<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** The adapter the select tool drives, built over `scene` with the same\n * `poseDescriptor`. Its world poses are what picking and bounds read. */\n adapter: SceneCanvasAdapter<TData, TLayer, TPose>;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n geometry?: {\n pickEvery?: (worldX: number, worldY: number) => string | string[] | null;\n boundsOf?: (id: string) => Bounds | null;\n /** How the default body-pick decides a node covers the pointer. Defaults\n * to `'shape'`; `'pose'` opts back down to the bare pose rect. See\n * `SceneCanvasProps.geometry.picking`. Ignored when `pickEvery` is\n * supplied — that override owns the whole test. */\n picking?: 'pose' | 'shape';\n /** Grab slop around a shape's outline, in screen pixels. See\n * `SceneCanvasProps.geometry.pickTolerancePx`. */\n pickTolerancePx?: number;\n };\n /** The surface's camera, for converting the screen-pixel pick tolerance into\n * world units. A caller picking for another view passes that view's camera\n * to `pickEvery` / `pickBest` instead. Omitted in tests and non-viewport\n * hosts, where scale is 1. */\n getView?: () => Pick<PickView, 'scale' | 'x' | 'y'> | null;\n /** The asking view's painted alpha per node — its `alphaFor` times any\n * per-node override alpha. A node the view paints at alpha 0 is not on\n * screen, so picking must not answer for it. */\n alphaOf?: (id: string) => number;\n /** The asking view's answer to \"does this scene layer reach the screen\".\n * `layerVisibility` and `layerOrder` both gate a layer out of the paint\n * (`drawLayers` drops any layer missing from a supplied order), and an\n * undrawn layer must not claim clicks. */\n layerIsPainted?: (layer: string) => boolean;\n selectTool?: {\n move?: UseMoveOptions<TPose>;\n resize?: UseResizeOptions<TPose>;\n snap?: SnapStrategy<TPose>;\n /** Override the body-pick used on click/pointerdown. Alt-aware: receives\n * the live alt state + current selection so consumers can implement\n * alt-cycling through an overlapping stack. Default: top-most hit\n * (alt ignored). Forwarded verbatim to `useSelectTool`. */\n pickBest?: (worldX: number, worldY: number, alt: boolean, sel: readonly string[]) => string | null;\n /** Forwarded verbatim to `useSelectTool`. See\n * `UseSelectToolOptions.extendClickLocked`. */\n extendClickLocked?: () => boolean;\n };\n}\n\nexport interface UseSceneSelectToolReturn<TData, TLayer extends string, TPose> {\n selectTool: ReturnType<typeof useSelectTool<Node<TData, TLayer, TPose>, TPose>>;\n /** Hit-test resolved with the caller's `geometry.pickEvery` (or the\n * pose-walk default). Forward this to `<Canvas pickEvery={...}>` so the\n * dispatcher's `getNodeAtPoint` returns the same node the select tool\n * picked — drag routes keyed on `target.kind` then resolve to `'*'`\n * (move) instead of `'empty'` (marquee). */\n pickEvery: (worldX: number, worldY: number, view?: PickView | null) => string[];\n /** Single-best hit under the world point, or null. Runs `pickEvery` then\n * collapses parent/child overlap via `pickTopMostHit` — matches the id\n * the select tool's pointerdown classifier would settle on for a bare\n * click. Exposed so debug HUDs can highlight the would-be selection. */\n pickBest: (worldX: number, worldY: number, view?: PickView | null) => string | null;\n /** World-space AABB of `id`, or null. Same as what the selection overlay +\n * affordance hit-test need. Exposed so SceneCanvas can pass it to the\n * `affordanceAt` thunk without re-deriving it. `view` is the camera the\n * box is drawn under — a plane node sits somewhere else in each — and\n * defaults to the surface's. */\n boundsOf: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** How `view`'s world (the surface's camera by default) maps into the plane\n * `id` is drawn through, or null when its layer moves with the camera. */\n planeOfNode: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) => PlaneMap | null;\n /** `boundsOf` for `id` drawn at `pose` rather than its own — how chrome\n * boxes an in-flight preview. Ignores a `geometry.boundsOf` override, which\n * answers only for a node's own pose. */\n boundsOfPose: (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** `selectTool.move` with `selectTool.snap` folded into its behaviors — what\n * the `move` preset's bindings carry. */\n moveOptions: UseMoveOptions<TPose>;\n}\n\nexport function useSceneSelectTool<TData, TLayer extends string, TPose>(\n args: UseSceneSelectToolArgs<TData, TLayer, TPose>,\n): UseSceneSelectToolReturn<TData, TLayer, TPose> {\n const { scene, adapter, geometry, selectTool: opts, getView, alphaOf, layerIsPainted } = args;\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const pickEveryProp = geometry?.pickEvery;\n const boundsOfProp = geometry?.boundsOf;\n // Default. The pose rect is the wrong answer for anything that isn't a\n // rectangle, so `'pose'` is the opt-out rather than the baseline. Cheap to\n // leave on: the rect pre-filter runs first and rejects every node the\n // pointer isn't over, and the survivors' silhouettes are memoized per node.\n const shapePicking = (geometry?.picking ?? 'shape') === 'shape';\n const pickTolerancePx = geometry?.pickTolerancePx ?? DEFAULT_PICK_TOLERANCE_PX;\n const moveOptions = opts?.move;\n const snap = opts?.snap;\n\n const wiredMoveOptions = useMemo<UseMoveOptions<TPose>>(() => {\n const merged: UseMoveOptions<TPose> = { ...(moveOptions ?? {}) };\n if (snap) {\n const existing = merged.behaviors ?? [];\n merged.behaviors = [snapBehavior(snap), ...existing];\n }\n return merged;\n }, [moveOptions, snap]);\n\n // Default pickEvery: walk renderOrder() forward (back-to-front) and collect\n // every node whose pose contains the world point. Order matches the\n // `useSelectTool` contract — last element is the topmost — so `pickTopMostHit`\n // picks correctly. Wraps the caller's `pickEvery` (string-or-null) into the\n // array form `useSelectTool` expects. `poseContainsRotated` reads\n // `pose.rotation` directly (the kit's one rotation convention), so rotated\n // shapes pick against their rendered, rotated body without a per-demo override.\n const wiredHitBody = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string[] => {\n if (pickEveryProp) {\n const r = pickEveryProp(wx, wy);\n if (r == null) return [];\n return Array.isArray(r) ? r : [r];\n }\n const asked = view ?? getView?.() ?? null;\n const viewAlpha = view?.alphaOf ?? alphaOf;\n const viewLayers = view?.layerIsPainted ?? layerIsPainted;\n const camera = cameraOf(asked);\n // Through the adapter, not `n.pose`: an ephemeral override is the pose\n // the renderer draws, so it has to be the one picking tests. World, not\n // local, for the same reason — a framed child is drawn in its parent's\n // frame, not where its own pose says.\n const src = scenePickSource<TData, TLayer, TPose>(scene, {\n getPose: (id) => adapter.getWorldPose(id),\n ...(viewAlpha ? { alphaOf: viewAlpha } : {}),\n ...(viewLayers ? { layerIsPainted: viewLayers } : {}),\n ...(camera ? { camera } : {}),\n });\n // `s` makes the slop a screen distance, so the grab zone stays the same\n // apparent thickness at any zoom and on every axis. A `{ px }` stroke's\n // reach is on screen too, and joins the slop there.\n const pointQuery = (px: number, py: number, s: { x: number; y: number }): PickQuery<TPose> => {\n const scale = meanScale(s);\n const tolerance = { px: pickTolerancePx, scale: s };\n return {\n hits: (n, pose, derived) => {\n // The pre-filter has to be at least as generous as the refinement\n // that follows it, or it rejects points the refinement would have\n // claimed. A stroke reaches past the pose box by `outset` — a whole\n // stroke width for an outer align — on top of the pointer slop.\n const ink = shapePicking ? findShapeInk(n as never, pose, { scale }) : null;\n // A derived node's pose is a placeholder — typically zero-sized at\n // the origin — so its own box rejects every point the path covers.\n // The path is the region to test instead, and `poseContains` already\n // reads a path-like pose as one.\n const slop = { ...tolerance, px: tolerance.px + (ink?.outsetPx ?? 0), reach: ink?.outset ?? 0 };\n const admitted = derived\n ? poseContains(derived as never, px, py, slop, d as PoseDescriptor<unknown>)\n : poseContainsRotated(pose, px, py, slop, d as PoseDescriptor<unknown>);\n if (!admitted) return false;\n // `shapeCoversPoint` narrows the rect to the ink the painter actually\n // lays down (and answers `true` for painters that have no silhouette,\n // so nothing becomes unpickable).\n return !shapePicking\n || shapeCoversPoint(n as never, pose, px, py, {\n tolerance, scale, derivedPath: derived,\n });\n },\n clipAdmits: (clip) => pathContainsPoint(clip, px, py),\n inPlane: (m) => {\n const p = toPlane(m, { x: px, y: py });\n return pointQuery(p.x, p.y, { x: s.x / m.scale.x, y: s.y / m.scale.y });\n },\n };\n };\n return pickWalk<TPose>(src, pointQuery(wx, wy, asked?.scale ?? { x: 1, y: 1 }));\n };\n }, [scene, adapter, pickEveryProp, shapePicking, pickTolerancePx, getView,\n alphaOf, layerIsPainted, d]);\n\n // Read through a ref: this is the chrome's bounds source, and a caller's\n // inline `getView` would otherwise rebuild it, and everything keyed on it,\n // every render.\n const getViewRef = useLatest(getView);\n const wiredPlaneOfNode = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): PlaneMap | null => {\n const n = scene.get(asNodeId(id));\n const camera = cameraOf(view ?? getViewRef.current?.() ?? null);\n if (!n || !camera) return null;\n return scenePlaneOf(scene.layers, camera)?.(n.layer) ?? null;\n };\n }, [scene, getViewRef]);\n\n const wiredBoundsOfPose = useMemo(() => {\n return (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n const n = scene.get(asNodeId(id));\n if (!n) return null;\n const g = poseDescriptorForNode(d, n);\n const b = g.getBounds(pose);\n const rot = g.getRotation?.(pose) ?? (b as { rotation?: number }).rotation ?? 0;\n const own = rot ? { ...b, rotation: rot } : b;\n // A plane node is drawn where its plane puts it, and the chrome has to\n // follow it there.\n const plane = wiredPlaneOfNode(id, view);\n return plane ? rectFromPlane(plane, own) : own;\n };\n }, [scene, d, wiredPlaneOfNode]);\n\n const wiredBoundsOf = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n if (boundsOfProp) return boundsOfProp(id);\n if (!scene.get(asNodeId(id))) return null;\n // World, not local: a framed child is drawn in its parent's frame, and\n // the chrome has to land on the ink.\n return wiredBoundsOfPose(id, adapter.getWorldPose(id), view);\n };\n }, [scene, adapter, boundsOfProp, wiredBoundsOfPose]);\n\n const selectTool = useSelectTool<Node<TData, TLayer, TPose>, TPose>(adapter, {\n pickEvery: wiredHitBody,\n ...(opts?.pickBest ? { pickBest: opts.pickBest } : {}),\n ...(opts?.extendClickLocked ? { extendClickLocked: opts.extendClickLocked } : {}),\n });\n\n\n const wiredPickBest = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string | null => {\n const ids = wiredHitBody(wx, wy, view);\n return pickTopMostHit(ids, adapter as unknown as PickTopMostHitAdapter);\n };\n }, [wiredHitBody, adapter]);\n\n return {\n selectTool,\n pickEvery: wiredHitBody,\n pickBest: wiredPickBest,\n boundsOf: wiredBoundsOf,\n boundsOfPose: wiredBoundsOfPose,\n planeOfNode: wiredPlaneOfNode,\n moveOptions: wiredMoveOptions,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"useSceneSelectTool.js","names":["snap","snapBehavior","DEFAULT_PICK_TOLERANCE_PX","cameraOf","v","useSceneSelectTool","opts","args","d","AUTO_POSE_DESCRIPTOR","pickEveryProp","geometry","boundsOfProp","shapePicking","pickTolerancePx","moveOptions","snap$1","wiredMoveOptions","useMemo","merged","existing","snap","wiredHitBody","r","wx","wy","asked","view","getView","viewAlpha","alphaOf","viewLayers","layerIsPainted","camera","src","scenePickSource","scene","adapter","id","pointQuery","scale","meanScale","s","tolerance","ink","findShapeInk","n","pose","slop","derived","poseContains","px","py","poseContainsRotated","shapeCoversPoint","pathContainsPoint","clip","p","toPlane","m","pickWalk","getViewRef","useLatest","wiredPlaneOfNode","asNodeId","scenePlaneOf","wiredBoundsOfPose","own","framedBounds","poseDescriptorForNode","plane","rectFromPlane","wiredBoundsOf","useSelectTool","ids","pickTopMostHit"],"sources":["../../../src/canvas/SceneCanvas/useSceneSelectTool.ts"],"sourcesContent":["/**\n * Scene-aware select-tool synthesis for `<SceneCanvas>`: a `useSelectTool`\n * over the caller's scene adapter, configured with kit-default pickEvery /\n * boundsOf derived from pose shape. Caller-supplied `pickEvery` / `boundsOf`\n * overrides via the `geometry` arg take precedence.\n */\nimport { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { SceneCanvasAdapter } from '../sceneAdapter';\nimport { pickWalk, scenePickSource, scenePlaneOf, type PickQuery, type ViewPickGates } from 'canvas/pickWalk';\nimport { rectFromPlane, toPlane, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { pathContainsPoint } from '@weasel-js/geom';\nimport { useSelectTool, type Bounds } from 'tools/builtin/select';\nimport { pickTopMostHit, type PickTopMostHitAdapter } from 'tools/builtin/pickTopMostHit';\nimport type { Node, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport type { UseMoveOptions } from 'interactions/actions/move/options';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport type { SnapStrategy } from 'interactions/gestures/types';\nimport { snap as snapBehavior } from 'interactions/gestures/shared/snap';\nimport { poseDescriptorForNode, type PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport { framedBounds } from 'core/geometry/poseDescriptor';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport { poseContains, poseContainsRotated } from './poseGeometry';\nimport { shapeCoversPoint, findShapeInk } from 'canvas/NodeShape';\nimport { meanScale } from '@weasel-js/geom';\n\n/**\n * Default grab slop around a shape's outline, in screen pixels.\n *\n * Four is the same number the path-pose stroke test has always used, and it's\n * the difference between a hairline being clickable and not: a 1px stroke is\n * half a world unit of reach at scale 1, which no pointing device can hit\n * reliably. It also lets a filled shape be grabbed a few pixels outside its\n * edge, which is what makes edge-adjacent dragging feel possible.\n */\nexport const DEFAULT_PICK_TOLERANCE_PX = 4;\n\n/** The view a pick is asked for. A world point carries neither the scale it\n * was produced under nor what that view paints, so a caller picking for a\n * view other than the surface's says both. A gate left out is the one this\n * hook was built with. */\nexport interface PickView extends ViewPickGates {\n scale: { x: number; y: number };\n /** The rest of the asking camera. Supplied, it lets a parallax layer be\n * picked through its plane; left out, every layer is taken to move with\n * the camera. */\n x?: number;\n y?: number;\n}\n\n/** A pick view that names a whole camera, or null. */\nfunction cameraOf(v: Pick<PickView, 'scale' | 'x' | 'y'> | null): View | null {\n return v && typeof v.x === 'number' && typeof v.y === 'number'\n ? { x: v.x, y: v.y, scale: v.scale }\n : null;\n}\n\nexport interface UseSceneSelectToolArgs<TData, TLayer extends string, TPose> {\n scene: Scene<TData, TLayer, TPose>;\n /** The adapter the select tool drives, built over `scene` with the same\n * `poseDescriptor`. Its world poses are what picking and bounds read. */\n adapter: SceneCanvasAdapter<TData, TLayer, TPose>;\n /** How to read and rewrite this scene's poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n geometry?: {\n pickEvery?: (worldX: number, worldY: number) => string | string[] | null;\n boundsOf?: (id: string) => Bounds | null;\n /** How the default body-pick decides a node covers the pointer. Defaults\n * to `'shape'`; `'pose'` opts back down to the bare pose rect. See\n * `SceneCanvasProps.geometry.picking`. Ignored when `pickEvery` is\n * supplied — that override owns the whole test. */\n picking?: 'pose' | 'shape';\n /** Grab slop around a shape's outline, in screen pixels. See\n * `SceneCanvasProps.geometry.pickTolerancePx`. */\n pickTolerancePx?: number;\n };\n /** The surface's camera, for converting the screen-pixel pick tolerance into\n * world units. A caller picking for another view passes that view's camera\n * to `pickEvery` / `pickBest` instead. Omitted in tests and non-viewport\n * hosts, where scale is 1. */\n getView?: () => Pick<PickView, 'scale' | 'x' | 'y'> | null;\n /** The asking view's painted alpha per node — its `alphaFor` times any\n * per-node override alpha. A node the view paints at alpha 0 is not on\n * screen, so picking must not answer for it. */\n alphaOf?: (id: string) => number;\n /** The asking view's answer to \"does this scene layer reach the screen\".\n * `layerVisibility` and `layerOrder` both gate a layer out of the paint\n * (`drawLayers` drops any layer missing from a supplied order), and an\n * undrawn layer must not claim clicks. */\n layerIsPainted?: (layer: string) => boolean;\n selectTool?: {\n move?: UseMoveOptions<TPose>;\n resize?: UseResizeOptions<TPose>;\n snap?: SnapStrategy<TPose>;\n /** Override the body-pick used on click/pointerdown. Alt-aware: receives\n * the live alt state + current selection so consumers can implement\n * alt-cycling through an overlapping stack. Default: top-most hit\n * (alt ignored). Forwarded verbatim to `useSelectTool`. */\n pickBest?: (worldX: number, worldY: number, alt: boolean, sel: readonly string[]) => string | null;\n /** Forwarded verbatim to `useSelectTool`. See\n * `UseSelectToolOptions.extendClickLocked`. */\n extendClickLocked?: () => boolean;\n };\n}\n\nexport interface UseSceneSelectToolReturn<TData, TLayer extends string, TPose> {\n selectTool: ReturnType<typeof useSelectTool<Node<TData, TLayer, TPose>, TPose>>;\n /** Every id under the world point, back-to-front (topmost last), from the\n * caller's `geometry.pickEvery` or the pose-walk default. */\n pickEvery: (worldX: number, worldY: number, view?: PickView | null) => string[];\n /** Single-best hit under the world point, or null. Runs `pickEvery` then\n * collapses parent/child overlap via `pickTopMostHit` — matches the id\n * the select tool's pointerdown classifier would settle on for a bare\n * click. The canvas's `getNodeAtPoint` resolves through it. */\n pickBest: (worldX: number, worldY: number, view?: PickView | null) => string | null;\n /** World-space AABB of `id`, or null. Same as what the selection overlay +\n * affordance hit-test need. Exposed so SceneCanvas can pass it to the\n * `affordanceAt` thunk without re-deriving it. `view` is the camera the\n * box is drawn under — a plane node sits somewhere else in each — and\n * defaults to the surface's. */\n boundsOf: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** How `view`'s world (the surface's camera by default) maps into the plane\n * `id` is drawn through, or null when its layer moves with the camera. */\n planeOfNode: (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) => PlaneMap | null;\n /** `boundsOf` for `id` drawn at `pose` rather than its own — how chrome\n * boxes an in-flight preview. Ignores a `geometry.boundsOf` override, which\n * answers only for a node's own pose. */\n boundsOfPose: (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null) =>\n import('core/viewport/fitViewToBounds').Bounds | null;\n /** `selectTool.move` with `selectTool.snap` folded into its behaviors — what\n * the `move` preset's bindings carry. */\n moveOptions: UseMoveOptions<TPose>;\n}\n\nexport function useSceneSelectTool<TData, TLayer extends string, TPose>(\n args: UseSceneSelectToolArgs<TData, TLayer, TPose>,\n): UseSceneSelectToolReturn<TData, TLayer, TPose> {\n const { scene, adapter, geometry, selectTool: opts, getView, alphaOf, layerIsPainted } = args;\n const d = (args.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const pickEveryProp = geometry?.pickEvery;\n const boundsOfProp = geometry?.boundsOf;\n // Default. The pose rect is the wrong answer for anything that isn't a\n // rectangle, so `'pose'` is the opt-out rather than the baseline. Cheap to\n // leave on: the rect pre-filter runs first and rejects every node the\n // pointer isn't over, and the survivors' silhouettes are memoized per node.\n const shapePicking = (geometry?.picking ?? 'shape') === 'shape';\n const pickTolerancePx = geometry?.pickTolerancePx ?? DEFAULT_PICK_TOLERANCE_PX;\n const moveOptions = opts?.move;\n const snap = opts?.snap;\n\n const wiredMoveOptions = useMemo<UseMoveOptions<TPose>>(() => {\n const merged: UseMoveOptions<TPose> = { ...(moveOptions ?? {}) };\n if (snap) {\n const existing = merged.behaviors ?? [];\n merged.behaviors = [snapBehavior(snap), ...existing];\n }\n return merged;\n }, [moveOptions, snap]);\n\n // Default pickEvery: walk renderOrder() forward (back-to-front) and collect\n // every node whose pose contains the world point. Order matches the\n // `useSelectTool` contract — last element is the topmost — so `pickTopMostHit`\n // picks correctly. Wraps the caller's `pickEvery` (string-or-null) into the\n // array form `useSelectTool` expects. `poseContainsRotated` reads\n // `pose.rotation` directly (the kit's one rotation convention), so rotated\n // shapes pick against their rendered, rotated body without a per-demo override.\n const wiredHitBody = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string[] => {\n if (pickEveryProp) {\n const r = pickEveryProp(wx, wy);\n if (r == null) return [];\n return Array.isArray(r) ? r : [r];\n }\n const asked = view ?? getView?.() ?? null;\n const viewAlpha = view?.alphaOf ?? alphaOf;\n const viewLayers = view?.layerIsPainted ?? layerIsPainted;\n const camera = cameraOf(asked);\n // Through the adapter, not `n.pose`: an ephemeral override is the pose\n // the renderer draws, so it has to be the one picking tests. World, not\n // local, for the same reason — a framed child is drawn in its parent's\n // frame, not where its own pose says.\n const src = scenePickSource<TData, TLayer, TPose>(scene, {\n getPose: (id) => adapter.getWorldPose(id),\n ...(viewAlpha ? { alphaOf: viewAlpha } : {}),\n ...(viewLayers ? { layerIsPainted: viewLayers } : {}),\n ...(camera ? { camera } : {}),\n });\n // `s` makes the slop a screen distance, so the grab zone stays the same\n // apparent thickness at any zoom and on every axis. A `{ px }` stroke's\n // reach is on screen too, and joins the slop there.\n const pointQuery = (px: number, py: number, s: { x: number; y: number }): PickQuery<TPose> => {\n const scale = meanScale(s);\n const tolerance = { px: pickTolerancePx, scale: s };\n return {\n hits: (n, pose, derived) => {\n // The pre-filter has to be at least as generous as the refinement\n // that follows it, or it rejects points the refinement would have\n // claimed. A stroke reaches past the pose box by `outset` — a whole\n // stroke width for an outer align — on top of the pointer slop.\n const ink = shapePicking ? findShapeInk(n as never, pose, { scale }) : null;\n // A derived node's pose is a placeholder — typically zero-sized at\n // the origin — so its own box rejects every point the path covers.\n // The path is the region to test instead, and `poseContains` already\n // reads a path-like pose as one.\n const slop = { ...tolerance, px: tolerance.px + (ink?.outsetPx ?? 0), reach: ink?.outset ?? 0 };\n const admitted = derived\n ? poseContains(derived as never, px, py, slop, d as PoseDescriptor<unknown>)\n : poseContainsRotated(pose, px, py, slop, d as PoseDescriptor<unknown>);\n if (!admitted) return false;\n // `shapeCoversPoint` narrows the rect to the ink the painter actually\n // lays down (and answers `true` for painters that have no silhouette,\n // so nothing becomes unpickable).\n return !shapePicking\n || shapeCoversPoint(n as never, pose, px, py, {\n tolerance, scale, derivedPath: derived,\n });\n },\n clipAdmits: (clip) => pathContainsPoint(clip, px, py),\n inPlane: (m) => {\n const p = toPlane(m, { x: px, y: py });\n return pointQuery(p.x, p.y, { x: s.x / m.scale.x, y: s.y / m.scale.y });\n },\n };\n };\n return pickWalk<TPose>(src, pointQuery(wx, wy, asked?.scale ?? { x: 1, y: 1 }));\n };\n }, [scene, adapter, pickEveryProp, shapePicking, pickTolerancePx, getView,\n alphaOf, layerIsPainted, d]);\n\n // Read through a ref: this is the chrome's bounds source, and a caller's\n // inline `getView` would otherwise rebuild it, and everything keyed on it,\n // every render.\n const getViewRef = useLatest(getView);\n const wiredPlaneOfNode = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): PlaneMap | null => {\n const n = scene.get(asNodeId(id));\n const camera = cameraOf(view ?? getViewRef.current?.() ?? null);\n if (!n || !camera) return null;\n return scenePlaneOf(scene.layers, camera)?.(n.layer) ?? null;\n };\n }, [scene, getViewRef]);\n\n const wiredBoundsOfPose = useMemo(() => {\n return (id: string, pose: TPose, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n const n = scene.get(asNodeId(id));\n if (!n) return null;\n const own = framedBounds(pose, poseDescriptorForNode(d, n));\n // A plane node is drawn where its plane puts it, and the chrome has to\n // follow it there.\n const plane = wiredPlaneOfNode(id, view);\n return plane ? rectFromPlane(plane, own) : own;\n };\n }, [scene, d, wiredPlaneOfNode]);\n\n const wiredBoundsOf = useMemo(() => {\n return (id: string, view?: Pick<PickView, 'scale' | 'x' | 'y'> | null): Bounds | null => {\n if (boundsOfProp) return boundsOfProp(id);\n if (!scene.get(asNodeId(id))) return null;\n // World, not local: a framed child is drawn in its parent's frame, and\n // the chrome has to land on the ink.\n return wiredBoundsOfPose(id, adapter.getWorldPose(id), view);\n };\n }, [scene, adapter, boundsOfProp, wiredBoundsOfPose]);\n\n const selectTool = useSelectTool<Node<TData, TLayer, TPose>, TPose>(adapter, {\n pickEvery: wiredHitBody,\n ...(opts?.pickBest ? { pickBest: opts.pickBest } : {}),\n ...(opts?.extendClickLocked ? { extendClickLocked: opts.extendClickLocked } : {}),\n });\n\n\n const wiredPickBest = useMemo(() => {\n return (wx: number, wy: number, view?: PickView | null): string | null => {\n const ids = wiredHitBody(wx, wy, view);\n return pickTopMostHit(ids, adapter as unknown as PickTopMostHitAdapter);\n };\n }, [wiredHitBody, adapter]);\n\n return {\n selectTool,\n pickEvery: wiredHitBody,\n pickBest: wiredPickBest,\n boundsOf: wiredBoundsOf,\n boundsOfPose: wiredBoundsOfPose,\n planeOfNode: wiredPlaneOfNode,\n moveOptions: wiredMoveOptions,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { isCustomEntry as e } from "../layerSlots.js";
2
+ import { buildSceneLayers as t } from "../buildSceneLayer.js";
3
+ import { wireSceneSlotToScene as n } from "../sceneSlotWiring.js";
4
+ import { useSceneLayerList as r } from "../useSceneLayerList.js";
5
+ import { useMemo as i } from "react";
6
+ //#region src/canvas/SceneCanvas/useSceneSlotLayers.ts
7
+ function a(a) {
8
+ let { slot: o, scene: s, adapter: c, alphaFor: l, colorOverrides: u, boundsOf: d, previewIds: f } = a, p = i(() => !o || e(o) ? o : n(o, s, l, u), [
9
+ o,
10
+ l,
11
+ s,
12
+ u
13
+ ]), m = r(c);
14
+ return {
15
+ config: p,
16
+ layers: i(() => {
17
+ if (e(p)) return { layers: [{
18
+ key: "scene",
19
+ layer: p.layer
20
+ }] };
21
+ if (p && p.drawOne) return { layers: t(p, c, d, () => {
22
+ let e = new Set(f() ?? []);
23
+ return e.size > 0 ? e : null;
24
+ }) };
25
+ }, [
26
+ p,
27
+ c,
28
+ d,
29
+ f,
30
+ m
31
+ ])
32
+ };
33
+ }
34
+ //#endregion
35
+ export { a as useSceneSlotLayers };
36
+
37
+ //# sourceMappingURL=useSceneSlotLayers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSceneSlotLayers.js","names":["useSceneSlotLayers","args","config","useMemo","slot","isCustomEntry","wireSceneSlotToScene","scene","alphaFor","colorOverrides","sceneLayersKey","useSceneLayerList","adapter","buildSceneLayers","boundsOf","ids","previewIds"],"sources":["../../../src/canvas/SceneCanvas/useSceneSlotLayers.ts"],"sourcesContent":["/**\n * The scene slot, built: the caller's config wired to the scene, and the\n * canvas layers it paints as. A hierarchical scene gets one canvas layer per\n * scene layer, so the list follows the scene's layers after mount.\n */\nimport { useMemo } from 'react';\nimport type { ColorOverrideRegistry } from '@weasel-js/animator';\nimport type { Node, Scene } from 'core/scene/types';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport { buildSceneLayers, type SceneSlotConfig } from '../buildSceneLayer';\nimport type { HierarchicalAdapter } from '../buildSceneTree';\nimport { isCustomEntry, type LayersMap, type SceneSlotLayers } from '../layerSlots';\nimport { wireSceneSlotToScene } from '../sceneSlotWiring';\nimport { useSceneLayerList } from '../useSceneLayerList';\n\ntype SceneSlot<TData, TLayer extends string, TPose> =\n LayersMap<Node<TData, TLayer, TPose>, TPose>['scene'];\n\nexport function useSceneSlotLayers<TData, TLayer extends string, TPose>(args: {\n /** The slot after `mergeLayersWithDefaults`. */\n slot: SceneSlot<TData, TLayer, TPose>;\n scene: Scene<TData, TLayer, TPose>;\n adapter: HierarchicalAdapter<Node<TData, TLayer, TPose>, TPose>;\n alphaFor: ((id: string) => number) | undefined;\n colorOverrides: ColorOverrideRegistry | undefined;\n /** Committed bounds of a node, for the debug overlay's record of it. */\n boundsOf: (id: string) => Bounds | null;\n /** Ids an in-flight gesture is ghosting; their committed paint is left out\n * so the source does not show through the ghost. */\n previewIds: () => Iterable<string> | null;\n}): {\n /** The scene-wired config, for whatever else paints with its `drawOne`. */\n config: SceneSlot<TData, TLayer, TPose>;\n /** Absent when the slot is empty or carries no `drawOne`; a pre-built layer is the whole slot. */\n layers: SceneSlotLayers | undefined;\n} {\n const { slot, scene, adapter, alphaFor, colorOverrides, boundsOf, previewIds } = args;\n\n const config = useMemo(() => {\n if (!slot || isCustomEntry(slot)) return slot;\n return wireSceneSlotToScene(\n slot as SceneSlotConfig<Node<TData, TLayer, TPose>, TPose>,\n scene,\n alphaFor,\n colorOverrides,\n );\n }, [slot, alphaFor, scene, colorOverrides]);\n\n const sceneLayersKey = useSceneLayerList(adapter);\n const layers = useMemo<SceneSlotLayers | undefined>(() => {\n if (isCustomEntry(config)) return { layers: [{ key: 'scene', layer: config.layer }] };\n if (!config || !config.drawOne) return undefined;\n return {\n layers: buildSceneLayers(config, adapter, boundsOf, () => {\n const ids = new Set(previewIds() ?? []);\n return ids.size > 0 ? ids : null;\n }),\n };\n // `sceneLayersKey` stands for `adapter.getLayers()`, which `buildSceneLayers` reads.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [config, adapter, boundsOf, previewIds, sceneLayersKey]);\n\n return { config, layers };\n}\n"],"mappings":";;;;;;AAkBA,SAAgBA,EAAwD,GAiBtE;CACA,IAAM,EAAE,SAAM,UAAO,YAAS,aAAU,mBAAgB,aAAU,kBAAeC,GAE3EC,IAASC,QACT,CAACC,KAAQC,EAAcD,CAAI,IAAUA,IAClCE,EACLF,GACAG,GACAC,GACAC,CACF,GACC;EAACL;EAAMI;EAAUD;EAAOE;CAAc,CAAC,GAEpCC,IAAiBC,EAAkBC,CAAO;CAchD,OAAO;EAAE;EAAQ,QAbFT,QAA2C;GACxD,IAAIE,EAAcH,CAAM,GAAG,OAAO,EAAE,QAAQ,CAAC;IAAE,KAAK;IAAS,OAAOA,EAAO;GAAM,CAAC,EAAE;GACpF,IAAKA,KAAWA,EAAO,SACvB,OAAO,EACL,QAAQW,EAAiBX,GAAQU,GAASE,SAAgB;IACxD,IAAMC,IAAM,IAAI,IAAIC,EAAW,KAAK,CAAC,CAAC;IACtC,OAAOD,EAAI,OAAO,IAAIA,IAAM;GAC9B,CAAC,EACH;EAGF,GAAG;GAACb;GAAQU;GAASE;GAAUE;GAAYN;EAAc,CAExC;CAAO;AAC1B"}
@@ -0,0 +1,38 @@
1
+ import { isCustomEntry as e } from "../layerSlots.js";
2
+ import { createSelectionOverlayLayer as t, rotationBadgeOf as n } from "../../features/selection/overlay.js";
3
+ import { useMemo as r } from "react";
4
+ //#region src/canvas/SceneCanvas/useSelectionOverlayLayer.ts
5
+ function i(i, a, o) {
6
+ let s = i && !e(i) ? n(i) : null, c = r(() => s, [s?.distancePx, s?.sizePx]);
7
+ return {
8
+ layer: r(() => {
9
+ if (i === null) return null;
10
+ if (e(i)) return i.layer;
11
+ let n = i ?? {}, r = n.getSuppressedIds, s = () => {
12
+ let e = a(), t = r?.();
13
+ if (!t || t.size === 0) return e;
14
+ if (e.size === 0) return t;
15
+ let n = new Set(t);
16
+ for (let t of e) n.add(t);
17
+ return n;
18
+ };
19
+ return t({
20
+ ...n,
21
+ getSuppressedIds: s,
22
+ ...n.poseById ? {
23
+ getPose: n.poseById,
24
+ poseDescriptor: n.poseDescriptor ?? o
25
+ } : {}
26
+ });
27
+ }, [
28
+ i,
29
+ a,
30
+ o
31
+ ]),
32
+ rotationBadge: c
33
+ };
34
+ }
35
+ //#endregion
36
+ export { i as useSelectionOverlayLayer };
37
+
38
+ //# sourceMappingURL=useSelectionOverlayLayer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelectionOverlayLayer.js","names":["useSelectionOverlayLayer","badge","slot","isCustomEntry","rotationBadgeOf","rotationBadge","useMemo","cfg","callerSuppress","getSuppressedIds","own","getOwnSuppressedIds","caller","merged","id","createSelectionOverlayLayer","poseDescriptor"],"sources":["../../../src/canvas/SceneCanvas/useSelectionOverlayLayer.ts"],"sourcesContent":["/**\n * The selection-overlay slot, built, and where it paints its rotate badge.\n * Both are `null` when the slot is switched off, and a pre-built layer has no badge.\n */\nimport { useMemo } from 'react';\nimport type { RenderLayer } from 'core/layers/render';\nimport { createSelectionOverlayLayer, rotationBadgeOf } from 'features/selection/overlay';\nimport type { PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport { isCustomEntry, type CustomLayerEntry, type SelectionOverlaySlotConfig } from '../layerSlots';\n\nexport function useSelectionOverlayLayer<TPose>(\n /** The slot after `mergeLayersWithDefaults`. */\n slot: SelectionOverlaySlotConfig<TPose> | CustomLayerEntry | null | undefined,\n /** Ids whose outline and handles other chrome replaces, on top of the\n * slot's own `getSuppressedIds`: the node whose anchors are being edited. */\n getOwnSuppressedIds: () => ReadonlySet<string>,\n /** What a slot's `poseById` is projected with when it names no descriptor. */\n poseDescriptor: PoseDescriptor<TPose>,\n): {\n layer: RenderLayer<unknown> | null;\n rotationBadge: ReturnType<typeof rotationBadgeOf>;\n} {\n const badge = slot && !isCustomEntry(slot) ? rotationBadgeOf(slot) : null;\n // Kept by value so the layers and hit-testers keyed on it don't rebuild\n // every render.\n const rotationBadge = useMemo(\n () => badge,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [badge?.distancePx, badge?.sizePx],\n );\n const layer = useMemo(() => {\n if (slot === null) return null;\n if (isCustomEntry(slot)) return slot.layer;\n const cfg = slot ?? {};\n const callerSuppress = cfg.getSuppressedIds;\n const getSuppressedIds = (): ReadonlySet<string> => {\n const own = getOwnSuppressedIds();\n const caller = callerSuppress?.();\n if (!caller || caller.size === 0) return own;\n if (own.size === 0) return caller;\n const merged = new Set<string>(caller);\n for (const id of own) merged.add(id);\n return merged;\n };\n return createSelectionOverlayLayer<TPose>({\n ...cfg,\n getSuppressedIds,\n // A caller's pose lookup still needs a geometry to project with; without\n // one the layer reads bounds off the chrome state and calls neither.\n ...(cfg.poseById\n ? { getPose: cfg.poseById, poseDescriptor: cfg.poseDescriptor ?? poseDescriptor }\n : {}),\n });\n }, [slot, getOwnSuppressedIds, poseDescriptor]);\n return { layer, rotationBadge };\n}\n"],"mappings":";;;;AAUA,SAAgBA,EAEd,GAGA,GAEA,GAIA;CACA,IAAMC,IAAQC,KAAQ,CAACC,EAAcD,CAAI,IAAIE,EAAgBF,CAAI,IAAI,MAG/DG,IAAgBC,QACdL,GAEN,CAACA,GAAO,YAAYA,GAAO,MAAM,CACnC;CAyBA,OAAO;EAAE,OAxBKK,QAAc;GAC1B,IAAIJ,MAAS,MAAM,OAAO;GAC1B,IAAIC,EAAcD,CAAI,GAAG,OAAOA,EAAK;GACrC,IAAMK,IAAML,KAAQ,CAAC,GACfM,IAAiBD,EAAI,kBACrBE,UAA8C;IAClD,IAAMC,IAAMC,EAAoB,GAC1BC,IAASJ,IAAiB;IAChC,IAAI,CAACI,KAAUA,EAAO,SAAS,GAAG,OAAOF;IACzC,IAAIA,EAAI,SAAS,GAAG,OAAOE;IAC3B,IAAMC,IAAS,IAAI,IAAYD,CAAM;IACrC,KAAK,IAAME,KAAMJ,GAAK,EAAO,IAAII,CAAE;IACnC,OAAOD;GACT;GACA,OAAOE,EAAmC;IACxC,GAAGR;IACH;IAGA,GAAIA,EAAI,WACJ;KAAE,SAASA,EAAI;KAAU,gBAAgBA,EAAI,kBAAkBS;IAAe,IAC9E,CAAC;GACP,CAAC;EACH,GAAG;GAACd;GAAMS;GAAqBK;EAAc,CACpC;EAAO;CAAc;AAChC"}
@@ -0,0 +1,20 @@
1
+ import { createSceneLayerGate as e } from "../sceneLayerPaint.js";
2
+ import { useOptionalViewRegistry as t } from "../viewRegistry.js";
3
+ import { useCallback as n, useState as r } from "react";
4
+ import { useLatest as i } from "@weasel-js/react";
5
+ //#region src/canvas/SceneCanvas/useViewLayerGate.ts
6
+ function a(a, o) {
7
+ let s = t(), c = i({
8
+ layerVisibility: a,
9
+ layerOrder: o
10
+ }), [l] = r(e), u = n((e) => l(s?.surface()?.layers() ?? [], c.current)(e), [
11
+ s,
12
+ l,
13
+ c
14
+ ]);
15
+ return a !== void 0 || o !== void 0 ? u : void 0;
16
+ }
17
+ //#endregion
18
+ export { a as useViewLayerGate };
19
+
20
+ //# sourceMappingURL=useViewLayerGate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useViewLayerGate.js","names":["useViewLayerGate","surfaceViewRegistry","useOptionalViewRegistry","layerPaintRef","useLatest","sceneLayerGate","useState","createSceneLayerGate","layerIsPainted","useCallback","layerId","layerVisibility","layerOrder"],"sources":["../../../src/canvas/SceneCanvas/useViewLayerGate.ts"],"sourcesContent":["import { useCallback, useState } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { createSceneLayerGate, type ViewLayerPaint } from '../sceneLayerPaint';\nimport { useOptionalViewRegistry } from '../viewRegistry';\n\n/**\n * Whether the surface's own view paints a scene layer, judged against the\n * stack `<Canvas>` composed and read at pick time, so a consumer slot anchored\n * between scene layers is weighed the way paint weighs it. Undefined when the\n * view hides nothing, so a pick walk skips the gate.\n */\nexport function useViewLayerGate(\n layerVisibility: ViewLayerPaint['layerVisibility'],\n layerOrder: ViewLayerPaint['layerOrder'],\n): ((layerId: string) => boolean) | undefined {\n const surfaceViewRegistry = useOptionalViewRegistry();\n const layerPaintRef = useLatest<ViewLayerPaint>({ layerVisibility, layerOrder });\n const [sceneLayerGate] = useState(createSceneLayerGate);\n const layerIsPainted = useCallback((layerId: string): boolean => (\n sceneLayerGate(surfaceViewRegistry?.surface()?.layers() ?? [], layerPaintRef.current)(layerId)\n ), [surfaceViewRegistry, sceneLayerGate, layerPaintRef]);\n return layerVisibility !== undefined || layerOrder !== undefined ? layerIsPainted : undefined;\n}\n"],"mappings":";;;;;AAWA,SAAgBA,EACd,GACA,GAC4C;CAC5C,IAAMC,IAAsBC,EAAwB,GAC9CC,IAAgBC,EAA0B;EAAE;EAAiB;CAAW,CAAC,GACzE,CAACC,KAAkBC,EAASC,CAAoB,GAChDC,IAAiBC,GAAa,MAClCJ,EAAeJ,GAAqB,QAAQ,CAAC,EAAE,OAAO,KAAK,CAAC,GAAGE,EAAc,OAAO,CAAC,CAACO,CAAO,GAC5F;EAACT;EAAqBI;EAAgBF;CAAa,CAAC;CACvD,OAAOQ,MAAoB,KAAA,KAAaC,MAAe,KAAA,IAAYJ,IAAiB,KAAA;AACtF"}
@@ -24,7 +24,15 @@ function o(o) {
24
24
  m
25
25
  ]);
26
26
  }
27
+ function s(e, t) {
28
+ if (e === !1) return !1;
29
+ let n = typeof e == "object" ? e : {};
30
+ return t ? {
31
+ ...n,
32
+ animate: t === !0 ? {} : t
33
+ } : n;
34
+ }
27
35
  //#endregion
28
- export { o as useViewportActions };
36
+ export { o as useViewportActions, s as viewportZoomOption };
29
37
 
30
38
  //# sourceMappingURL=useViewportActions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useViewportActions.js","names":["useViewportActions","args","reg","useActionsRegistry","regRef","useLatest","panKey","pan","zoomKey","zoom","pinchKey","pinchZoom","unregisters","makeViewportWheelPanAction","zoomAction","makeViewportZoomAction","makePinchZoomAction","u"],"sources":["../../../src/canvas/SceneCanvas/useViewportActions.ts"],"sourcesContent":["/**\n * `useViewportActions` — register the `viewport.pan`, `viewport.zoom` and\n * `viewport.pinchZoom` action descriptors from SceneCanvas's `viewport` prop.\n *\n * All three need the `view` dep that only SceneCanvas publishes via\n * `useViewDepSource`. `pan` and `zoom` live outside `KIT_STANDARD_DESCRIPTORS`\n * entirely and are registered here; `pinchZoom` is in that list (bare\n * `useStandardActions` consumers get it too), so this hook only re-registers a\n * clamp-configured one over it, or takes it away.\n *\n * Defaults: all three ON when omitted. Pass `pan: false` / `zoom: false` /\n * `pinchZoom: false` on the `viewport` prop to disable. Disabling mutes rather\n * than unregisters, so a sibling canvas sharing the registry keeps its own.\n *\n * Runs after `useStandardActions` in the same component, so the registry's\n * last-writer-wins ordering resolves the `pinchZoom` overlap.\n */\nimport { useEffect } from 'react';\nimport { useActionsRegistry } from '@weasel-js/routing/react';\nimport { useLatest } from '@weasel-js/react';\nimport {\n makeViewportWheelPanAction,\n type WheelPanOptions,\n} from 'interactions/actions/defaults/viewportWheelPan';\nimport {\n makeViewportZoomAction,\n type ViewportZoomOptions,\n} from 'interactions/actions/defaults/viewportZoom';\nimport {\n makePinchZoomAction,\n type PinchZoomOptions,\n} from 'interactions/actions/defaults/pinchZoom';\n\nexport function useViewportActions(args: {\n /** `true`/`false` toggles wheel pan; an object locks its axis (see\n * {@link WheelPanOptions}). */\n pan: boolean | WheelPanOptions;\n /** `true`/`false` toggles the default Cmd+wheel zoom; an object tunes the\n * wheel trigger + scale clamp (see {@link ViewportZoomOptions}). */\n zoom: boolean | ViewportZoomOptions;\n /** `true`/`false` toggles two-finger pinch zoom; an object sets its scale\n * clamp (see {@link PinchZoomOptions}). */\n pinchZoom: boolean | PinchZoomOptions;\n}): void {\n const { pan, zoom, pinchZoom } = args;\n const reg = useActionsRegistry();\n const regRef = useLatest(reg);\n\n // Serialize the object configs so the effect re-runs when their fields change\n // (object identity isn't stable across renders for inline literals).\n // JSON.stringify drops function-valued fields, so changing only\n // `animate.easing` does not re-register — pass a stable easing.\n const panKey = typeof pan === 'object' ? JSON.stringify(pan) : String(pan);\n const zoomKey = typeof zoom === 'object' ? JSON.stringify(zoom) : String(zoom);\n const pinchKey = typeof pinchZoom === 'object' ? JSON.stringify(pinchZoom) : String(pinchZoom);\n\n useEffect(() => {\n const r = regRef.current;\n if (!r) return;\n const unregisters: Array<() => void> = [];\n if (pan) {\n unregisters.push(\n r.register(makeViewportWheelPanAction(typeof pan === 'object' ? pan : {})),\n );\n }\n if (zoom) {\n const zoomAction =\n typeof zoom === 'object' ? makeViewportZoomAction(zoom) : makeViewportZoomAction();\n unregisters.push(r.register(zoomAction));\n }\n if (pinchZoom) {\n unregisters.push(\n r.register(makePinchZoomAction(typeof pinchZoom === 'object' ? pinchZoom : {})),\n );\n } else {\n unregisters.push(r.mute('viewport.pinchZoom'));\n }\n return () => { for (const u of unregisters) u(); };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- configs tracked via zoomKey / pinchKey\n }, [panKey, zoomKey, pinchKey]);\n}\n"],"mappings":";;;;;;;AAiCA,SAAgBA,EAAmB,GAU1B;CACP,IAAM,EAAE,QAAK,SAAM,iBAAcC,GAC3BC,IAAMC,EAAmB,GACzBC,IAASC,EAAUH,CAAG,GAMtBI,IAAS,OAAOC,KAAQ,WAAW,KAAK,UAAUA,CAAG,IAAI,OAAOA,CAAG,GACnEC,IAAU,OAAOC,KAAS,WAAW,KAAK,UAAUA,CAAI,IAAI,OAAOA,CAAI,GACvEC,IAAW,OAAOC,KAAc,WAAW,KAAK,UAAUA,CAAS,IAAI,OAAOA,CAAS;CAE7F,QAAgB;EACd,IAAM,IAAIP,EAAO;EACjB,IAAI,CAAC,GAAG;EACR,IAAMQ,IAAiC,CAAC;EAMxC,IALIL,KACFK,EAAY,KACV,EAAE,SAASC,EAA2B,OAAON,KAAQ,WAAWA,IAAM,CAAC,CAAC,CAAC,CAC3E,GAEEE,GAAM;GACR,IAAMK,IACJ,OAAOL,KAAS,WAAWM,EAAuBN,CAAI,IAAIM,EAAuB;GACnF,EAAY,KAAK,EAAE,SAASD,CAAU,CAAC;EACzC;EAQA,OAPIH,IACFC,EAAY,KACV,EAAE,SAASI,EAAoB,OAAOL,KAAc,WAAWA,IAAY,CAAC,CAAC,CAAC,CAChF,IAEAC,EAAY,KAAK,EAAE,KAAK,oBAAoB,CAAC,SAElC;GAAE,KAAK,IAAMK,KAAKL,GAAa,EAAE;EAAG;CAEnD,GAAG;EAACN;EAAQE;EAASE;CAAQ,CAAC;AAChC"}
1
+ {"version":3,"file":"useViewportActions.js","names":["useViewportActions","args","reg","useActionsRegistry","regRef","useLatest","panKey","pan","zoomKey","zoom","pinchKey","pinchZoom","unregisters","makeViewportWheelPanAction","zoomAction","makeViewportZoomAction","makePinchZoomAction","u","viewportZoomOption","base","animatedZoom"],"sources":["../../../src/canvas/SceneCanvas/useViewportActions.ts"],"sourcesContent":["/**\n * Registers the wheel pan, zoom, and pinch zoom actions from SceneCanvas's\n * `viewport` prop.\n *\n * Wheel pan and zoom are registered only here. `pinchZoom` is also a kit\n * standard action, so this hook re-registers a configured one over it, or\n * mutes it — muting rather than unregistering, so a sibling canvas sharing the\n * registry keeps its own. That overlap is why this must run after\n * `useStandardActions`.\n */\nimport { useEffect } from 'react';\nimport { useActionsRegistry } from '@weasel-js/routing/react';\nimport { useLatest } from '@weasel-js/react';\nimport {\n makeViewportWheelPanAction,\n type WheelPanOptions,\n} from 'interactions/actions/defaults/viewportWheelPan';\nimport {\n makeViewportZoomAction,\n type ViewportZoomOptions,\n} from 'interactions/actions/defaults/viewportZoom';\nimport {\n makePinchZoomAction,\n type PinchZoomOptions,\n} from 'interactions/actions/defaults/pinchZoom';\n\nexport function useViewportActions(args: {\n /** `true`/`false` toggles wheel pan; an object locks its axis (see\n * {@link WheelPanOptions}). */\n pan: boolean | WheelPanOptions;\n /** `true`/`false` toggles the default Cmd+wheel zoom; an object tunes the\n * wheel trigger + scale clamp (see {@link ViewportZoomOptions}). */\n zoom: boolean | ViewportZoomOptions;\n /** `true`/`false` toggles two-finger pinch zoom; an object sets its scale\n * clamp (see {@link PinchZoomOptions}). */\n pinchZoom: boolean | PinchZoomOptions;\n}): void {\n const { pan, zoom, pinchZoom } = args;\n const reg = useActionsRegistry();\n const regRef = useLatest(reg);\n\n // Serialized so the effect re-runs when a config's fields change, not its\n // identity. JSON.stringify drops function-valued fields, so changing only\n // `animate.easing` does not re-register — pass a stable easing.\n const panKey = typeof pan === 'object' ? JSON.stringify(pan) : String(pan);\n const zoomKey = typeof zoom === 'object' ? JSON.stringify(zoom) : String(zoom);\n const pinchKey = typeof pinchZoom === 'object' ? JSON.stringify(pinchZoom) : String(pinchZoom);\n\n useEffect(() => {\n const r = regRef.current;\n if (!r) return;\n const unregisters: Array<() => void> = [];\n if (pan) {\n unregisters.push(\n r.register(makeViewportWheelPanAction(typeof pan === 'object' ? pan : {})),\n );\n }\n if (zoom) {\n const zoomAction =\n typeof zoom === 'object' ? makeViewportZoomAction(zoom) : makeViewportZoomAction();\n unregisters.push(r.register(zoomAction));\n }\n if (pinchZoom) {\n unregisters.push(\n r.register(makePinchZoomAction(typeof pinchZoom === 'object' ? pinchZoom : {})),\n );\n } else {\n unregisters.push(r.mute('viewport.pinchZoom'));\n }\n return () => { for (const u of unregisters) u(); };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- configs tracked via zoomKey / pinchKey\n }, [panKey, zoomKey, pinchKey]);\n}\n\n/**\n * `viewport.zoom` with `viewport.animatedZoom` folded in as the zoom action's\n * `animate` option, the way `pinchZoom` carries the pinch tool's clamp.\n */\nexport function viewportZoomOption(\n zoom: boolean | ViewportZoomOptions | undefined,\n animatedZoom: ViewportZoomOptions['animate'] | undefined,\n): boolean | ViewportZoomOptions {\n if (zoom === false) return false;\n const base = typeof zoom === 'object' ? zoom : {};\n if (!animatedZoom) return base;\n return { ...base, animate: animatedZoom === true ? {} : animatedZoom };\n}\n"],"mappings":";;;;;;;AA0BA,SAAgBA,EAAmB,GAU1B;CACP,IAAM,EAAE,QAAK,SAAM,iBAAcC,GAC3BC,IAAMC,EAAmB,GACzBC,IAASC,EAAUH,CAAG,GAKtBI,IAAS,OAAOC,KAAQ,WAAW,KAAK,UAAUA,CAAG,IAAI,OAAOA,CAAG,GACnEC,IAAU,OAAOC,KAAS,WAAW,KAAK,UAAUA,CAAI,IAAI,OAAOA,CAAI,GACvEC,IAAW,OAAOC,KAAc,WAAW,KAAK,UAAUA,CAAS,IAAI,OAAOA,CAAS;CAE7F,QAAgB;EACd,IAAM,IAAIP,EAAO;EACjB,IAAI,CAAC,GAAG;EACR,IAAMQ,IAAiC,CAAC;EAMxC,IALIL,KACFK,EAAY,KACV,EAAE,SAASC,EAA2B,OAAON,KAAQ,WAAWA,IAAM,CAAC,CAAC,CAAC,CAC3E,GAEEE,GAAM;GACR,IAAMK,IACJ,OAAOL,KAAS,WAAWM,EAAuBN,CAAI,IAAIM,EAAuB;GACnF,EAAY,KAAK,EAAE,SAASD,CAAU,CAAC;EACzC;EAQA,OAPIH,IACFC,EAAY,KACV,EAAE,SAASI,EAAoB,OAAOL,KAAc,WAAWA,IAAY,CAAC,CAAC,CAAC,CAChF,IAEAC,EAAY,KAAK,EAAE,KAAK,oBAAoB,CAAC,SAElC;GAAE,KAAK,IAAMK,KAAKL,GAAa,EAAE;EAAG;CAEnD,GAAG;EAACN;EAAQE;EAASE;CAAQ,CAAC;AAChC;AAMA,SAAgBQ,EACd,GACA,GAC+B;CAC/B,IAAIT,MAAS,IAAO,OAAO;CAC3B,IAAMU,IAAO,OAAOV,KAAS,WAAWA,IAAO,CAAC;CAEhD,OADKW,IACE;EAAE,GAAGD;EAAM,SAASC,MAAiB,KAAO,CAAC,IAAIA;CAAa,IAD3CD;AAE5B"}
@@ -0,0 +1,9 @@
1
+ import { clientToWorld as e } from "../../core/viewport/clientToWorld.js";
2
+ //#region src/canvas/SceneCanvas/worldPointAt.ts
3
+ function t(t, n, r, i) {
4
+ return !n || n.id === null ? t.clientToWorld(r, i) : e(r, i, n.origin, n.view);
5
+ }
6
+ //#endregion
7
+ export { t as worldPointAt };
8
+
9
+ //# sourceMappingURL=worldPointAt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worldPointAt.js","names":["worldPointAt","target","api","clientX","clientY","clientToWorld"],"sources":["../../../src/canvas/SceneCanvas/worldPointAt.ts"],"sourcesContent":["import { clientToWorld } from 'core/viewport/clientToWorld';\nimport type { ViewTarget } from 'features/viewports/viewResolver';\nimport type { CanvasExtensionApi } from '../canvasExtension';\n\n/**\n * A client point in the world of the view it resolved to. The canvas's own\n * view converts through the handle, which honors a `clientToWorld` override;\n * a declared view has a rect and a camera of its own, which the override\n * knows nothing about.\n */\nexport function worldPointAt(\n api: Pick<CanvasExtensionApi, 'clientToWorld'>,\n target: ViewTarget | undefined,\n clientX: number,\n clientY: number,\n): [number, number] {\n if (!target || target.id === null) return api.clientToWorld(clientX, clientY);\n return clientToWorld(clientX, clientY, target.origin, target.view);\n}\n"],"mappings":";;AAUA,SAAgBA,EACd,GACA,GACA,GACA,GACkB;CAElB,OADI,CAACC,KAAUA,EAAO,OAAO,OAAaC,EAAI,cAAcC,GAASC,CAAO,IACrEC,EAAcF,GAASC,GAASH,EAAO,QAAQA,EAAO,IAAI;AACnE"}