@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,130 @@
1
+ import { createSetDataOp as e } from "../../../core/ops/setData.js";
2
+ import { defaultCommitAdapter as t } from "../../../interactions/actions/defaultCommitAdapter.js";
3
+ import { unplaceSkeleton as n } from "../../../animation/rig/rigNode.js";
4
+ import { sceneReach as r } from "./placedRig.js";
5
+ import { ActionDisabledReason as i } from "@weasel-js/routing";
6
+ import { addJoint as a, dropSkinJoints as o, jointAt as s, jointPositions as c, moveJoint as l, removeJoint as u } from "@weasel-js/animator";
7
+ //#region src/tools/builtin/bone/boneActions.ts
8
+ var d = { capability: "edits-page" }, f = (e, t) => r(t, e.reachPx()), p = (e, t) => {
9
+ let n = e.state.active();
10
+ return n !== null && t.joints.some((e) => e.name === n) ? n : null;
11
+ };
12
+ function m(r, i, a, s, c, l = []) {
13
+ let u = r.get(a);
14
+ if (!u) return;
15
+ let d = [e({
16
+ id: a,
17
+ from: u.data,
18
+ to: {
19
+ ...u.data,
20
+ skeleton: n(s, u.pose)
21
+ },
22
+ label: c
23
+ })], f = (t) => {
24
+ for (let n of r.childrenOf(t)) {
25
+ let t = r.get(n)?.data, i = t?.skin && o(t.skin, l);
26
+ i && i !== t.skin && d.push(e({
27
+ id: n,
28
+ from: t,
29
+ to: {
30
+ ...t,
31
+ skin: i
32
+ },
33
+ label: c
34
+ })), f(n);
35
+ }
36
+ };
37
+ l.length > 0 && f(a), i.applyOps ? i.applyOps(d, c) : r.applyBatch(d, c, t(r, i.selection?.adapterMethods));
38
+ }
39
+ function h(e, t) {
40
+ return {
41
+ id: "bone.drag",
42
+ label: "Bone — move a joint or draw a bone",
43
+ eligible: d,
44
+ requires: [
45
+ "view",
46
+ "selection",
47
+ "applyOps"
48
+ ],
49
+ enabled: t,
50
+ invoker: {
51
+ timing: "ongoing",
52
+ start: ({ deps: t, drag: n, world: r }) => {
53
+ let i = e.placed();
54
+ if (!i) return {};
55
+ let o = n?.start ?? r, u = e.state.active(), d = s(i.skeleton, o.x, o.y, f(e, t)), h = i.skeleton, g = d;
56
+ if (g === null) {
57
+ let t = p(e, h);
58
+ t === null && ({skeleton: h, name: t} = a(h, null, o.x, o.y)), {skeleton: h, name: g} = a(h, t, o.x, o.y);
59
+ }
60
+ let _ = g, v = c(h).get(_);
61
+ return e.state.setActive(_), e.show(h), {
62
+ onMove: (t) => {
63
+ e.show(l(h, _, v.x + t.world.x - o.x, v.y + t.world.y - o.y));
64
+ },
65
+ onEnd: (n, r) => {
66
+ let a = e.shown();
67
+ if (e.show(null), r === "cancel" || !a) {
68
+ e.state.setActive(u);
69
+ return;
70
+ }
71
+ m(e.scene(), t, i.id, a, d === null ? "Add bone" : "Move joint");
72
+ }
73
+ };
74
+ }
75
+ }
76
+ };
77
+ }
78
+ function g(e) {
79
+ let t = () => e.placed() ? !0 : i.NotApplicable, n = () => {
80
+ let t = e.placed();
81
+ return t && p(e, t.skeleton) !== null ? !0 : i.NotApplicable;
82
+ };
83
+ return [
84
+ h(e, t),
85
+ {
86
+ id: "bone.pick",
87
+ label: "Bone — pick the active joint",
88
+ eligible: d,
89
+ requires: ["view"],
90
+ enabled: t,
91
+ invoker: {
92
+ timing: "immediate",
93
+ run: (t, n) => {
94
+ let r = n, i = e.placed();
95
+ i && r?.pressX !== void 0 && r.pressY !== void 0 && e.state.setActive(s(i.skeleton, r.pressX, r.pressY, f(e, t)));
96
+ }
97
+ }
98
+ },
99
+ {
100
+ id: "bone.remove",
101
+ label: "Bone — remove the active joint",
102
+ eligible: d,
103
+ requires: ["selection", "applyOps"],
104
+ enabled: n,
105
+ invoker: {
106
+ timing: "immediate",
107
+ run: (t) => {
108
+ let n = e.placed(), r = n && p(e, n.skeleton);
109
+ if (!n || r == null) return;
110
+ let i = n.skeleton.joints.find((e) => e.name === r).parent, { skeleton: a, removed: o } = u(n.skeleton, r);
111
+ m(e.scene(), t, n.id, a, "Remove joint", o), e.state.setActive(i);
112
+ }
113
+ }
114
+ },
115
+ {
116
+ id: "bone.clear",
117
+ label: "Bone — clear the active joint",
118
+ eligible: d,
119
+ enabled: n,
120
+ invoker: {
121
+ timing: "immediate",
122
+ run: () => e.state.setActive(null)
123
+ }
124
+ }
125
+ ];
126
+ }
127
+ //#endregion
128
+ export { g as createBoneActions };
129
+
130
+ //# sourceMappingURL=boneActions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boneActions.js","names":["eligible","reachOf","sceneReach","deps","env","activeIn","name","skeleton","j","commitSkeleton","node","scene","id","ops","createSetDataOp","unplaceSkeleton","next","strip","child","parent","data","kept","dropSkinJoints","removed","label","defaultCommitAdapter","dragAction","editing","at","press","drag","world","before","hit","jointAt","origin","addJoint","joint","from","jointPositions","moveJoint","move","reason","createBoneActions","ActionDisabledReason","hasActive","p","params","removeJoint"],"sources":["../../../../src/tools/builtin/bone/boneActions.ts"],"sourcesContent":["import type { Action, ActionDeps, InvocationCtx } from '@weasel-js/routing';\nimport { ActionDisabledReason } from '@weasel-js/routing';\nimport type { Op } from '@weasel-js/history';\nimport { createSetDataOp } from 'core/ops/setData';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { defaultCommitAdapter } from 'interactions/actions/defaultCommitAdapter';\nimport { unplaceSkeleton, type RigNodeData } from '../../../animation/rig/rigNode';\nimport { addJoint, dropSkinJoints, jointAt, jointPositions, moveJoint, removeJoint } from '@weasel-js/animator';\nimport type { Skeleton } from '@weasel-js/animator';\nimport { sceneReach, type PlacedRig } from './placedRig';\nimport type { RigEditState } from './rigEditState';\n\n/** What the bone tool's actions read and write, all of it the tool's own. */\nexport interface BoneEnv {\n scene(): Scene<unknown, string, unknown>;\n /** The rig node and its skeleton in the scene's space, or `null` with nothing to edit. */\n placed(): PlacedRig | null;\n state: RigEditState;\n /** Screen px around a joint within which a press takes it. */\n reachPx(): number;\n /** Show `skeleton` in place of the document's while a drag shapes it; `null` ends that. */\n show(skeleton: Skeleton | null): void;\n shown(): Skeleton | null;\n}\n\nconst eligible = { capability: 'edits-page' } as const;\n\nconst reachOf = (env: BoneEnv, deps: ActionDeps): number => sceneReach(deps, env.reachPx());\n\nconst activeIn = (env: BoneEnv, skeleton: Skeleton): string | null => {\n const name = env.state.active();\n return name !== null && skeleton.joints.some((j) => j.name === name) ? name : null;\n};\n\n/** Write `next`, a skeleton in the scene's space, into the rig node, and take `removed`\n * joints out of the skins under it, as one undo entry. */\nfunction commitSkeleton(\n scene: Scene<unknown, string, unknown>,\n deps: ActionDeps,\n id: NodeId,\n next: Skeleton,\n label: string,\n removed: readonly string[] = [],\n): void {\n const node = scene.get(id);\n if (!node) return;\n const ops: Op[] = [createSetDataOp({\n id, from: node.data, to: { ...(node.data as object), skeleton: unplaceSkeleton(next, node.pose) }, label,\n })];\n const strip = (parent: NodeId): void => {\n for (const child of scene.childrenOf(parent)) {\n const data = scene.get(child)?.data as RigNodeData | null | undefined;\n const kept = data?.skin && dropSkinJoints(data.skin, removed);\n if (kept && kept !== data.skin) ops.push(createSetDataOp({ id: child, from: data, to: { ...data, skin: kept }, label }));\n strip(child);\n }\n };\n if (removed.length > 0) strip(id);\n if (deps.applyOps) deps.applyOps(ops, label);\n else scene.applyBatch(ops, label, defaultCommitAdapter(scene, deps.selection?.adapterMethods));\n}\n\nfunction dragAction(env: BoneEnv, editing: () => true | ActionDisabledReason): Action {\n return {\n id: 'bone.drag',\n label: 'Bone — move a joint or draw a bone',\n eligible,\n requires: ['view', 'selection', 'applyOps'],\n enabled: editing,\n invoker: {\n timing: 'ongoing',\n start: ({ deps, drag, world }: InvocationCtx) => {\n const at = env.placed();\n if (!at) return {};\n const press = drag?.start ?? world;\n const before = env.state.active();\n const hit = jointAt(at.skeleton, press.x, press.y, reachOf(env, deps));\n let origin = at.skeleton;\n let name = hit;\n if (name === null) {\n let parent = activeIn(env, origin);\n if (parent === null) ({ skeleton: origin, name: parent } = addJoint(origin, null, press.x, press.y));\n ({ skeleton: origin, name } = addJoint(origin, parent, press.x, press.y));\n }\n const joint = name;\n const from = jointPositions(origin).get(joint)!;\n env.state.setActive(joint);\n env.show(origin);\n return {\n onMove: (move: InvocationCtx) => {\n env.show(moveJoint(origin, joint, from.x + move.world.x - press.x, from.y + move.world.y - press.y));\n },\n // The dispatcher hands `onEnd` a context with empty deps.\n onEnd: (_end: InvocationCtx, reason: 'commit' | 'cancel') => {\n const next = env.shown();\n env.show(null);\n if (reason === 'cancel' || !next) {\n env.state.setActive(before);\n return;\n }\n commitSkeleton(env.scene(), deps, at.id, next, hit === null ? 'Add bone' : 'Move joint');\n },\n };\n },\n },\n };\n}\n\n/** The bone tool's actions: `bone.drag`, `bone.pick`, `bone.remove`, and `bone.clear`. */\nexport function createBoneActions(env: BoneEnv): Action[] {\n const editing = () => (env.placed() ? true : ActionDisabledReason.NotApplicable);\n const hasActive = () => {\n const at = env.placed();\n return at && activeIn(env, at.skeleton) !== null ? true : ActionDisabledReason.NotApplicable;\n };\n return [\n dragAction(env, editing),\n {\n id: 'bone.pick',\n label: 'Bone — pick the active joint',\n eligible,\n requires: ['view'],\n enabled: editing,\n invoker: {\n timing: 'immediate',\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number } | undefined;\n const at = env.placed();\n if (!at || p?.pressX === undefined || p.pressY === undefined) return;\n env.state.setActive(jointAt(at.skeleton, p.pressX, p.pressY, reachOf(env, deps)));\n },\n },\n },\n {\n id: 'bone.remove',\n label: 'Bone — remove the active joint',\n eligible,\n requires: ['selection', 'applyOps'],\n // Declining with no joint active leaves Delete to the ambient `delete`.\n enabled: hasActive,\n invoker: {\n timing: 'immediate',\n run: (deps) => {\n const at = env.placed();\n const name = at && activeIn(env, at.skeleton);\n if (!at || name == null) return;\n const parent = at.skeleton.joints.find((j) => j.name === name)!.parent;\n const { skeleton, removed } = removeJoint(at.skeleton, name);\n commitSkeleton(env.scene(), deps, at.id, skeleton, 'Remove joint', removed);\n env.state.setActive(parent);\n },\n },\n },\n {\n id: 'bone.clear',\n label: 'Bone — clear the active joint',\n eligible,\n enabled: hasActive,\n invoker: { timing: 'immediate', run: () => env.state.setActive(null) },\n },\n ];\n}\n"],"mappings":";;;;;;;AAyBA,IAAMA,IAAW,EAAE,YAAY,aAAa,GAEtCC,KAAW,GAAc,MAA6BC,EAAWC,GAAMC,EAAI,QAAQ,CAAC,GAEpFC,KAAY,GAAc,MAAsC;CACpE,IAAMC,IAAOF,EAAI,MAAM,OAAO;CAC9B,OAAOE,MAAS,QAAQC,EAAS,OAAO,MAAM,MAAMC,EAAE,SAASF,CAAI,IAAIA,IAAO;AAChF;AAIA,SAASG,EACP,GACA,GACA,GACA,GACA,GACA,IAA6B,CAAC,GACxB;CACN,IAAMC,IAAOC,EAAM,IAAIC,CAAE;CACzB,IAAI,CAACF,GAAM;CACX,IAAMG,IAAY,CAACC,EAAgB;EACjC;EAAI,MAAMJ,EAAK;EAAM,IAAI;GAAE,GAAIA,EAAK;GAAiB,UAAUK,EAAgBC,GAAMN,EAAK,IAAI;EAAE;EAAG;CACrG,CAAC,CAAC,GACIO,KAAS,MAAyB;EACtC,KAAK,IAAMC,KAASP,EAAM,WAAWQ,CAAM,GAAG;GAC5C,IAAMC,IAAOT,EAAM,IAAIO,CAAK,CAAC,EAAE,MACzBG,IAAOD,GAAM,QAAQE,EAAeF,EAAK,MAAMG,CAAO;GAE5D,AADIF,KAAQA,MAASD,EAAK,QAAMP,EAAI,KAAKC,EAAgB;IAAE,IAAII;IAAO,MAAME;IAAM,IAAI;KAAE,GAAGA;KAAM,MAAMC;IAAK;IAAG;GAAM,CAAC,CAAC,GACvHJ,EAAMC,CAAK;EACb;CACF;CAEA,AADIK,EAAQ,SAAS,KAAGN,EAAML,CAAE,GAC5BT,EAAK,WAAUA,EAAK,SAASU,GAAKW,CAAK,IACtCb,EAAM,WAAWE,GAAKW,GAAOC,EAAqBd,GAAOR,EAAK,WAAW,cAAc,CAAC;AAC/F;AAEA,SAASuB,EAAW,GAAc,GAAoD;CACpF,OAAO;EACL,IAAI;EACJ,OAAO;EACP;EACA,UAAU;GAAC;GAAQ;GAAa;EAAU;EAC1C,SAASC;EACT,SAAS;GACP,QAAQ;GACR,QAAQ,EAAE,SAAM,SAAM,eAA2B;IAC/C,IAAMC,IAAKxB,EAAI,OAAO;IACtB,IAAI,CAACwB,GAAI,OAAO,CAAC;IACjB,IAAMC,IAAQC,GAAM,SAASC,GACvBC,IAAS5B,EAAI,MAAM,OAAO,GAC1B6B,IAAMC,EAAQN,EAAG,UAAUC,EAAM,GAAGA,EAAM,GAAG5B,EAAQG,GAAKD,CAAI,CAAC,GACjEgC,IAASP,EAAG,UACZtB,IAAO2B;IACX,IAAI3B,MAAS,MAAM;KACjB,IAAIa,IAASd,EAASD,GAAK+B,CAAM;KAEjC,AADIhB,MAAW,SAAO,CAAE,UAAUgB,GAAQ,MAAMhB,KAAWiB,EAASD,GAAQ,MAAMN,EAAM,GAAGA,EAAM,CAAC,IACjG,CAAE,UAAUM,cAAiBC,EAASD,GAAQhB,GAAQU,EAAM,GAAGA,EAAM,CAAC;IACzE;IACA,IAAMQ,IAAQ/B,GACRgC,IAAOC,EAAeJ,CAAM,CAAC,CAAC,IAAIE,CAAK;IAG7C,OAFAjC,EAAI,MAAM,UAAUiC,CAAK,GACzBjC,EAAI,KAAK+B,CAAM,GACR;KACL,SAAS,MAAwB;MAC/B,EAAI,KAAKK,EAAUL,GAAQE,GAAOC,EAAK,IAAIG,EAAK,MAAM,IAAIZ,EAAM,GAAGS,EAAK,IAAIG,EAAK,MAAM,IAAIZ,EAAM,CAAC,CAAC;KACrG;KAEA,QAAQ,GAAqB,MAAgC;MAC3D,IAAMb,IAAOZ,EAAI,MAAM;MAEvB,IADAA,EAAI,KAAK,IAAI,GACTsC,MAAW,YAAY,CAAC1B,GAAM;OAChC,EAAI,MAAM,UAAUgB,CAAM;OAC1B;MACF;MACA,EAAe5B,EAAI,MAAM,GAAGD,GAAMyB,EAAG,IAAIZ,GAAMiB,MAAQ,OAAO,aAAa,YAAY;KACzF;IACF;GACF;EACF;CACF;AACF;AAGA,SAAgBU,EAAkB,GAAwB;CACxD,IAAMhB,UAAiBvB,EAAI,OAAO,IAAI,KAAOwC,EAAqB,eAC5DC,UAAkB;EACtB,IAAMjB,IAAKxB,EAAI,OAAO;EACtB,OAAOwB,KAAMvB,EAASD,GAAKwB,EAAG,QAAQ,MAAM,OAAO,KAAOgB,EAAqB;CACjF;CACA,OAAO;EACLlB,EAAWtB,GAAKuB,CAAO;EACvB;GACE,IAAI;GACJ,OAAO;GACP;GACA,UAAU,CAAC,MAAM;GACjB,SAASA;GACT,SAAS;IACP,QAAQ;IACR,MAAM,GAAM,MAAW;KACrB,IAAMmB,IAAIC,GACJnB,IAAKxB,EAAI,OAAO;KACtB,AAAKwB,KAAMkB,GAAG,WAAW,KAAA,KAAaA,EAAE,WAAW,KAAA,KACnD1C,EAAI,MAAM,UAAU8B,EAAQN,EAAG,UAAUkB,EAAE,QAAQA,EAAE,QAAQ7C,EAAQG,GAAKD,CAAI,CAAC,CAAC;IAClF;GACF;EACF;EACA;GACE,IAAI;GACJ,OAAO;GACP;GACA,UAAU,CAAC,aAAa,UAAU;GAElC,SAAS0C;GACT,SAAS;IACP,QAAQ;IACR,MAAM,MAAS;KACb,IAAMjB,IAAKxB,EAAI,OAAO,GAChBE,IAAOsB,KAAMvB,EAASD,GAAKwB,EAAG,QAAQ;KAC5C,IAAI,CAACA,KAAMtB,KAAQ,MAAM;KACzB,IAAMa,IAASS,EAAG,SAAS,OAAO,MAAM,MAAMpB,EAAE,SAASF,CAAI,CAAC,CAAE,QAC1D,EAAE,aAAU,eAAY0C,EAAYpB,EAAG,UAAUtB,CAAI;KAE3D,AADAG,EAAeL,EAAI,MAAM,GAAGD,GAAMyB,EAAG,IAAIrB,GAAU,gBAAgBgB,CAAO,GAC1EnB,EAAI,MAAM,UAAUe,CAAM;IAC5B;GACF;EACF;EACA;GACE,IAAI;GACJ,OAAO;GACP;GACA,SAAS0B;GACT,SAAS;IAAE,QAAQ;IAAa,WAAWzC,EAAI,MAAM,UAAU,IAAI;GAAE;EACvE;CACF;AACF"}
@@ -0,0 +1,58 @@
1
+ import { viewToTransform as e } from "../../../core/viewport/view.js";
2
+ import { worldToScreen as t } from "../../../core/viewport/viewTransform.js";
3
+ import { ellipsePath as n, linePath as r } from "@weasel-js/geom";
4
+ import { jointPositions as i } from "@weasel-js/animator";
5
+ //#region src/tools/builtin/bone/boneOverlay.ts
6
+ var a = "#4f9cf7", o = "#ffffff", s = 4.5, c = (e, t, r) => n({
7
+ x: e - r,
8
+ y: t - r,
9
+ width: 2 * r,
10
+ height: 2 * r
11
+ });
12
+ function l(n) {
13
+ return {
14
+ id: n.id,
15
+ label: "Bones",
16
+ space: "screen",
17
+ subscribe: n.subscribe,
18
+ draw: (l, u) => {
19
+ let d = n.skeleton();
20
+ if (!d || d.joints.length === 0) return [];
21
+ let f = e(u), p = /* @__PURE__ */ new Map();
22
+ for (let [e, n] of i(d)) {
23
+ let [r, i] = t(n.x, n.y, f);
24
+ p.set(e, {
25
+ x: r,
26
+ y: i
27
+ });
28
+ }
29
+ let m = [];
30
+ for (let e of d.joints) e.parent != null && m.push({
31
+ kind: "path",
32
+ path: r(p.get(e.parent), p.get(e.name)),
33
+ stroke: {
34
+ paint: { color: a },
35
+ width: 2
36
+ }
37
+ });
38
+ let h = n.active();
39
+ for (let [e, t] of p) m.push({
40
+ kind: "path",
41
+ path: c(t.x, t.y, s),
42
+ fill: { paint: {
43
+ kind: "solid",
44
+ color: e === h ? a : o
45
+ } },
46
+ stroke: {
47
+ paint: { color: a },
48
+ width: 1.5
49
+ }
50
+ });
51
+ return m;
52
+ }
53
+ };
54
+ }
55
+ //#endregion
56
+ export { l as createBoneOverlay };
57
+
58
+ //# sourceMappingURL=boneOverlay.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boneOverlay.js","names":["BONE","JOINT_FILL","JOINT_RADIUS_PX","dot","ellipsePath","x","y","createBoneOverlay","source","skeleton","t","viewToTransform","view","at","name","p","jointPositions","worldToScreen","out","joint","linePath","active"],"sources":["../../../../src/tools/builtin/bone/boneOverlay.ts"],"sourcesContent":["import { ellipsePath, linePath } from '@weasel-js/geom';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport { viewToTransform } from 'core/viewport/view';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport { jointPositions } from '@weasel-js/animator';\nimport type { Skeleton } from '@weasel-js/animator';\n\nconst BONE = '#4f9cf7';\nconst JOINT_FILL = '#ffffff';\nconst JOINT_RADIUS_PX = 4.5;\n\nconst dot = (x: number, y: number, r: number) => ellipsePath({ x: x - r, y: y - r, width: 2 * r, height: 2 * r });\n\n/**\n * A screen-space layer drawing a skeleton as bones and joints at a constant size: a line from\n * each joint to its parent, a ring on each joint, and the active joint filled.\n */\nexport function createBoneOverlay(source: {\n id: string;\n /** The skeleton to draw, in the scene's space, or `null` for none. */\n skeleton(): Skeleton | null;\n active(): string | null;\n subscribe(fn: () => void): () => void;\n}): RenderLayer<unknown> {\n return {\n id: source.id,\n label: 'Bones',\n space: 'screen',\n subscribe: source.subscribe,\n draw: (_data, view) => {\n const skeleton = source.skeleton();\n if (!skeleton || skeleton.joints.length === 0) return [];\n const t = viewToTransform(view);\n const at = new Map<string, { x: number; y: number }>();\n for (const [name, p] of jointPositions(skeleton)) {\n const [x, y] = worldToScreen(p.x, p.y, t);\n at.set(name, { x, y });\n }\n const out: DrawCommand[] = [];\n for (const joint of skeleton.joints) {\n if (joint.parent == null) continue;\n out.push({\n kind: 'path',\n path: linePath(at.get(joint.parent)!, at.get(joint.name)!),\n stroke: { paint: { color: BONE }, width: 2 },\n });\n }\n const active = source.active();\n for (const [name, p] of at) {\n out.push({\n kind: 'path',\n path: dot(p.x, p.y, JOINT_RADIUS_PX),\n fill: { paint: { kind: 'solid', color: name === active ? BONE : JOINT_FILL } },\n stroke: { paint: { color: BONE }, width: 1.5 },\n });\n }\n return out;\n },\n };\n}\n"],"mappings":";;;;;AAQA,IAAMA,IAAO,WACPC,IAAa,WACbC,IAAkB,KAElBC,KAAO,GAAW,GAAW,MAAcC,EAAY;CAAE,GAAGC,IAAI;CAAG,GAAGC,IAAI;CAAG,OAAO,IAAI;CAAG,QAAQ,IAAI;AAAE,CAAC;AAMhH,SAAgBC,EAAkB,GAMT;CACvB,OAAO;EACL,IAAIC,EAAO;EACX,OAAO;EACP,OAAO;EACP,WAAWA,EAAO;EAClB,OAAO,GAAO,MAAS;GACrB,IAAMC,IAAWD,EAAO,SAAS;GACjC,IAAI,CAACC,KAAYA,EAAS,OAAO,WAAW,GAAG,OAAO,CAAC;GACvD,IAAMC,IAAIC,EAAgBC,CAAI,GACxBC,oBAAK,IAAI,IAAsC;GACrD,KAAK,IAAM,CAACC,GAAMC,MAAMC,EAAeP,CAAQ,GAAG;IAChD,IAAM,CAACJ,GAAGC,KAAKW,EAAcF,EAAE,GAAGA,EAAE,GAAGL,CAAC;IACxC,EAAG,IAAII,GAAM;KAAE;KAAG;IAAE,CAAC;GACvB;GACA,IAAMI,IAAqB,CAAC;GAC5B,KAAK,IAAMC,KAASV,EAAS,QAC3B,AAAIU,EAAM,UAAU,QACpBD,EAAI,KAAK;IACP,MAAM;IACN,MAAME,EAASP,EAAG,IAAIM,EAAM,MAAM,GAAIN,EAAG,IAAIM,EAAM,IAAI,CAAE;IACzD,QAAQ;KAAE,OAAO,EAAE,OAAOnB,EAAK;KAAG,OAAO;IAAE;GAC7C,CAAC;GAEH,IAAMqB,IAASb,EAAO,OAAO;GAC7B,KAAK,IAAM,CAACM,GAAMC,MAAMF,GACtB,EAAI,KAAK;IACP,MAAM;IACN,MAAMV,EAAIY,EAAE,GAAGA,EAAE,GAAGb,CAAe;IACnC,MAAM,EAAE,OAAO;KAAE,MAAM;KAAS,OAAOY,MAASO,IAASrB,IAAOC;IAAW,EAAE;IAC7E,QAAQ;KAAE,OAAO,EAAE,OAAOD,EAAK;KAAG,OAAO;IAAI;GAC/C,CAAC;GAEH,OAAOkB;EACT;CACF;AACF"}
@@ -0,0 +1,24 @@
1
+ import { placeSkeleton as e } from "../../../animation/rig/rigNode.js";
2
+ import { pxExtent as t } from "@weasel-js/geom";
3
+ //#region src/tools/builtin/bone/placedRig.ts
4
+ var n = { joints: [] };
5
+ function r(t, r) {
6
+ let i = r === null ? void 0 : t.get(r);
7
+ if (r === null || !i) return null;
8
+ let a = i.data?.skeleton ?? n;
9
+ return {
10
+ id: r,
11
+ skeleton: e(a, i.pose)
12
+ };
13
+ }
14
+ function i(e, n) {
15
+ let r = t(n, e.view?.get().scale ?? {
16
+ x: 1,
17
+ y: 1
18
+ });
19
+ return Math.max(r.x, r.y);
20
+ }
21
+ //#endregion
22
+ export { r as placedRig, i as sceneReach };
23
+
24
+ //# sourceMappingURL=placedRig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"placedRig.js","names":["EMPTY","placedRig","node","id","scene","local","placeSkeleton","sceneReach","e","pxExtent","px","deps"],"sources":["../../../../src/tools/builtin/bone/placedRig.ts"],"sourcesContent":["import { pxExtent } from '@weasel-js/geom';\nimport type { ActionDeps } from '@weasel-js/routing';\nimport type { NodeId } from 'core/scene/types';\nimport { placeSkeleton, type RigNodeData } from '../../../animation/rig/rigNode';\nimport type { Skeleton } from '@weasel-js/animator';\n\nconst EMPTY: Skeleton = { joints: [] };\n\n/** A rig node and its skeleton in the scene's space, as the rig tools edit and draw it. */\nexport interface PlacedRig {\n id: NodeId;\n skeleton: Skeleton;\n}\n\n/** The rig at node `id`, an empty skeleton for a node that has none yet, or `null` when\n * there is no such node. */\nexport function placedRig(\n scene: { get(id: NodeId): { pose: unknown; data?: unknown } | undefined },\n id: NodeId | null,\n): PlacedRig | null {\n const node = id === null ? undefined : scene.get(id);\n if (id === null || !node) return null;\n const local = (node.data as RigNodeData | null | undefined)?.skeleton ?? EMPTY;\n return { id, skeleton: placeSkeleton(local, node.pose) };\n}\n\n/** `px` screen pixels as a distance in the scene, at the view's current scale. */\nexport function sceneReach(deps: ActionDeps, px: number): number {\n const e = pxExtent(px, deps.view?.get().scale ?? { x: 1, y: 1 });\n return Math.max(e.x, e.y);\n}\n"],"mappings":";;;AAMA,IAAMA,IAAkB,EAAE,QAAQ,CAAC,EAAE;AAUrC,SAAgBC,EACd,GACA,GACkB;CAClB,IAAMC,IAAOC,MAAO,OAAO,KAAA,IAAYC,EAAM,IAAID,CAAE;CACnD,IAAIA,MAAO,QAAQ,CAACD,GAAM,OAAO;CACjC,IAAMG,IAASH,EAAK,MAAyC,YAAYF;CACzE,OAAO;EAAE;EAAI,UAAUM,EAAcD,GAAOH,EAAK,IAAI;CAAE;AACzD;AAGA,SAAgBK,EAAW,GAAkB,GAAoB;CAC/D,IAAMC,IAAIC,EAASC,GAAIC,EAAK,MAAM,IAAI,CAAC,CAAC,SAAS;EAAE,GAAG;EAAG,GAAG;CAAE,CAAC;CAC/D,OAAO,KAAK,IAAIH,EAAE,GAAGA,EAAE,CAAC;AAC1B"}
@@ -0,0 +1,21 @@
1
+ import { createEmitter as e } from "@weasel-js/registry";
2
+ //#region src/tools/builtin/bone/rigEditState.ts
3
+ var t = /* @__PURE__ */ new Map();
4
+ function n() {
5
+ let n = null, r = t, i = e();
6
+ return {
7
+ active: () => n,
8
+ setActive(e) {
9
+ e !== n && (n = e, i.emit());
10
+ },
11
+ painted: () => r,
12
+ paint(e) {
13
+ (e ?? t) !== r && (r = e ?? t, i.emit());
14
+ },
15
+ listen: i.subscribe
16
+ };
17
+ }
18
+ //#endregion
19
+ export { n as createRigEditState };
20
+
21
+ //# sourceMappingURL=rigEditState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rigEditState.js","names":["NONE","createRigEditState","active","painted","changed","createEmitter","joint","next"],"sources":["../../../../src/tools/builtin/bone/rigEditState.ts"],"sourcesContent":["import type { Skin } from '@weasel-js/animator';\nimport { createEmitter } from '@weasel-js/registry';\nimport type { NodeId } from 'core/scene/types';\nimport type { PaintedSkins } from '../../../animation/rig/rigNode';\n\n/** What the bone and weight tools share between gestures: the joint they act on, and the\n * weights a stroke has painted and not yet written. */\nexport interface RigEditState extends PaintedSkins {\n /** The active joint's name, or `null`. */\n active(): string | null;\n setActive(joint: string | null): void;\n /** Weights a stroke of the weight tool has painted and not yet written, by node. Empty\n * between strokes. `useRigNode` given this state as `painting` binds them as they change. */\n painted(): ReadonlyMap<NodeId, Skin>;\n /** Replace the painted weights; `null` empties them. */\n paint(next: ReadonlyMap<NodeId, Skin> | null): void;\n /** Notified when the active joint or the painted weights change. Returns an unsubscribe. */\n listen(fn: () => void): () => void;\n}\n\nconst NONE: ReadonlyMap<NodeId, Skin> = new Map();\n\n/** A `RigEditState` with no joint active. Hand one to both tools so a joint picked with the\n * bone tool is the one the weight tool paints. */\nexport function createRigEditState(): RigEditState {\n let active: string | null = null;\n let painted = NONE;\n const changed = createEmitter();\n return {\n active: () => active,\n setActive(joint) {\n if (joint === active) return;\n active = joint;\n changed.emit();\n },\n painted: () => painted,\n paint(next) {\n if ((next ?? NONE) === painted) return;\n painted = next ?? NONE;\n changed.emit();\n },\n listen: changed.subscribe,\n };\n}\n"],"mappings":";;AAoBA,IAAMA,oBAAkC,IAAI,IAAI;AAIhD,SAAgBC,IAAmC;CACjD,IAAIC,IAAwB,MACxBC,IAAUH,GACRI,IAAUC,EAAc;CAC9B,OAAO;EACL,cAAcH;EACd,UAAU,GAAO;GACf,AAAII,MAAUJ,MACd,IAASI,GACTF,EAAQ,KAAK;EACf;EACA,eAAeD;EACf,MAAM,GAAM;GACV,CAAKI,KAAQP,OAAUG,MACvB,IAAUI,KAAQP,GAClBI,EAAQ,KAAK;EACf;EACA,QAAQA,EAAQ;CAClB;AACF"}
@@ -0,0 +1,98 @@
1
+ import { defineTool as e } from "../../overlayBinding.js";
2
+ import { placedRig as t } from "./placedRig.js";
3
+ import { createBoneActions as n } from "./boneActions.js";
4
+ import { createBoneOverlay as r } from "./boneOverlay.js";
5
+ import { createRigEditState as i } from "./rigEditState.js";
6
+ import { useMemo as a, useRef as o } from "react";
7
+ import { useLatest as s } from "@weasel-js/react";
8
+ import { createEmitter as c } from "@weasel-js/registry";
9
+ //#region src/tools/builtin/bone/useBoneTool.ts
10
+ function l(l) {
11
+ let u = a(() => i(), []), d = l.state ?? u, f = s({
12
+ scene: l.scene,
13
+ rig: l.rig,
14
+ reach: l.reach ?? 10
15
+ }), p = o(null), m = a(() => {
16
+ let e = c();
17
+ return {
18
+ state: d,
19
+ scene: () => f.current.scene,
20
+ reachPx: () => f.current.reach,
21
+ placed: () => t(f.current.scene, f.current.rig()),
22
+ shown: () => p.current,
23
+ show(t) {
24
+ p.current = t, e.emit();
25
+ },
26
+ listen(t) {
27
+ let n = e.subscribe(t), r = d.listen(t);
28
+ return () => {
29
+ n(), r();
30
+ };
31
+ }
32
+ };
33
+ }, [f, d]), h = a(() => n(m), [m]), g = a(() => r({
34
+ id: "bone-tool-skeleton",
35
+ skeleton: () => m.shown() ?? m.placed()?.skeleton ?? null,
36
+ active: d.active,
37
+ subscribe: m.listen
38
+ }), [m, d]), { keybinding: _ } = l;
39
+ return a(() => e({
40
+ id: "bone",
41
+ capabilities: ["edits-page"],
42
+ hookName: "useBoneTool",
43
+ cursor: "crosshair",
44
+ presentation: {
45
+ label: "Bone",
46
+ group: "shape"
47
+ },
48
+ ..._ === null ? {} : { keybinding: _ ?? { key: "J" } },
49
+ actions: h,
50
+ overlay: g,
51
+ onDeactivate: () => m.show(null),
52
+ bindings: [
53
+ {
54
+ spec: {
55
+ kind: "click",
56
+ mods: {
57
+ shift: "optional",
58
+ alt: "optional"
59
+ }
60
+ },
61
+ actionId: "bone.pick"
62
+ },
63
+ {
64
+ spec: {
65
+ kind: "drag",
66
+ mods: {
67
+ shift: "optional",
68
+ alt: "optional"
69
+ }
70
+ },
71
+ actionId: "bone.drag"
72
+ },
73
+ {
74
+ spec: {
75
+ kind: "key",
76
+ key: ["Delete", "Backspace"]
77
+ },
78
+ actionId: "bone.remove"
79
+ },
80
+ {
81
+ spec: {
82
+ kind: "key",
83
+ key: "Escape"
84
+ },
85
+ actionId: "bone.clear"
86
+ }
87
+ ]
88
+ }), [
89
+ h,
90
+ g,
91
+ _,
92
+ m
93
+ ]);
94
+ }
95
+ //#endregion
96
+ export { l as useBoneTool };
97
+
98
+ //# sourceMappingURL=useBoneTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBoneTool.js","names":["useBoneTool","ownState","useMemo","createRigEditState","state","options","opts","useLatest","liveRef","useRef","env","changed","createEmitter","placedRig","skeleton","offOwn","fn","off","actions","createBoneActions","overlay","createBoneOverlay","defineTool","keybinding"],"sources":["../../../../src/tools/builtin/bone/useBoneTool.ts"],"sourcesContent":["import { useMemo, useRef } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { Skeleton } from '@weasel-js/animator';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { createBoneActions, type BoneEnv } from './boneActions';\nimport { createBoneOverlay } from './boneOverlay';\nimport { placedRig } from './placedRig';\nimport { createRigEditState, type RigEditState } from './rigEditState';\nimport { createEmitter } from '@weasel-js/registry';\n\n/** Options for `useBoneTool`. */\nexport interface UseBoneToolOptions {\n scene: Scene<unknown, string, unknown>;\n /** The node whose data holds the skeleton, or will once a bone is drawn: usually read from\n * the selection. `null` leaves the tool with nothing to edit. */\n rig: () => NodeId | null;\n /** Shared with `useWeightTool`, so both act on one joint. Default: the tool's own. */\n state?: RigEditState;\n /** Override the default keybinding (`{ key: 'J' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n /** Screen px around a joint within which a press takes it. Default 10. */\n reach?: number;\n}\n\n/**\n * Draws and edits the skeleton in a node's `data.skeleton`. A drag on a joint moves it, with\n * the joints under it; a drag from anywhere else draws a bone, from the active joint if there\n * is one and from the press if not, and the new joint becomes the active one. A click picks\n * the active joint or clears it, Delete removes it with everything under it, taking its\n * weights out of every skin beneath the rig node, and Escape clears it. Each edit is one undo\n * entry.\n */\nexport function useBoneTool(options: UseBoneToolOptions): Tool {\n const ownState = useMemo(() => createRigEditState(), []);\n const state = options.state ?? ownState;\n const opts = useLatest({ scene: options.scene, rig: options.rig, reach: options.reach ?? 10 });\n /** The skeleton a drag is shaping, in the scene's space. */\n const liveRef = useRef<Skeleton | null>(null);\n\n const env = useMemo(() => {\n const changed = createEmitter();\n const tool: BoneEnv & { listen(fn: () => void): () => void } = {\n state,\n scene: () => opts.current.scene,\n reachPx: () => opts.current.reach,\n placed: () => placedRig(opts.current.scene, opts.current.rig()),\n shown: () => liveRef.current,\n show(skeleton) {\n liveRef.current = skeleton;\n changed.emit();\n },\n listen(fn) {\n const offOwn = changed.subscribe(fn);\n const off = state.listen(fn);\n return () => { offOwn(); off(); };\n },\n };\n return tool;\n }, [opts, state]);\n\n const actions = useMemo(() => createBoneActions(env), [env]);\n const overlay = useMemo(() => createBoneOverlay({\n id: 'bone-tool-skeleton',\n skeleton: () => env.shown() ?? env.placed()?.skeleton ?? null,\n active: state.active,\n subscribe: env.listen,\n }), [env, state]);\n\n const { keybinding } = options;\n return useMemo(() => defineTool({\n id: 'bone',\n capabilities: ['edits-page'],\n hookName: 'useBoneTool',\n cursor: 'crosshair',\n presentation: { label: 'Bone', group: 'shape' },\n ...(keybinding === null ? {} : { keybinding: keybinding ?? { key: 'J' } }),\n actions,\n overlay,\n onDeactivate: () => env.show(null),\n bindings: [\n { spec: { kind: 'click', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'bone.pick' },\n { spec: { kind: 'drag', mods: { shift: 'optional', alt: 'optional' } }, actionId: 'bone.drag' },\n { spec: { kind: 'key', key: ['Delete', 'Backspace'] }, actionId: 'bone.remove' },\n { spec: { kind: 'key', key: 'Escape' }, actionId: 'bone.clear' },\n ],\n }), [actions, overlay, keybinding, env]);\n}\n"],"mappings":";;;;;;;;;AAmCA,SAAgBA,EAAY,GAAmC;CAC7D,IAAMC,IAAWC,QAAcC,EAAmB,GAAG,CAAC,CAAC,GACjDC,IAAQC,EAAQ,SAASJ,GACzBK,IAAOC,EAAU;EAAE,OAAOF,EAAQ;EAAO,KAAKA,EAAQ;EAAK,OAAOA,EAAQ,SAAS;CAAG,CAAC,GAEvFG,IAAUC,EAAwB,IAAI,GAEtCC,IAAMR,QAAc;EACxB,IAAMS,IAAUC,EAAc;EAiB9B,OAAO;GAfL;GACA,aAAaN,EAAK,QAAQ;GAC1B,eAAeA,EAAK,QAAQ;GAC5B,cAAcO,EAAUP,EAAK,QAAQ,OAAOA,EAAK,QAAQ,IAAI,CAAC;GAC9D,aAAaE,EAAQ;GACrB,KAAK,GAAU;IAEb,AADA,EAAQ,UAAUM,GAClBH,EAAQ,KAAK;GACf;GACA,OAAO,GAAI;IACT,IAAMI,IAASJ,EAAQ,UAAUK,CAAE,GAC7BC,IAAMb,EAAM,OAAOY,CAAE;IAC3B,aAAa;KAAY,AAAVD,EAAO,GAAGE,EAAI;IAAG;GAClC;EAEK;CACT,GAAG,CAACX,GAAMF,CAAK,CAAC,GAEVc,IAAUhB,QAAciB,EAAkBT,CAAG,GAAG,CAACA,CAAG,CAAC,GACrDU,IAAUlB,QAAcmB,EAAkB;EAC9C,IAAI;EACJ,gBAAgBX,EAAI,MAAM,KAAKA,EAAI,OAAO,CAAC,EAAE,YAAY;EACzD,QAAQN,EAAM;EACd,WAAWM,EAAI;CACjB,CAAC,GAAG,CAACA,GAAKN,CAAK,CAAC,GAEV,EAAE,kBAAeC;CACvB,OAAOH,QAAcoB,EAAW;EAC9B,IAAI;EACJ,cAAc,CAAC,YAAY;EAC3B,UAAU;EACV,QAAQ;EACR,cAAc;GAAE,OAAO;GAAQ,OAAO;EAAQ;EAC9C,GAAIC,MAAe,OAAO,CAAC,IAAI,EAAE,YAAYA,KAAc,EAAE,KAAK,IAAI,EAAE;EACxE;EACA;EACA,oBAAoBb,EAAI,KAAK,IAAI;EACjC,UAAU;GACR;IAAE,MAAM;KAAE,MAAM;KAAS,MAAM;MAAE,OAAO;MAAY,KAAK;KAAW;IAAE;IAAG,UAAU;GAAY;GAC/F;IAAE,MAAM;KAAE,MAAM;KAAQ,MAAM;MAAE,OAAO;MAAY,KAAK;KAAW;IAAE;IAAG,UAAU;GAAY;GAC9F;IAAE,MAAM;KAAE,MAAM;KAAO,KAAK,CAAC,UAAU,WAAW;IAAE;IAAG,UAAU;GAAc;GAC/E;IAAE,MAAM;KAAE,MAAM;KAAO,KAAK;IAAS;IAAG,UAAU;GAAa;EACjE;CACF,CAAC,GAAG;EAACQ;EAASE;EAASG;EAAYb;CAAG,CAAC;AACzC"}
@@ -9,6 +9,7 @@ function o(o = {}) {
9
9
  let { behaviors: s } = o;
10
10
  return r(() => e({
11
11
  id: "ellipse",
12
+ keybinding: { key: "E" },
12
13
  capabilities: ["creates-shapes"],
13
14
  hookName: "useEllipseTool",
14
15
  cursor: a("crosshairEllipse", { fallback: "crosshair" }),
@@ -1 +1 @@
1
- {"version":3,"file":"useEllipseTool.js","names":["EllipseIcon","useEllipseTool","options","useMemo","defineTool","cursorFor","insertBindingBehaviors","behaviors"],"sources":["../../../../src/tools/builtin/ellipse/useEllipseTool.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { EllipseIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/**\n * Drag-to-draw ellipse tool. Mirrors `useRectTool`: the `drag` binding\n * routes to `insertAction`, which owns the live preview and commits\n * through the `insert` dep. Alt toggles from-corner ⇄ from-center\n * mid-drag via the action's live modifier read.\n */\nexport function useEllipseTool(options: InsertToolOptions = {}): Tool<null> {\n const { behaviors } = options;\n return useMemo(\n () =>\n defineTool<null>({\n id: 'ellipse',\n capabilities: ['creates-shapes'],\n hookName: 'useEllipseTool',\n cursor: cursorFor('crosshairEllipse', { fallback: 'crosshair' }),\n presentation: {\n label: 'Ellipse',\n group: 'shape',\n icon: <EllipseIcon />,\n },\n bindings: [\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: { params: { kind: 'ellipse' } , ...insertBindingBehaviors(behaviors) },\n },\n ],\n }),\n [behaviors],\n );\n}\n"],"mappings":";;;;;;;AAaA,SAAgBC,EAAe,IAA6B,CAAC,GAAe;CAC1E,IAAM,EAAE,iBAAcC;CACtB,OAAOC,QAEHC,EAAiB;EACf,IAAI;EACJ,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQC,EAAU,oBAAoB,EAAE,UAAU,YAAY,CAAC;EAC/D,cAAc;GACZ,OAAO;GACP,OAAO;GACP,MAAM,kBAACL,GAAD,CAAc,CAAA;EACtB;EACA,UAAU,CACR;GACE,MAAM,EAAE,MAAM,OAAO;GACrB,UAAU;GACV,MAAM;IAAE,QAAQ,EAAE,MAAM,UAAU;IAAI,GAAGM,EAAuBC,CAAS;GAAE;EAC7E,CACF;CACF,CAAC,GACH,CAACA,CAAS,CACZ;AACF"}
1
+ {"version":3,"file":"useEllipseTool.js","names":["EllipseIcon","useEllipseTool","options","useMemo","defineTool","cursorFor","insertBindingBehaviors","behaviors"],"sources":["../../../../src/tools/builtin/ellipse/useEllipseTool.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { EllipseIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/**\n * Drag-to-draw ellipse tool. Mirrors `useRectTool`: the `drag` binding\n * routes to `insertAction`, which owns the live preview and commits\n * through the `insert` dep. Alt toggles from-corner ⇄ from-center\n * mid-drag via the action's live modifier read.\n */\nexport function useEllipseTool(options: InsertToolOptions = {}): Tool {\n const { behaviors } = options;\n return useMemo(\n () =>\n defineTool({\n id: 'ellipse',\n keybinding: { key: 'E' },\n capabilities: ['creates-shapes'],\n hookName: 'useEllipseTool',\n cursor: cursorFor('crosshairEllipse', { fallback: 'crosshair' }),\n presentation: {\n label: 'Ellipse',\n group: 'shape',\n icon: <EllipseIcon />,\n },\n bindings: [\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: { params: { kind: 'ellipse' } , ...insertBindingBehaviors(behaviors) },\n },\n ],\n }),\n [behaviors],\n );\n}\n"],"mappings":";;;;;;;AAaA,SAAgBC,EAAe,IAA6B,CAAC,GAAS;CACpE,IAAM,EAAE,iBAAcC;CACtB,OAAOC,QAEHC,EAAW;EACT,IAAI;EACJ,YAAY,EAAE,KAAK,IAAI;EACvB,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQC,EAAU,oBAAoB,EAAE,UAAU,YAAY,CAAC;EAC/D,cAAc;GACZ,OAAO;GACP,OAAO;GACP,MAAM,kBAACL,GAAD,CAAc,CAAA;EACtB;EACA,UAAU,CACR;GACE,MAAM,EAAE,MAAM,OAAO;GACrB,UAAU;GACV,MAAM;IAAE,QAAQ,EAAE,MAAM,UAAU;IAAI,GAAGM,EAAuBC,CAAS;GAAE;EAC7E,CACF;CACF,CAAC,GACH,CAACA,CAAS,CACZ;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useEyedropperTool.js","names":["EyedropperIcon","useEyedropperTool","onPickRef","useLatest","opts","colorOfRef","pickAction","useMemo","p","params","nodeAtPoint","deps","id","keybinding","hotkey","defineTool","cursorFor","createElement"],"sources":["../../../../src/tools/builtin/eyedropper/useEyedropperTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport type { HotkeyTrigger } from '@weasel-js/routing';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport type { Action } from '@weasel-js/routing';\nimport { EyedropperIcon } from '../../../icons';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/** Options for `useEyedropperTool`. */\nexport interface UseEyedropperToolOptions {\n /** Called when the user picks a color. `null` means \"no node was hit\n * with a color\" — currently only reachable when `colorOf` returns null\n * on a real hit; empty-click is a no-op in v1. */\n onPick: (color: string | null) => void;\n\n /** Map a node id to a color string, or `null` if the node has no color\n * to sample. Called on click with the id of the topmost node under the\n * click point. */\n colorOf: (id: string) => string | null;\n\n /** Override the default `{ key: 'I' }` keybinding. Pass `null` to omit\n * the keybinding entirely (palette-only or hotkey-only wiring). */\n keybinding?: ToolKeybinding | null;\n\n /** Override the default `'alt'` hotkey trigger. Pass `null` to omit. */\n hotkey?: HotkeyTrigger | null;\n}\n\n/**\n * Eyedropper. Click a node to sample its color; the consumer's `onPick`\n * callback decides where the color goes. Engages as a sticky active-slot\n * tool (`I` keybinding) and as a momentary hotkey-slot tool while Alt\n * is held — consumers can override either trigger to `null`.\n *\n * Pure-read tool — does NOT mutate the scene. v1 is click-only; drag is\n * unbound (a future drag-to-sample option is additive).\n *\n * The node under the click comes from the `nodeAtPoint` dep, so an\n * eyedropper in a consumer that never registered that dep samples nothing.\n * `<SceneCanvas>` sources it from the same picker the rest of the kit hits.\n */\nexport function useEyedropperTool(opts: UseEyedropperToolOptions): Tool<null> {\n const onPickRef = useLatest(opts.onPick);\n const colorOfRef = useLatest(opts.colorOf);\n\n // Registered by `useToolActions` from inside the ActionsProvider — see\n // `ToolDef.actions`. Closing over the option refs here is what lets the\n // consumer's `onPick` stay a plain callback instead of a dep.\n const pickAction = useMemo<Action>(\n () => ({\n id: 'eyedropper.pick',\n label: 'Eyedropper — sample color',\n // Same tag the tool declares, so a mode that disallows color sampling\n // can't be reached through the gesture either. The tool's own\n // eligibility already gates activation; this closes the gesture side.\n eligible: { capability: 'samples-color' },\n requires: ['nodeAtPoint'],\n invoker: {\n timing: 'immediate' as const,\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number } | undefined;\n if (p?.pressX === undefined || p.pressY === undefined) return;\n const nodeAtPoint = deps.nodeAtPoint;\n const id = nodeAtPoint?.({ x: p.pressX, y: p.pressY }) ?? null;\n // Empty click is a no-op in v1 — `onPick(null)` is reserved for\n // \"hit a node that has no color to sample.\"\n if (id === null) return;\n onPickRef.current(colorOfRef.current(id));\n },\n },\n }),\n [onPickRef, colorOfRef],\n );\n\n return useMemo(() => {\n // Resolve overrides. The spec says `null` => omit; defineTool reads\n // these directly into the returned Tool, and the registry treats\n // `undefined` as \"no trigger.\" Convert null → undefined here.\n const keybinding =\n opts.keybinding === null ? undefined : (opts.keybinding ?? { key: 'I' });\n const hotkey =\n opts.hotkey === null ? undefined : (opts.hotkey ?? 'alt');\n\n return defineTool<null>({\n id: 'eyedropper',\n capabilities: ['samples-color'],\n hookName: 'useEyedropperTool',\n keybinding,\n hotkey,\n cursor: cursorFor('eyedropper', { fallback: 'crosshair' }),\n presentation: {\n label: 'Eyedropper',\n icon: createElement(EyedropperIcon),\n group: 'view',\n },\n actions: [pickAction],\n // One binding, no target filter: the action resolves the node itself\n // and no-ops on empty. Sampling deliberately reads the PRESS point\n // rather than the release — a 4px drift between the two can land on a\n // different node, and the color you meant is the one you pressed.\n //\n // The eyedropper used to carry a `pointerDown` route that existed only\n // to claim the press before `useSelectTool`'s own always-claiming\n // pointerdown route could. That was an artifact of two dispatchers\n // racing; hotkey scope now outranks active scope in the one dispatcher\n // that remains, so holding Alt wins without a gate.\n bindings: [{ spec: { kind: 'click' as const }, actionId: 'eyedropper.pick' }],\n });\n }, [opts.keybinding, opts.hotkey, pickAction]);\n}\n"],"mappings":";;;;;;AA2CA,SAAgBC,EAAkB,GAA4C;CAC5E,IAAMC,IAAYC,EAAUC,EAAK,MAAM,GACjCC,IAAaF,EAAUC,EAAK,OAAO,GAKnCE,IAAaC,SACV;EACL,IAAI;EACJ,OAAO;EAIP,UAAU,EAAE,YAAY,gBAAgB;EACxC,UAAU,CAAC,aAAa;EACxB,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMC,IAAIC;IACV,IAAID,GAAG,WAAW,KAAA,KAAaA,EAAE,WAAW,KAAA,GAAW;IACvD,IAAME,IAAcC,EAAK,aACnBC,IAAKF,IAAc;KAAE,GAAGF,EAAE;KAAQ,GAAGA,EAAE;IAAO,CAAC,KAAK;IAG1D,AAAII,MAAO,QACXV,EAAU,QAAQG,EAAW,QAAQO,CAAE,CAAC;GAC1C;EACF;CACF,IACA,CAACV,GAAWG,CAAU,CACxB;CAEA,OAAOE,QAAc;EAInB,IAAMM,IACJT,EAAK,eAAe,OAAO,KAAA,IAAaA,EAAK,cAAc,EAAE,KAAK,IAAI,GAClEU,IACJV,EAAK,WAAW,OAAO,KAAA,IAAaA,EAAK,UAAU;EAErD,OAAOW,EAAiB;GACtB,IAAI;GACJ,cAAc,CAAC,eAAe;GAC9B,UAAU;GACV;GACA;GACA,QAAQC,EAAU,cAAc,EAAE,UAAU,YAAY,CAAC;GACzD,cAAc;IACZ,OAAO;IACP,MAAMC,EAAcjB,CAAc;IAClC,OAAO;GACT;GACA,SAAS,CAACM,CAAU;GAWpB,UAAU,CAAC;IAAE,MAAM,EAAE,MAAM,QAAiB;IAAG,UAAU;GAAkB,CAAC;EAC9E,CAAC;CACH,GAAG;EAACF,EAAK;EAAYA,EAAK;EAAQE;CAAU,CAAC;AAC/C"}
1
+ {"version":3,"file":"useEyedropperTool.js","names":["EyedropperIcon","useEyedropperTool","onPickRef","useLatest","opts","colorOfRef","pickAction","useMemo","p","params","nodeAtPoint","deps","id","keybinding","hotkey","defineTool","cursorFor","createElement"],"sources":["../../../../src/tools/builtin/eyedropper/useEyedropperTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport type { HotkeyTrigger } from '@weasel-js/routing';\nimport type { ToolKeybinding } from '@weasel-js/routing';\nimport type { Action } from '@weasel-js/routing';\nimport { EyedropperIcon } from '../../../icons';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/** Options for `useEyedropperTool`. */\nexport interface UseEyedropperToolOptions {\n /** Called when the user picks a color. `null` means `colorOf` returned\n * null on a real hit; an empty click is a no-op. */\n onPick: (color: string | null) => void;\n\n /** Map a node id to a color string, or `null` if the node has no color\n * to sample. Called with the id of the topmost node under the press. */\n colorOf: (id: string) => string | null;\n\n /** Override the default `{ key: 'I' }` keybinding. Pass `null` to omit\n * the keybinding entirely (palette-only or hotkey-only wiring). */\n keybinding?: ToolKeybinding | null;\n\n /** Override the default `'alt'` hotkey trigger. Pass `null` to omit. */\n hotkey?: HotkeyTrigger | null;\n}\n\n/**\n * Eyedropper. Click a node to sample its color; the consumer's `onPick`\n * callback decides where the color goes. Engages as a sticky active-slot\n * tool (`I` keybinding) and as a momentary hotkey-slot tool while Alt\n * is held — consumers can override either trigger to `null`.\n *\n * Does not mutate the scene. Click-only; drag is unbound.\n *\n * The node under the click comes from the `nodeAtPoint` dep, so an\n * eyedropper in a consumer that never registered that dep samples nothing.\n */\nexport function useEyedropperTool(opts: UseEyedropperToolOptions): Tool {\n const onPickRef = useLatest(opts.onPick);\n const colorOfRef = useLatest(opts.colorOf);\n\n // Closing over the option refs here is what lets the consumer's `onPick`\n // stay a plain callback instead of a dep.\n const pickAction = useMemo<Action>(\n () => ({\n id: 'eyedropper.pick',\n label: 'Eyedropper — sample color',\n // Same tag the tool declares, so a mode that disallows color sampling\n // can't be reached through the gesture either.\n eligible: { capability: 'samples-color' },\n requires: ['nodeAtPoint'],\n invoker: {\n timing: 'immediate' as const,\n run: (deps, params) => {\n const p = params as { pressX?: number; pressY?: number } | undefined;\n if (p?.pressX === undefined || p.pressY === undefined) return;\n const nodeAtPoint = deps.nodeAtPoint;\n const id = nodeAtPoint?.({ x: p.pressX, y: p.pressY }) ?? null;\n if (id === null) return;\n onPickRef.current(colorOfRef.current(id));\n },\n },\n }),\n [onPickRef, colorOfRef],\n );\n\n return useMemo(() => {\n // `null` means omit; the registry reads `undefined` as \"no trigger\".\n const keybinding =\n opts.keybinding === null ? undefined : (opts.keybinding ?? { key: 'I' });\n const hotkey =\n opts.hotkey === null ? undefined : (opts.hotkey ?? 'alt');\n\n return defineTool({\n id: 'eyedropper',\n capabilities: ['samples-color'],\n hookName: 'useEyedropperTool',\n keybinding,\n hotkey,\n cursor: cursorFor('eyedropper', { fallback: 'crosshair' }),\n presentation: {\n label: 'Eyedropper',\n icon: createElement(EyedropperIcon),\n group: 'view',\n },\n actions: [pickAction],\n // One binding, no target filter: the action resolves the node itself\n // and no-ops on empty. Sampling deliberately reads the PRESS point\n // rather than the release — a 4px drift between the two can land on a\n // different node, and the color you meant is the one you pressed.\n bindings: [{ spec: { kind: 'click' as const }, actionId: 'eyedropper.pick' }],\n });\n }, [opts.keybinding, opts.hotkey, pickAction]);\n}\n"],"mappings":";;;;;;AAuCA,SAAgBC,EAAkB,GAAsC;CACtE,IAAMC,IAAYC,EAAUC,EAAK,MAAM,GACjCC,IAAaF,EAAUC,EAAK,OAAO,GAInCE,IAAaC,SACV;EACL,IAAI;EACJ,OAAO;EAGP,UAAU,EAAE,YAAY,gBAAgB;EACxC,UAAU,CAAC,aAAa;EACxB,SAAS;GACP,QAAQ;GACR,MAAM,GAAM,MAAW;IACrB,IAAMC,IAAIC;IACV,IAAID,GAAG,WAAW,KAAA,KAAaA,EAAE,WAAW,KAAA,GAAW;IACvD,IAAME,IAAcC,EAAK,aACnBC,IAAKF,IAAc;KAAE,GAAGF,EAAE;KAAQ,GAAGA,EAAE;IAAO,CAAC,KAAK;IAC1D,AAAII,MAAO,QACXV,EAAU,QAAQG,EAAW,QAAQO,CAAE,CAAC;GAC1C;EACF;CACF,IACA,CAACV,GAAWG,CAAU,CACxB;CAEA,OAAOE,QAAc;EAEnB,IAAMM,IACJT,EAAK,eAAe,OAAO,KAAA,IAAaA,EAAK,cAAc,EAAE,KAAK,IAAI,GAClEU,IACJV,EAAK,WAAW,OAAO,KAAA,IAAaA,EAAK,UAAU;EAErD,OAAOW,EAAW;GAChB,IAAI;GACJ,cAAc,CAAC,eAAe;GAC9B,UAAU;GACV;GACA;GACA,QAAQC,EAAU,cAAc,EAAE,UAAU,YAAY,CAAC;GACzD,cAAc;IACZ,OAAO;IACP,MAAMC,EAAcjB,CAAc;IAClC,OAAO;GACT;GACA,SAAS,CAACM,CAAU;GAKpB,UAAU,CAAC;IAAE,MAAM,EAAE,MAAM,QAAiB;IAAG,UAAU;GAAkB,CAAC;EAC9E,CAAC;CACH,GAAG;EAACF,EAAK;EAAYA,EAAK;EAAQE;CAAU,CAAC;AAC/C"}
@@ -7,6 +7,7 @@ function a(a = {}) {
7
7
  let o = i(a);
8
8
  return r(() => Object.assign(e({
9
9
  id: "hand",
10
+ keybinding: { key: "H" },
10
11
  capabilities: ["navigation"],
11
12
  hotkey: "space",
12
13
  hookName: "useHandTool",
@@ -1 +1 @@
1
- {"version":3,"file":"useHandTool.js","names":["HandIcon","useHandTool","optsRef","useLatest","opts","useMemo","defineTool","createElement"],"sources":["../../../../src/tools/builtin/hand/useHandTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { HandIcon } from '../../../icons';\nimport type { View } from 'core/viewport/view';\nimport type { InertiaConfig } from 'core/viewport/useDecayLoop';\n\nexport type { InertiaConfig };\n\n/** Options for `useHandTool`. Both are forwarded to `viewport.dragPan` as\n * binding params; momentum additionally needs a `view` dep publishing\n * `decay`, which `<SceneCanvas>` wires. */\nexport interface UseHandToolOptions {\n /** Momentum after release. Omit or pass `false` for none. */\n inertia?: false | InertiaConfig;\n /**\n * Which axes the drag responds to. Default `'both'`.\n *\n * - `'both'` — pan both axes (default).\n * - `'x'` — drag only changes `view.x`. Inertia (if enabled) also stays on x.\n * - `'y'` — drag only changes `view.y`. Inertia stays on y.\n *\n * Locks drag panning to a single axis. The former `useWheelPanTool` /\n * `useWheelZoomTool` / `useKeyboardZoomTool` axis option is dissolved.\n */\n axis?: 'both' | 'x' | 'y';\n}\n\n/** @internal */\ninterface HandScratch {\n startView: View;\n startScreenPoint: { x: number; y: number };\n}\n\n/**\n * Pan-on-drag tool. Registered in both the active slot (sticky, `H` key)\n * and the hotkey slot (momentary, hold `space`).\n *\n * Drag handlers compute pan deltas inline. View is read from ctx.view at\n * gesture start and written via ctx.setView on every move — so the tool\n * works with both controlled and uncontrolled Canvas viewport modes\n * without any extra wiring.\n *\n * Sign convention: dragging the mouse right moves the canvas content right\n * relative to the viewport — i.e. the camera moves *left*. So the new view\n * is `{ x: startView.x - dx, y: startView.y - dy }`.\n */\nexport function useHandTool(opts: UseHandToolOptions = {}): Tool<HandScratch | null> {\n // Read through a ref from a params thunk rather than closing over the\n // values: a consumer passing `inertia={{ friction: 0.9 }}` inline would\n // otherwise mint a new tool identity on every render.\n const optsRef = useLatest(opts);\n return useMemo(\n () =>\n Object.assign(defineTool<HandScratch>({\n id: 'hand',\n capabilities: ['navigation'],\n hotkey: 'space',\n hookName: 'useHandTool',\n presentation: {\n label: 'Hand',\n icon: createElement(HandIcon),\n group: 'view',\n },\n cursor: 'grab',\n }), {\n // Declarative binding routes drag through the dispatcher +\n // viewportDragPanAction, which also owns the grabbing cursor\n // (`Action.activeCursor`) the tool used to declare as an `engaged`\n // phase entry.\n bindings: [{\n spec: { kind: 'drag' as const },\n actionId: 'viewport.dragPan',\n opts: {\n params: () => ({\n axis: optsRef.current.axis ?? 'both',\n inertia: optsRef.current.inertia,\n }),\n },\n }],\n }) as Tool<HandScratch | null>,\n [optsRef],\n );\n}\n"],"mappings":";;;;;AAgDA,SAAgBC,EAAY,IAA2B,CAAC,GAA6B;CAInF,IAAMC,IAAUC,EAAUC,CAAI;CAC9B,OAAOC,QAEH,OAAO,OAAOC,EAAwB;EACpC,IAAI;EACJ,cAAc,CAAC,YAAY;EAC3B,QAAQ;EACR,UAAU;EACV,cAAc;GACZ,OAAO;GACP,MAAMC,EAAcP,CAAQ;GAC5B,OAAO;EACT;EACA,QAAQ;CACV,CAAC,GAAG,EAKF,UAAU,CAAC;EACT,MAAM,EAAE,MAAM,OAAgB;EAC9B,UAAU;EACV,MAAM,EACJ,eAAe;GACb,MAAME,EAAQ,QAAQ,QAAQ;GAC9B,SAASA,EAAQ,QAAQ;EAC3B,GACF;CACF,CAAC,EACH,CAAC,GACH,CAACA,CAAO,CACV;AACF"}
1
+ {"version":3,"file":"useHandTool.js","names":["HandIcon","useHandTool","optsRef","useLatest","opts","useMemo","defineTool","createElement"],"sources":["../../../../src/tools/builtin/hand/useHandTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport type { Tool } from '../../overlayBinding';\nimport { HandIcon } from '../../../icons';\nimport type { InertiaConfig } from 'core/viewport/useDecayLoop';\n\nexport type { InertiaConfig };\n\n/** Options for `useHandTool`. Both are forwarded to `viewport.dragPan` as\n * binding params; momentum additionally needs a `view` dep publishing\n * `decay`, which `<SceneCanvas>` wires. */\nexport interface UseHandToolOptions {\n /** Momentum after release: `true` for the kit defaults, or the settings.\n * Omit or pass `false` for none. */\n inertia?: boolean | InertiaConfig;\n /**\n * Which axes the drag responds to. Default `'both'`.\n *\n * - `'both'` — pan both axes (default).\n * - `'x'` — drag only changes `view.x`. Inertia (if enabled) also stays on x.\n * - `'y'` — drag only changes `view.y`. Inertia stays on y.\n *\n * Locks drag panning to a single axis. The former `useWheelPanTool` /\n * `useWheelZoomTool` / `useKeyboardZoomTool` axis option is dissolved.\n */\n axis?: 'both' | 'x' | 'y';\n}\n\n/**\n * Pan-on-drag tool. Registered in both the active slot (sticky, `H` key)\n * and the hotkey slot (momentary, hold `space`).\n *\n * A declarative shell: its one binding routes a drag to the\n * `viewport.dragPan` action, which owns the gesture, the view writes, and\n * the grabbing cursor. The tool only passes `axis` and `inertia` along.\n */\nexport function useHandTool(opts: UseHandToolOptions = {}): Tool {\n // Read through a ref from a params thunk rather than closing over the\n // values: a consumer passing `inertia={{ friction: 0.9 }}` inline would\n // otherwise mint a new tool identity on every render.\n const optsRef = useLatest(opts);\n return useMemo(\n () =>\n Object.assign(defineTool({\n id: 'hand',\n keybinding: { key: 'H' },\n capabilities: ['navigation'],\n hotkey: 'space',\n hookName: 'useHandTool',\n presentation: {\n label: 'Hand',\n icon: createElement(HandIcon),\n group: 'view',\n },\n cursor: 'grab',\n }), {\n // Declarative binding routes drag through the dispatcher +\n // viewportDragPanAction, which also owns the grabbing cursor\n // (`Action.activeCursor`) the tool used to declare as an `engaged`\n // phase entry.\n bindings: [{\n spec: { kind: 'drag' as const },\n actionId: 'viewport.dragPan',\n opts: {\n params: () => ({\n axis: optsRef.current.axis ?? 'both',\n inertia: optsRef.current.inertia,\n }),\n },\n }],\n }) as Tool,\n [optsRef],\n );\n}\n"],"mappings":";;;;;AAqCA,SAAgBC,EAAY,IAA2B,CAAC,GAAS;CAI/D,IAAMC,IAAUC,EAAUC,CAAI;CAC9B,OAAOC,QAEH,OAAO,OAAOC,EAAW;EACvB,IAAI;EACJ,YAAY,EAAE,KAAK,IAAI;EACvB,cAAc,CAAC,YAAY;EAC3B,QAAQ;EACR,UAAU;EACV,cAAc;GACZ,OAAO;GACP,MAAMC,EAAcP,CAAQ;GAC5B,OAAO;EACT;EACA,QAAQ;CACV,CAAC,GAAG,EAKF,UAAU,CAAC;EACT,MAAM,EAAE,MAAM,OAAgB;EAC9B,UAAU;EACV,MAAM,EACJ,eAAe;GACb,MAAME,EAAQ,QAAQ,QAAQ;GAC9B,SAASA,EAAQ,QAAQ;EAC3B,GACF;CACF,CAAC,EACH,CAAC,GACH,CAACA,CAAO,CACV;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"useImageTool.js","names":["ImageIcon","useImageTool","options","useMemo","defineTool","insertBindingBehaviors","behaviors","src","label","preview"],"sources":["../../../../src/tools/builtin/image/useImageTool.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { ImageIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\n\n/** Options for `useImageTool`. */\nexport interface UseImageToolOptions extends InsertToolOptions {\n /** Image source for inserted nodes — a URL, a `blob:` URL, or a\n * `data:image/…;base64,…` URI. Stored verbatim on each new node's\n * `data.image.src`. */\n src: string;\n label?: string;\n /** What the live drag paints. `'bitmap'` (default) previews the decoded\n * image inside the drag bounds, falling back to the outline until it\n * decodes; `'outline'` never draws the image. */\n preview?: 'bitmap' | 'outline';\n}\n\n/**\n * Drag-to-insert image tool. A drag-rect commits a leaf node with\n * `data: { image: { src } }` through the dispatcher's `insertAction` + the\n * kit's `insert` dep (the same path the shape tools use); the `kit:image`\n * painter renders it once the bitmap decodes.\n *\n * Thin declarative veneer — the node is minted by `useInsertDepSource`'s\n * `'image'` case, not the tool. `src` is baked into the binding's `params`\n * so the insert dep can stamp it onto the new node.\n */\nexport function useImageTool(options: UseImageToolOptions): Tool<null> {\n const { src, label = 'Image', preview = 'bitmap', behaviors } = options;\n return useMemo(\n () =>\n defineTool<null>({\n id: 'image',\n capabilities: ['creates-shapes'],\n hookName: 'useImageTool',\n cursor: 'crosshair',\n presentation: {\n label,\n group: 'shape',\n icon: <ImageIcon />,\n },\n // Declarative binding routes empty-space drags through the\n // dispatcher + insertAction; `kind: 'image'` selects the insert\n // dep's image factory and `src` rides along on the new node.\n bindings: [\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: { params: { kind: 'image', src, preview }, ...insertBindingBehaviors(behaviors) },\n },\n ],\n }),\n [src, label, preview, behaviors],\n );\n}\n"],"mappings":";;;;;;AA6BA,SAAgBC,EAAa,GAA0C;CACrE,IAAM,EAAE,QAAK,WAAQ,SAAS,aAAU,UAAU,iBAAcC;CAChE,OAAOC,QAEHC,EAAiB;EACf,IAAI;EACJ,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQ;EACR,cAAc;GACZ;GACA,OAAO;GACP,MAAM,kBAACJ,GAAD,CAAY,CAAA;EACpB;EAIA,UAAU,CACR;GACE,MAAM,EAAE,MAAM,OAAO;GACrB,UAAU;GACV,MAAM;IAAE,QAAQ;KAAE,MAAM;KAAS;KAAK;IAAQ;IAAG,GAAGK,EAAuBC,CAAS;GAAE;EACxF,CACF;CACF,CAAC,GACH;EAACC;EAAKC;EAAOC;EAASH;CAAS,CACjC;AACF"}
1
+ {"version":3,"file":"useImageTool.js","names":["ImageIcon","useImageTool","options","useMemo","defineTool","insertBindingBehaviors","behaviors","src","label","preview"],"sources":["../../../../src/tools/builtin/image/useImageTool.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { ImageIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\n\n/** Options for `useImageTool`. */\nexport interface UseImageToolOptions extends InsertToolOptions {\n /** Image source for inserted nodes — a URL, a `blob:` URL, or a\n * `data:image/…;base64,…` URI. Stored verbatim on each new node's\n * `data.image.src`. */\n src: string;\n label?: string;\n /** What the live drag paints. `'bitmap'` (default) previews the decoded\n * image inside the drag bounds, falling back to the outline until it\n * decodes; `'outline'` never draws the image. */\n preview?: 'bitmap' | 'outline';\n}\n\n/**\n * Drag-to-insert image tool. A drag-rect commits a leaf node with\n * `data: { image: { src } }` through the dispatcher's `insertAction` + the\n * kit's `insert` dep (the same path the shape tools use); the `kit:image`\n * painter renders it once the bitmap decodes.\n *\n * Thin declarative veneer — the node is minted by `useInsertDepSource`'s\n * `'image'` case, not the tool. `src` is baked into the binding's `params`\n * so the insert dep can stamp it onto the new node.\n */\nexport function useImageTool(options: UseImageToolOptions): Tool {\n const { src, label = 'Image', preview = 'bitmap', behaviors } = options;\n return useMemo(\n () =>\n defineTool({\n id: 'image',\n capabilities: ['creates-shapes'],\n hookName: 'useImageTool',\n cursor: 'crosshair',\n presentation: {\n label,\n group: 'shape',\n icon: <ImageIcon />,\n },\n // Declarative binding routes empty-space drags through the\n // dispatcher + insertAction; `kind: 'image'` selects the insert\n // dep's image factory and `src` rides along on the new node.\n bindings: [\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: { params: { kind: 'image', src, preview }, ...insertBindingBehaviors(behaviors) },\n },\n ],\n }),\n [src, label, preview, behaviors],\n );\n}\n"],"mappings":";;;;;;AA6BA,SAAgBC,EAAa,GAAoC;CAC/D,IAAM,EAAE,QAAK,WAAQ,SAAS,aAAU,UAAU,iBAAcC;CAChE,OAAOC,QAEHC,EAAW;EACT,IAAI;EACJ,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQ;EACR,cAAc;GACZ;GACA,OAAO;GACP,MAAM,kBAACJ,GAAD,CAAY,CAAA;EACpB;EAIA,UAAU,CACR;GACE,MAAM,EAAE,MAAM,OAAO;GACrB,UAAU;GACV,MAAM;IAAE,QAAQ;KAAE,MAAM;KAAS;KAAK;IAAQ;IAAG,GAAGK,EAAuBC,CAAS;GAAE;EACxF,CACF;CACF,CAAC,GACH;EAACC;EAAKC;EAAOC;EAASH;CAAS,CACjC;AACF"}
@@ -3,16 +3,16 @@ import t from "../../../icons/LassoIcon.js";
3
3
  import { createElement as n, useMemo as r } from "react";
4
4
  import { useLatest as i } from "@weasel-js/react";
5
5
  //#region src/tools/builtin/lasso/useLassoTool.ts
6
- function a(a, o = {}) {
7
- let s = i({
8
- mode: o.mode ?? "intersect",
9
- ...o.minVertexSpacing === void 0 ? {} : { minVertexSpacing: o.minVertexSpacing }
10
- }), { behaviors: c } = o;
6
+ function a(a = {}) {
7
+ let o = i({
8
+ mode: a.mode ?? "intersect",
9
+ ...a.minVertexSpacing === void 0 ? {} : { minVertexSpacing: a.minVertexSpacing }
10
+ }), { behaviors: s } = a;
11
11
  return r(() => e({
12
12
  id: "lasso",
13
13
  capabilities: ["creates-selection"],
14
14
  hookName: "useLassoTool",
15
- ...o.keybinding === null ? {} : { keybinding: o.keybinding ?? { key: "L" } },
15
+ ...a.keybinding === null ? {} : { keybinding: a.keybinding ?? { key: "L" } },
16
16
  cursor: "crosshair",
17
17
  presentation: {
18
18
  label: "Lasso",
@@ -26,14 +26,14 @@ function a(a, o = {}) {
26
26
  },
27
27
  actionId: "lassoSelect",
28
28
  opts: {
29
- params: () => s.current,
30
- ...c ? { behaviors: c } : {}
29
+ params: () => o.current,
30
+ ...s ? { behaviors: s } : {}
31
31
  }
32
32
  }]
33
33
  }), [
34
- o.keybinding,
35
- c,
36
- s
34
+ a.keybinding,
35
+ s,
36
+ o
37
37
  ]);
38
38
  }
39
39
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"useLassoTool.js","names":["LassoIcon","useLassoTool","paramsRef","useLatest","options","useMemo","defineTool","createElement","behaviors"],"sources":["../../../../src/tools/builtin/lasso/useLassoTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport { LassoIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport type { UseLassoSelectOptions } from 'interactions/actions/lasso-select/options';\nimport type { LassoHitMode, LassoSelectAdapter } from 'core/adapters/types';\nimport type { ToolKeybinding } from '@weasel-js/routing';\n\n/** Options for `useLassoTool` — the lasso-select action's options plus the\n * tool's own hit mode and activation key. */\nexport interface UseLassoToolOptions extends UseLassoSelectOptions {\n /** Hit mode for the action's own selection commit, which runs when no\n * behavior claims the gesture. A behavior carries its own, as\n * `selectFromLasso({ mode })` does. Default 'intersect'. */\n mode?: LassoHitMode;\n /** Override the default keybinding (`{ key: 'L' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n}\n\n/** Free-form polygon select Tool. Drag is handled entirely by the gesture\n * dispatcher via the `lassoSelect` action binding below; the dispatcher\n * overlay layer (`useDispatcherOverlayLayer`) paints the live polyline +\n * dashed close-line while the gesture is in flight. Esc cancels through\n * the dispatcher's standard cancel pipeline.\n *\n * The legacy `useLassoSelect` hook is removed — all gesture\n * state, overlay rendering, and selection commit live in\n * `lassoSelectAction` (see `src/interactions/actions/defaults/lassoSelect.ts`). */\nexport function useLassoTool(\n _adapter: LassoSelectAdapter,\n options: UseLassoToolOptions = {},\n): Tool<undefined> {\n const paramsRef = useLatest<{ mode: LassoHitMode; minVertexSpacing?: number }>({\n mode: options.mode ?? 'intersect',\n ...(options.minVertexSpacing !== undefined ? { minVertexSpacing: options.minVertexSpacing } : {}),\n });\n const { behaviors } = options;\n\n return useMemo(() => {\n return defineTool<undefined>({\n id: 'lasso',\n capabilities: ['creates-selection'],\n hookName: 'useLassoTool',\n ...(options.keybinding === null ? {} : { keybinding: options.keybinding ?? { key: 'L' } }),\n cursor: 'crosshair',\n presentation: {\n label: 'Lasso',\n icon: createElement(LassoIcon),\n group: 'select',\n },\n // Declarative drag binding for the new gesture dispatcher. The\n // dispatcher invokes `lassoSelectAction`, which owns vertex buffering,\n // overlay state, and the commit-on-end selection write.\n bindings: [\n {\n spec: { kind: 'drag', mods: { shift: 'optional' } },\n actionId: 'lassoSelect',\n // Thunked so a mode or spacing change reaches the next gesture\n // without rebuilding the tool.\n opts: {\n params: () => paramsRef.current,\n ...(behaviors ? { behaviors } : {}),\n },\n },\n ],\n });\n }, [options.keybinding, behaviors, paramsRef]);\n}\n"],"mappings":";;;;;AA6BA,SAAgBC,EACd,GACA,IAA+B,CAAC,GACf;CACjB,IAAMC,IAAYC,EAA6D;EAC7E,MAAMC,EAAQ,QAAQ;EACtB,GAAIA,EAAQ,qBAAqB,KAAA,IAA6D,CAAC,IAAlD,EAAE,kBAAkBA,EAAQ,iBAAiB;CAC5F,CAAC,GACK,EAAE,iBAAcA;CAEtB,OAAOC,QACEC,EAAsB;EAC3B,IAAI;EACJ,cAAc,CAAC,mBAAmB;EAClC,UAAU;EACV,GAAIF,EAAQ,eAAe,OAAO,CAAC,IAAI,EAAE,YAAYA,EAAQ,cAAc,EAAE,KAAK,IAAI,EAAE;EACxF,QAAQ;EACR,cAAc;GACZ,OAAO;GACP,MAAMG,EAAcP,CAAS;GAC7B,OAAO;EACT;EAIA,UAAU,CACR;GACE,MAAM;IAAE,MAAM;IAAQ,MAAM,EAAE,OAAO,WAAW;GAAE;GAClD,UAAU;GAGV,MAAM;IACJ,cAAcE,EAAU;IACxB,GAAIM,IAAY,EAAE,aAAU,IAAI,CAAC;GACnC;EACF,CACF;CACF,CAAC,GACA;EAACJ,EAAQ;EAAYI;EAAWN;CAAS,CAAC;AAC/C"}
1
+ {"version":3,"file":"useLassoTool.js","names":["LassoIcon","useLassoTool","paramsRef","useLatest","options","useMemo","defineTool","createElement","behaviors"],"sources":["../../../../src/tools/builtin/lasso/useLassoTool.ts"],"sourcesContent":["import { useMemo, createElement } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { defineTool } from '../../overlayBinding';\nimport { LassoIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport type { UseLassoSelectOptions } from 'interactions/actions/lasso-select/options';\nimport type { LassoHitMode } from 'core/adapters/types';\nimport type { ToolKeybinding } from '@weasel-js/routing';\n\n/** Options for `useLassoTool` — the lasso-select action's options plus the\n * tool's own hit mode and activation key. */\nexport interface UseLassoToolOptions extends UseLassoSelectOptions {\n /** Hit mode for the action's own selection commit, which runs when no\n * behavior claims the gesture. A behavior carries its own, as\n * `selectFromLasso({ mode })` does. Default 'intersect'. */\n mode?: LassoHitMode;\n /** Override the default keybinding (`{ key: 'L' }`). Pass `null` to omit. */\n keybinding?: ToolKeybinding | null;\n}\n\n/** Free-form polygon select Tool. Drag is handled entirely by the gesture\n * dispatcher via the `lassoSelect` action binding below; the dispatcher\n * overlay layer (`useDispatcherOverlayLayer`) paints the live polyline +\n * dashed close-line while the gesture is in flight. Esc cancels through\n * the dispatcher's standard cancel pipeline.\n *\n * The legacy `useLassoSelect` hook is removed — all gesture\n * state, overlay rendering, and selection commit live in\n * `lassoSelectAction` (see `src/interactions/actions/defaults/lassoSelect.ts`). */\nexport function useLassoTool(options: UseLassoToolOptions = {}): Tool {\n const paramsRef = useLatest<{ mode: LassoHitMode; minVertexSpacing?: number }>({\n mode: options.mode ?? 'intersect',\n ...(options.minVertexSpacing !== undefined ? { minVertexSpacing: options.minVertexSpacing } : {}),\n });\n const { behaviors } = options;\n\n return useMemo(() => {\n return defineTool({\n id: 'lasso',\n capabilities: ['creates-selection'],\n hookName: 'useLassoTool',\n ...(options.keybinding === null ? {} : { keybinding: options.keybinding ?? { key: 'L' } }),\n cursor: 'crosshair',\n presentation: {\n label: 'Lasso',\n icon: createElement(LassoIcon),\n group: 'select',\n },\n // Declarative drag binding for the new gesture dispatcher. The\n // dispatcher invokes `lassoSelectAction`, which owns vertex buffering,\n // overlay state, and the commit-on-end selection write.\n bindings: [\n {\n spec: { kind: 'drag', mods: { shift: 'optional' } },\n actionId: 'lassoSelect',\n // Thunked so a mode or spacing change reaches the next gesture\n // without rebuilding the tool.\n opts: {\n params: () => paramsRef.current,\n ...(behaviors ? { behaviors } : {}),\n },\n },\n ],\n });\n }, [options.keybinding, behaviors, paramsRef]);\n}\n"],"mappings":";;;;;AA6BA,SAAgBC,EAAa,IAA+B,CAAC,GAAS;CACpE,IAAMC,IAAYC,EAA6D;EAC7E,MAAMC,EAAQ,QAAQ;EACtB,GAAIA,EAAQ,qBAAqB,KAAA,IAA6D,CAAC,IAAlD,EAAE,kBAAkBA,EAAQ,iBAAiB;CAC5F,CAAC,GACK,EAAE,iBAAcA;CAEtB,OAAOC,QACEC,EAAW;EAChB,IAAI;EACJ,cAAc,CAAC,mBAAmB;EAClC,UAAU;EACV,GAAIF,EAAQ,eAAe,OAAO,CAAC,IAAI,EAAE,YAAYA,EAAQ,cAAc,EAAE,KAAK,IAAI,EAAE;EACxF,QAAQ;EACR,cAAc;GACZ,OAAO;GACP,MAAMG,EAAcP,CAAS;GAC7B,OAAO;EACT;EAIA,UAAU,CACR;GACE,MAAM;IAAE,MAAM;IAAQ,MAAM,EAAE,OAAO,WAAW;GAAE;GAClD,UAAU;GAGV,MAAM;IACJ,cAAcE,EAAU;IACxB,GAAIM,IAAY,EAAE,aAAU,IAAI,CAAC;GACnC;EACF,CACF;CACF,CAAC,GACA;EAACJ,EAAQ;EAAYI;EAAWN;CAAS,CAAC;AAC/C"}
@@ -9,6 +9,7 @@ function o(o = {}) {
9
9
  let { behaviors: s } = o;
10
10
  return r(() => e({
11
11
  id: "line",
12
+ keybinding: { key: "\\" },
12
13
  capabilities: ["creates-shapes"],
13
14
  hookName: "useLineTool",
14
15
  cursor: a("crosshairLine", { fallback: "crosshair" }),
@@ -1 +1 @@
1
- {"version":3,"file":"useLineTool.js","names":["LineIcon","useLineTool","options","useMemo","defineTool","cursorFor","insertBindingBehaviors","behaviors"],"sources":["../../../../src/tools/builtin/line/useLineTool.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { LineIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/** An endpoint of a line, in world coordinates. */\nexport interface LinePoint { x: number; y: number }\n\n/**\n * Click-down → drag → release line tool. The `drag` binding routes to\n * `insertAction`, which owns the live preview and commits through the\n * `insert` dep with `{ kind: 'line', a, b }` endpoints (not the AABB\n * diagonal), so the drag direction is preserved.\n *\n * Modifiers are applied by `insertAction`:\n * - shift: constrain to 15° increments\n * - alt: mirror the end around the start (the drag is treated as a\n * half-line) — the line-specific reading of the action's\n * corner ⇄ center origin toggle\n */\nexport function useLineTool(options: InsertToolOptions = {}): Tool<null> {\n const { behaviors } = options;\n return useMemo(\n () =>\n defineTool<null>({\n id: 'line',\n capabilities: ['creates-shapes'],\n hookName: 'useLineTool',\n cursor: cursorFor('crosshairLine', { fallback: 'crosshair' }),\n presentation: {\n label: 'Line',\n group: 'shape',\n icon: <LineIcon />,\n },\n bindings: [\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: { params: { kind: 'line' } , ...insertBindingBehaviors(behaviors) },\n },\n ],\n }),\n [behaviors],\n );\n}\n"],"mappings":";;;;;;;AAsBA,SAAgBC,EAAY,IAA6B,CAAC,GAAe;CACvE,IAAM,EAAE,iBAAcC;CACtB,OAAOC,QAEHC,EAAiB;EACf,IAAI;EACJ,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQC,EAAU,iBAAiB,EAAE,UAAU,YAAY,CAAC;EAC5D,cAAc;GACZ,OAAO;GACP,OAAO;GACP,MAAM,kBAACL,GAAD,CAAW,CAAA;EACnB;EACA,UAAU,CACR;GACE,MAAM,EAAE,MAAM,OAAO;GACrB,UAAU;GACV,MAAM;IAAE,QAAQ,EAAE,MAAM,OAAO;IAAI,GAAGM,EAAuBC,CAAS;GAAE;EAC1E,CACF;CACF,CAAC,GACH,CAACA,CAAS,CACZ;AACF"}
1
+ {"version":3,"file":"useLineTool.js","names":["LineIcon","useLineTool","options","useMemo","defineTool","cursorFor","insertBindingBehaviors","behaviors"],"sources":["../../../../src/tools/builtin/line/useLineTool.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { defineTool } from '../../overlayBinding';\nimport { LineIcon } from '../../../icons';\nimport type { Tool } from '../../overlayBinding';\nimport { insertBindingBehaviors, type InsertToolOptions } from '../shared/insertToolOptions';\nimport { cursorFor } from '@weasel-js/cursor';\n\n/** An endpoint of a line, in world coordinates. */\nexport interface LinePoint { x: number; y: number }\n\n/**\n * Drag-to-draw line tool. The `drag` binding routes to `insertAction`, which\n * commits through the `insert` dep with `{ kind: 'line', a, b }` endpoints\n * (not the AABB diagonal), so the drag direction is preserved.\n *\n * Shift constrains to 15° increments; alt mirrors the end around the start\n * (the drag is treated as a half-line).\n */\nexport function useLineTool(options: InsertToolOptions = {}): Tool {\n const { behaviors } = options;\n return useMemo(\n () =>\n defineTool({\n id: 'line',\n keybinding: { key: '\\\\' },\n capabilities: ['creates-shapes'],\n hookName: 'useLineTool',\n cursor: cursorFor('crosshairLine', { fallback: 'crosshair' }),\n presentation: {\n label: 'Line',\n group: 'shape',\n icon: <LineIcon />,\n },\n bindings: [\n {\n spec: { kind: 'drag' },\n actionId: 'insert',\n opts: { params: { kind: 'line' } , ...insertBindingBehaviors(behaviors) },\n },\n ],\n }),\n [behaviors],\n );\n}\n"],"mappings":";;;;;;;AAkBA,SAAgBC,EAAY,IAA6B,CAAC,GAAS;CACjE,IAAM,EAAE,iBAAcC;CACtB,OAAOC,QAEHC,EAAW;EACT,IAAI;EACJ,YAAY,EAAE,KAAK,KAAK;EACxB,cAAc,CAAC,gBAAgB;EAC/B,UAAU;EACV,QAAQC,EAAU,iBAAiB,EAAE,UAAU,YAAY,CAAC;EAC5D,cAAc;GACZ,OAAO;GACP,OAAO;GACP,MAAM,kBAACL,GAAD,CAAW,CAAA;EACnB;EACA,UAAU,CACR;GACE,MAAM,EAAE,MAAM,OAAO;GACrB,UAAU;GACV,MAAM;IAAE,QAAQ,EAAE,MAAM,OAAO;IAAI,GAAGM,EAAuBC,CAAS;GAAE;EAC1E,CACF;CACF,CAAC,GACH,CAACA,CAAS,CACZ;AACF"}