@weasel-js/core 1.11.0 → 1.12.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 (586) hide show
  1. package/CHANGELOG.md +611 -0
  2. package/README.md +1 -1
  3. package/dist/WeaselProvider.js +1 -1
  4. package/dist/affordances/pathAnchors.js +10 -6
  5. package/dist/affordances/pathAnchors.js.map +1 -1
  6. package/dist/animation/index.js +3 -3
  7. package/dist/animation/rig/bindRig.js +1 -1
  8. package/dist/animation/rig/rigNode.js.map +1 -1
  9. package/dist/barrel/canvas.js +9 -3
  10. package/dist/barrel/interactions.js +5 -4
  11. package/dist/barrel/paint.js +4 -4
  12. package/dist/barrel/paths.js +10 -6
  13. package/dist/barrel/renderer.js +5 -3
  14. package/dist/barrel/routing.js +7 -12
  15. package/dist/barrel/scene.js +9 -5
  16. package/dist/barrel/text.js +2 -2
  17. package/dist/barrel/viewport.js +9 -4
  18. package/dist/canvas/Canvas.js +5 -2
  19. package/dist/canvas/Canvas.js.map +1 -1
  20. package/dist/canvas/CanvasView.js +23 -34
  21. package/dist/canvas/CanvasView.js.map +1 -1
  22. package/dist/canvas/ModalityHud.js +1 -1
  23. package/dist/canvas/NodeShape.js +4 -1
  24. package/dist/canvas/NodeShape.js.map +1 -1
  25. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +1 -1
  26. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +1 -1
  27. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +1 -1
  28. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +17 -3
  29. package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
  30. package/dist/canvas/SceneCanvas/SurfaceDeclarations.js +23 -0
  31. package/dist/canvas/SceneCanvas/SurfaceDeclarations.js.map +1 -0
  32. package/dist/canvas/SceneCanvas/builtinToolSets.js +30 -0
  33. package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -0
  34. package/dist/canvas/SceneCanvas/canvasPassThrough.js +2 -0
  35. package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -1
  36. package/dist/canvas/SceneCanvas/coordTrace.js +5 -16
  37. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  38. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +5 -0
  39. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  40. package/dist/canvas/SceneCanvas/features.js +45 -5
  41. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  42. package/dist/canvas/SceneCanvas/props.js +1 -11
  43. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  44. package/dist/canvas/SceneCanvas/scenePointQuery.js +7 -3
  45. package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -1
  46. package/dist/canvas/SceneCanvas/toolRegistry.js +8 -4
  47. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
  48. package/dist/canvas/SceneCanvas/useActionTunings.js +6 -1
  49. package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -1
  50. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +1 -11
  51. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  52. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  53. package/dist/canvas/SceneCanvas/useBuiltinTools.js +2 -9
  54. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -1
  55. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js +94 -0
  56. package/dist/canvas/SceneCanvas/useCanvasDevtoolsRoot.js.map +1 -0
  57. package/dist/canvas/SceneCanvas/useCanvasSelection.js +7 -2
  58. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -1
  59. package/dist/canvas/SceneCanvas/useCanvasTools.js +15 -10
  60. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
  61. package/dist/canvas/SceneCanvas/useNodeKinds.js +1 -1
  62. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -1
  63. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +9 -3
  64. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -1
  65. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +23 -4
  66. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
  67. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +2 -3
  68. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -1
  69. package/dist/canvas/SceneCanvas/useSceneChrome.js +6 -7
  70. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
  71. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +24 -7
  72. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -1
  73. package/dist/canvas/SceneCanvas/useScenePicking.js +2 -3
  74. package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -1
  75. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +2 -1
  76. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  77. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +5 -5
  78. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
  79. package/dist/canvas/SceneCanvas.js +27 -24
  80. package/dist/canvas/SceneCanvas.js.map +1 -1
  81. package/dist/canvas/SurfaceCanvas.js +5 -22
  82. package/dist/canvas/SurfaceCanvas.js.map +1 -1
  83. package/dist/canvas/ViewMarker.js +35 -0
  84. package/dist/canvas/ViewMarker.js.map +1 -0
  85. package/dist/canvas/canvasRenderer.js +9 -5
  86. package/dist/canvas/canvasRenderer.js.map +1 -1
  87. package/dist/canvas/contextAttributes.js +14 -0
  88. package/dist/canvas/contextAttributes.js.map +1 -0
  89. package/dist/canvas/defaultDrawOne.js +2 -0
  90. package/dist/canvas/defaultDrawOne.js.map +1 -1
  91. package/dist/canvas/deps/booleans.js +2 -1
  92. package/dist/canvas/deps/booleans.js.map +1 -1
  93. package/dist/canvas/deps/editAnchors.js +9 -113
  94. package/dist/canvas/deps/editAnchors.js.map +1 -1
  95. package/dist/canvas/deps/hitTestArea.js +2 -2
  96. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  97. package/dist/canvas/deps/insert.js +10 -4
  98. package/dist/canvas/deps/insert.js.map +1 -1
  99. package/dist/canvas/deps/pathEditCommits.js +189 -0
  100. package/dist/canvas/deps/pathEditCommits.js.map +1 -0
  101. package/dist/canvas/deps/snap.js +12 -9
  102. package/dist/canvas/deps/snap.js.map +1 -1
  103. package/dist/canvas/deps/transformFollowers.js +20 -0
  104. package/dist/canvas/deps/transformFollowers.js.map +1 -0
  105. package/dist/canvas/derivedPath.js +20 -1
  106. package/dist/canvas/derivedPath.js.map +1 -1
  107. package/dist/canvas/drawnBounds.js +38 -4
  108. package/dist/canvas/drawnBounds.js.map +1 -1
  109. package/dist/canvas/inheritedPaints.js +44 -0
  110. package/dist/canvas/inheritedPaints.js.map +1 -0
  111. package/dist/canvas/nodeShapes/derivedPainter.js +23 -16
  112. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  113. package/dist/canvas/nodeShapes/nodePaint.js +13 -34
  114. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  115. package/dist/canvas/nodeShapes/pathPainter.js +12 -10
  116. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  117. package/dist/canvas/nodeShapes/rectFallbackPainter.js +4 -5
  118. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  119. package/dist/canvas/nodeShapes/shapePainter.js +12 -11
  120. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  121. package/dist/canvas/nodeShapes/textPainter.js +13 -12
  122. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  123. package/dist/canvas/overlayRoleStrokes.js +12 -0
  124. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  125. package/dist/canvas/pathOverlay.js +27 -7
  126. package/dist/canvas/pathOverlay.js.map +1 -1
  127. package/dist/canvas/pickReach.js +3 -3
  128. package/dist/canvas/pickReach.js.map +1 -1
  129. package/dist/canvas/pickWalk.js +3 -1
  130. package/dist/canvas/pickWalk.js.map +1 -1
  131. package/dist/canvas/renderDebugSnapshot.js +1 -0
  132. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  133. package/dist/canvas/renderSceneToPixels.js +7 -6
  134. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  135. package/dist/canvas/sceneAdapter.js.map +1 -1
  136. package/dist/canvas/sceneSlotWiring.js +2 -1
  137. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  138. package/dist/canvas/sceneViewRender.js +2 -1
  139. package/dist/canvas/sceneViewRender.js.map +1 -1
  140. package/dist/canvas/surfaceContribution.js +12 -8
  141. package/dist/canvas/surfaceContribution.js.map +1 -1
  142. package/dist/canvas/useCanvasPaint.js +2 -1
  143. package/dist/canvas/useCanvasPaint.js.map +1 -1
  144. package/dist/canvas/useCanvasView.js +4 -2
  145. package/dist/canvas/useCanvasView.js.map +1 -1
  146. package/dist/canvas/useInFlightBounds.js +52 -0
  147. package/dist/canvas/useInFlightBounds.js.map +1 -0
  148. package/dist/canvas/useLayerStack.js +6 -2
  149. package/dist/canvas/useLayerStack.js.map +1 -1
  150. package/dist/canvas/useViewAim.js +121 -0
  151. package/dist/canvas/useViewAim.js.map +1 -0
  152. package/dist/canvas/useViewHelpers.js +7 -9
  153. package/dist/canvas/useViewHelpers.js.map +1 -1
  154. package/dist/canvas/useViewNesting.js +3 -2
  155. package/dist/canvas/useViewNesting.js.map +1 -1
  156. package/dist/canvas/useViewRegistrySurface.js +4 -2
  157. package/dist/canvas/useViewRegistrySurface.js.map +1 -1
  158. package/dist/canvas/viewMarkers.js +63 -0
  159. package/dist/canvas/viewMarkers.js.map +1 -0
  160. package/dist/canvas/viewRegistry.js +27 -1
  161. package/dist/canvas/viewRegistry.js.map +1 -1
  162. package/dist/clipboard.d.ts +3 -2
  163. package/dist/{clone-DZDrfIlU.d.ts → clone-C3e0OTuF.d.ts} +8 -21
  164. package/dist/clone.d.ts +4 -3
  165. package/dist/core/geometry/autoPoseDescriptor.js +1 -1
  166. package/dist/core/ops/setDependsOn.js +37 -0
  167. package/dist/core/ops/setDependsOn.js.map +1 -0
  168. package/dist/core/ops/writtenBy.js +53 -0
  169. package/dist/core/ops/writtenBy.js.map +1 -0
  170. package/dist/core/pages/fitViewToPage.js +12 -1
  171. package/dist/core/pages/fitViewToPage.js.map +1 -1
  172. package/dist/core/pages/pageEdits.js +163 -0
  173. package/dist/core/pages/pageEdits.js.map +1 -0
  174. package/dist/core/pages/pages.js +30 -1
  175. package/dist/core/pages/pages.js.map +1 -1
  176. package/dist/core/paint/meshKindLazy.js +59 -2
  177. package/dist/core/paint/meshKindLazy.js.map +1 -1
  178. package/dist/core/scene/NodeRouting.js +8 -3
  179. package/dist/core/scene/NodeRouting.js.map +1 -1
  180. package/dist/core/scene/arrivalWindow.js.map +1 -1
  181. package/dist/core/scene/carryDescendants.js +51 -0
  182. package/dist/core/scene/carryDescendants.js.map +1 -0
  183. package/dist/core/scene/clipNothing.js +13 -0
  184. package/dist/core/scene/clipNothing.js.map +1 -0
  185. package/dist/core/scene/depMemo.js +11 -3
  186. package/dist/core/scene/depMemo.js.map +1 -1
  187. package/dist/core/scene/dependents.js +7 -1
  188. package/dist/core/scene/dependents.js.map +1 -1
  189. package/dist/core/scene/derivedParts.js +10 -11
  190. package/dist/core/scene/derivedParts.js.map +1 -1
  191. package/dist/core/scene/docValues.js +57 -0
  192. package/dist/core/scene/docValues.js.map +1 -0
  193. package/dist/core/scene/editPass.js +111 -0
  194. package/dist/core/scene/editPass.js.map +1 -0
  195. package/dist/core/scene/effectivePose.js +13 -2
  196. package/dist/core/scene/effectivePose.js.map +1 -1
  197. package/dist/core/scene/fieldEdits.js +4 -1
  198. package/dist/core/scene/fieldEdits.js.map +1 -1
  199. package/dist/core/scene/fontReads.js +37 -0
  200. package/dist/core/scene/fontReads.js.map +1 -0
  201. package/dist/core/scene/historyFacade.js +1 -0
  202. package/dist/core/scene/historyFacade.js.map +1 -1
  203. package/dist/core/scene/inheritedPaint.js +75 -0
  204. package/dist/core/scene/inheritedPaint.js.map +1 -0
  205. package/dist/core/scene/kitRegistry.js +5 -0
  206. package/dist/core/scene/kitRegistry.js.map +1 -1
  207. package/dist/core/scene/layoutPass.js +28 -3
  208. package/dist/core/scene/layoutPass.js.map +1 -1
  209. package/dist/core/scene/nodeMemo.js +15 -7
  210. package/dist/core/scene/nodeMemo.js.map +1 -1
  211. package/dist/core/scene/pathEffects/blend.js.map +1 -1
  212. package/dist/core/scene/pathEffects/derive.js +7 -2
  213. package/dist/core/scene/pathEffects/derive.js.map +1 -1
  214. package/dist/core/scene/pathEffects/effects.js +3 -1
  215. package/dist/core/scene/pathEffects/effects.js.map +1 -1
  216. package/dist/core/scene/pathEffects/textAlong.js +95 -0
  217. package/dist/core/scene/pathEffects/textAlong.js.map +1 -0
  218. package/dist/core/scene/recorder.js +28 -19
  219. package/dist/core/scene/recorder.js.map +1 -1
  220. package/dist/core/scene/scene.js +15 -9
  221. package/dist/core/scene/scene.js.map +1 -1
  222. package/dist/core/scene/sceneChanges.js +13 -0
  223. package/dist/core/scene/sceneChanges.js.map +1 -0
  224. package/dist/core/scene/sceneEdits.js +8 -1
  225. package/dist/core/scene/sceneEdits.js.map +1 -1
  226. package/dist/core/scene/sceneMutators.js +1 -0
  227. package/dist/core/scene/sceneMutators.js.map +1 -1
  228. package/dist/core/scene/sceneRecording.js +20 -3
  229. package/dist/core/scene/sceneRecording.js.map +1 -1
  230. package/dist/core/scene/sceneSelection.js +4 -1
  231. package/dist/core/scene/sceneSelection.js.map +1 -1
  232. package/dist/core/scene/sceneState.js +11 -5
  233. package/dist/core/scene/sceneState.js.map +1 -1
  234. package/dist/core/scene/serialization.js +5 -3
  235. package/dist/core/scene/serialization.js.map +1 -1
  236. package/dist/core/scene/types.js.map +1 -1
  237. package/dist/core/scene/unitScopes.js +19 -1
  238. package/dist/core/scene/unitScopes.js.map +1 -1
  239. package/dist/core/selection/usePublishSceneSelection.js +6 -12
  240. package/dist/core/selection/usePublishSceneSelection.js.map +1 -1
  241. package/dist/core/shapeKinds.js +25 -11
  242. package/dist/core/shapeKinds.js.map +1 -1
  243. package/dist/{cornerHandles-Camw_yeu.d.ts → cornerHandles-p8fDIAKt.d.ts} +3 -2
  244. package/dist/debug/createDebugOverlayLayer.js +16 -111
  245. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  246. package/dist/debug/createDebugSink.js +2 -1
  247. package/dist/debug/createDebugSink.js.map +1 -1
  248. package/dist/debug/defaultTheme.js +4 -2
  249. package/dist/debug/defaultTheme.js.map +1 -1
  250. package/dist/debug/features.js +17 -0
  251. package/dist/debug/features.js.map +1 -0
  252. package/dist/debug/overlayPanels.js +117 -0
  253. package/dist/debug/overlayPanels.js.map +1 -0
  254. package/dist/debug/parseDebugFlags.js +4 -13
  255. package/dist/debug/parseDebugFlags.js.map +1 -1
  256. package/dist/{depSchema-Cgfu_G9s.d.ts → depSchema-mG19aEdD.d.ts} +174 -904
  257. package/dist/devtools/handlers.js +112 -0
  258. package/dist/devtools/handlers.js.map +1 -0
  259. package/dist/devtools/history.js +71 -0
  260. package/dist/devtools/history.js.map +1 -0
  261. package/dist/devtools/hook.js +74 -0
  262. package/dist/devtools/hook.js.map +1 -0
  263. package/dist/devtools/label.js +25 -0
  264. package/dist/devtools/label.js.map +1 -0
  265. package/dist/devtools/notices.js +58 -0
  266. package/dist/devtools/notices.js.map +1 -0
  267. package/dist/devtools/protocol.js +7 -0
  268. package/dist/devtools/protocol.js.map +1 -0
  269. package/dist/devtools/registry.js +90 -0
  270. package/dist/devtools/registry.js.map +1 -0
  271. package/dist/devtools/root.js +80 -0
  272. package/dist/devtools/root.js.map +1 -0
  273. package/dist/devtools/serialize.js +86 -0
  274. package/dist/devtools/serialize.js.map +1 -0
  275. package/dist/devtools/session.js +111 -0
  276. package/dist/devtools/session.js.map +1 -0
  277. package/dist/devtools/transport.js +67 -0
  278. package/dist/devtools/transport.js.map +1 -0
  279. package/dist/devtools/useDevtoolsRoot.js +81 -0
  280. package/dist/devtools/useDevtoolsRoot.js.map +1 -0
  281. package/dist/devtools-protocol.d.ts +435 -0
  282. package/dist/devtools-protocol.js +7 -0
  283. package/dist/devtools.d.ts +8 -0
  284. package/dist/devtools.js +12 -0
  285. package/dist/devtools.js.map +1 -0
  286. package/dist/features/chrome-caps/useHoverTracking.js +16 -10
  287. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  288. package/dist/features/ingestion/contentHandlers.js +25 -2
  289. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  290. package/dist/features/measure/measureCommands.js +7 -5
  291. package/dist/features/measure/measureCommands.js.map +1 -1
  292. package/dist/features/measure/measureContribution.js +4 -2
  293. package/dist/features/measure/measureContribution.js.map +1 -1
  294. package/dist/features/modes/modeTriggers.js +7 -3
  295. package/dist/features/modes/modeTriggers.js.map +1 -1
  296. package/dist/features/pathEffects/effectSources.js +60 -0
  297. package/dist/features/pathEffects/effectSources.js.map +1 -0
  298. package/dist/features/pathEffects/readSource.js +17 -1
  299. package/dist/features/pathEffects/readSource.js.map +1 -1
  300. package/dist/features/pathEffects/textItems.js +53 -0
  301. package/dist/features/pathEffects/textItems.js.map +1 -0
  302. package/dist/features/pathEffects/useEffectSourcesLayer.js +57 -0
  303. package/dist/features/pathEffects/useEffectSourcesLayer.js.map +1 -0
  304. package/dist/features/paths/index.js +2 -2
  305. package/dist/features/paths/pathEditExtension.js.map +1 -1
  306. package/dist/features/paths/pathEditState.js +5 -2
  307. package/dist/features/paths/pathEditState.js.map +1 -1
  308. package/dist/features/paths/pathSnap/pathSnapSource.js +5 -5
  309. package/dist/features/paths/pathSnap/pathSnapSource.js.map +1 -1
  310. package/dist/features/paths/pathSnap/sceneIndex.js +10 -3
  311. package/dist/features/paths/pathSnap/sceneIndex.js.map +1 -1
  312. package/dist/features/selection/selectionPose.js +4 -1
  313. package/dist/features/selection/selectionPose.js.map +1 -1
  314. package/dist/features/snap/gather.js +9 -1
  315. package/dist/features/snap/gather.js.map +1 -1
  316. package/dist/features/snap/lazySession.js +17 -0
  317. package/dist/features/snap/lazySession.js.map +1 -0
  318. package/dist/features/snap/marks.js.map +1 -1
  319. package/dist/features/snap/probes2d.js +27 -19
  320. package/dist/features/snap/probes2d.js.map +1 -1
  321. package/dist/features/snap/readoutLayer.js.map +1 -1
  322. package/dist/features/snap/roles.js +2 -1
  323. package/dist/features/snap/roles.js.map +1 -1
  324. package/dist/features/snap/rotationSource.js +25 -8
  325. package/dist/features/snap/rotationSource.js.map +1 -1
  326. package/dist/features/snap/sceneSession2d.js +6 -4
  327. package/dist/features/snap/sceneSession2d.js.map +1 -1
  328. package/dist/features/snap/session2d.js +37 -23
  329. package/dist/features/snap/session2d.js.map +1 -1
  330. package/dist/features/snap/spanSnap.js +5 -2
  331. package/dist/features/snap/spanSnap.js.map +1 -1
  332. package/dist/features/text/sceneTextDrafts.js +65 -0
  333. package/dist/features/text/sceneTextDrafts.js.map +1 -0
  334. package/dist/features/text/textHitAt.js +31 -2
  335. package/dist/features/text/textHitAt.js.map +1 -1
  336. package/dist/features/text/useSceneTextEdit.js +22 -18
  337. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  338. package/dist/features/viewports/aim.js +105 -0
  339. package/dist/features/viewports/aim.js.map +1 -0
  340. package/dist/features/viewports/viewMarker.js +82 -0
  341. package/dist/features/viewports/viewMarker.js.map +1 -0
  342. package/dist/features/viewports/viewMarkerDrag.js +55 -0
  343. package/dist/features/viewports/viewMarkerDrag.js.map +1 -0
  344. package/dist/icons.table.js +1 -1
  345. package/dist/icons.table.js.map +1 -1
  346. package/dist/icons.table.json +0 -10
  347. package/dist/index.d.ts +1198 -894
  348. package/dist/index.js +55 -38
  349. package/dist/interactions/actions/align/action.js +6 -4
  350. package/dist/interactions/actions/align/action.js.map +1 -1
  351. package/dist/interactions/actions/align/align.js.map +1 -1
  352. package/dist/interactions/actions/booleans/action.js +7 -1
  353. package/dist/interactions/actions/booleans/action.js.map +1 -1
  354. package/dist/interactions/actions/booleans/booleans.js +2 -1
  355. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  356. package/dist/interactions/actions/booleans/operands.js +6 -5
  357. package/dist/interactions/actions/booleans/operands.js.map +1 -1
  358. package/dist/interactions/actions/clipboard/action.js +27 -17
  359. package/dist/interactions/actions/clipboard/action.js.map +1 -1
  360. package/dist/interactions/actions/clone/action.js +1 -1
  361. package/dist/interactions/actions/clone/behaviors.js +4 -4
  362. package/dist/interactions/actions/clone/behaviors.js.map +1 -1
  363. package/dist/interactions/actions/defaults/anchorEditing.js +44 -23
  364. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  365. package/dist/interactions/actions/defaults/anchorJoin.js +12 -6
  366. package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -1
  367. package/dist/interactions/actions/defaults/bendSegment.js +8 -5
  368. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
  369. package/dist/interactions/actions/defaults/cancelGesture.js +11 -8
  370. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  371. package/dist/interactions/actions/defaults/contextMenu.js +17 -8
  372. package/dist/interactions/actions/defaults/contextMenu.js.map +1 -1
  373. package/dist/interactions/actions/defaults/createPaintAction.js +2 -2
  374. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  375. package/dist/interactions/actions/defaults/delete.js +64 -41
  376. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  377. package/dist/interactions/actions/defaults/duplicate.js +12 -9
  378. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  379. package/dist/interactions/actions/defaults/enterPathEdit.js +19 -9
  380. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  381. package/dist/interactions/actions/defaults/escape.js +11 -8
  382. package/dist/interactions/actions/defaults/escape.js.map +1 -1
  383. package/dist/interactions/actions/defaults/exitPathEdit.js +7 -4
  384. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -1
  385. package/dist/interactions/actions/defaults/group.js +21 -15
  386. package/dist/interactions/actions/defaults/group.js.map +1 -1
  387. package/dist/interactions/actions/defaults/ingest.js +17 -9
  388. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  389. package/dist/interactions/actions/defaults/insertPathAnchor.js +7 -4
  390. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  391. package/dist/interactions/actions/defaults/nudge.js +21 -40
  392. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  393. package/dist/interactions/actions/defaults/pathEditTools.js +11 -8
  394. package/dist/interactions/actions/defaults/pathEditTools.js.map +1 -1
  395. package/dist/interactions/actions/defaults/pinchZoom.js +7 -4
  396. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  397. package/dist/interactions/actions/defaults/reorder.js +24 -6
  398. package/dist/interactions/actions/defaults/reorder.js.map +1 -1
  399. package/dist/interactions/actions/defaults/selectAll.js +8 -5
  400. package/dist/interactions/actions/defaults/selectAll.js.map +1 -1
  401. package/dist/interactions/actions/defaults/setFill.js +7 -3
  402. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  403. package/dist/interactions/actions/defaults/setFillOpacity.js +1 -1
  404. package/dist/interactions/actions/defaults/setStroke.js +12 -11
  405. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  406. package/dist/interactions/actions/defaults/setStrokeOpacity.js +1 -1
  407. package/dist/interactions/actions/defaults/toolActivate.js +7 -1
  408. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  409. package/dist/interactions/actions/defaults/toolResetToDefault.js +7 -4
  410. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  411. package/dist/interactions/actions/defaults/undoRedo.js +19 -13
  412. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -1
  413. package/dist/interactions/actions/defaults/viewportWheelPan.js +16 -7
  414. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  415. package/dist/interactions/actions/defaults/viewportZoom.js +24 -6
  416. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  417. package/dist/interactions/actions/distribute/action.js +6 -4
  418. package/dist/interactions/actions/distribute/action.js.map +1 -1
  419. package/dist/interactions/actions/drawnBoxes.js +2 -1
  420. package/dist/interactions/actions/drawnBoxes.js.map +1 -1
  421. package/dist/interactions/actions/edit-anchors/action.js +10 -10
  422. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  423. package/dist/interactions/actions/edit-anchors/preview.js +41 -8
  424. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
  425. package/dist/interactions/actions/flip/action.js +14 -6
  426. package/dist/interactions/actions/flip/action.js.map +1 -1
  427. package/dist/interactions/actions/gestureLifecycle.js +5 -2
  428. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  429. package/dist/interactions/actions/insert/action.js +1 -2
  430. package/dist/interactions/actions/insert/action.js.map +1 -1
  431. package/dist/interactions/actions/insert/commit.js +1 -1
  432. package/dist/interactions/actions/insert/parent.js +11 -0
  433. package/dist/interactions/actions/insert/parent.js.map +1 -0
  434. package/dist/interactions/actions/insert/placeAction.js +7 -2
  435. package/dist/interactions/actions/insert/placeAction.js.map +1 -1
  436. package/dist/interactions/actions/insert/repositionAction.js +2 -1
  437. package/dist/interactions/actions/insert/repositionAction.js.map +1 -1
  438. package/dist/interactions/actions/insert/session.js +5 -1
  439. package/dist/interactions/actions/insert/session.js.map +1 -1
  440. package/dist/interactions/actions/move/action.js +15 -8
  441. package/dist/interactions/actions/move/action.js.map +1 -1
  442. package/dist/interactions/actions/move/behaviors/layoutDrop.js +0 -1
  443. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
  444. package/dist/interactions/actions/move/behaviors/snapToContainer.js +1 -1
  445. package/dist/interactions/actions/move/capture.js +1 -1
  446. package/dist/interactions/actions/move/commit/index.js +0 -2
  447. package/dist/interactions/actions/move/commit/index.js.map +1 -1
  448. package/dist/interactions/actions/move/commit/layoutDrop.js +2 -2
  449. package/dist/interactions/actions/move/commit/layoutRelease.js +2 -2
  450. package/dist/interactions/actions/move/commit/reparent.js +11 -5
  451. package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
  452. package/dist/interactions/actions/move/frame.js +4 -10
  453. package/dist/interactions/actions/move/frame.js.map +1 -1
  454. package/dist/interactions/actions/move/landedDescendants.js +20 -17
  455. package/dist/interactions/actions/move/landedDescendants.js.map +1 -1
  456. package/dist/interactions/actions/move/layout/container.js +2 -1
  457. package/dist/interactions/actions/move/layout/container.js.map +1 -1
  458. package/dist/interactions/actions/move/layout/dragged.js +1 -1
  459. package/dist/interactions/actions/move/layout/dropPass.js +18 -1
  460. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
  461. package/dist/interactions/actions/move/layout/exits.js +5 -5
  462. package/dist/interactions/actions/move/layout/exits.js.map +1 -1
  463. package/dist/interactions/actions/move/session.js +14 -3
  464. package/dist/interactions/actions/move/session.js.map +1 -1
  465. package/dist/interactions/actions/move/translate.js +8 -37
  466. package/dist/interactions/actions/move/translate.js.map +1 -1
  467. package/dist/interactions/actions/moveNodes.js +87 -0
  468. package/dist/interactions/actions/moveNodes.js.map +1 -0
  469. package/dist/interactions/actions/outlines/createOutlinesAction.js +8 -5
  470. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -1
  471. package/dist/interactions/actions/outlines/outlineStroke.js +5 -3
  472. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -1
  473. package/dist/interactions/actions/pathCommands/cutJoin.js +8 -5
  474. package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -1
  475. package/dist/interactions/actions/planeInput.js.map +1 -1
  476. package/dist/interactions/actions/resize/action.js +83 -72
  477. package/dist/interactions/actions/resize/action.js.map +1 -1
  478. package/dist/interactions/actions/resize/commit.js +2 -1
  479. package/dist/interactions/actions/resize/commit.js.map +1 -1
  480. package/dist/interactions/actions/resize/cornerHandles.js +2 -1
  481. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -1
  482. package/dist/interactions/actions/resize/session.js +2 -0
  483. package/dist/interactions/actions/resize/session.js.map +1 -1
  484. package/dist/interactions/actions/resolvePreviews.js +3 -3
  485. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  486. package/dist/interactions/actions/rotate/action.js +7 -4
  487. package/dist/interactions/actions/rotate/action.js.map +1 -1
  488. package/dist/interactions/actions/rotate/commit.js +2 -1
  489. package/dist/interactions/actions/rotate/commit.js.map +1 -1
  490. package/dist/interactions/actions/rotate/session.js +2 -0
  491. package/dist/interactions/actions/rotate/session.js.map +1 -1
  492. package/dist/interactions/actions/selectionSubtree.js +25 -9
  493. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  494. package/dist/interactions/actions/testUtils.js.map +1 -1
  495. package/dist/interactions/actions/transform-again/action.js +13 -11
  496. package/dist/interactions/actions/transform-again/action.js.map +1 -1
  497. package/dist/interactions/actions/transformFinish.js +106 -0
  498. package/dist/interactions/actions/transformFinish.js.map +1 -0
  499. package/dist/json.d.ts +4 -0
  500. package/dist/json.js +3 -0
  501. package/dist/kitSettingsSchema.js +8 -5
  502. package/dist/kitSettingsSchema.js.map +1 -1
  503. package/dist/{math-CrJULaZI.d.ts → math-B56zxVs5.d.ts} +10 -1
  504. package/dist/math.d.ts +1 -1
  505. package/dist/math.js +2 -1
  506. package/dist/move.d.ts +5 -4
  507. package/dist/{options-p9GZMXbY.d.ts → options-DBxEryYq.d.ts} +1 -1
  508. package/dist/resize.d.ts +4 -3
  509. package/dist/routing.d.ts +1 -1
  510. package/dist/routing.js +2 -2
  511. package/dist/test-hook/createTestHook.js +1 -1
  512. package/dist/test-hook/createTestHook.js.map +1 -1
  513. package/dist/test-hook/useTestHook.js +2 -1
  514. package/dist/test-hook/useTestHook.js.map +1 -1
  515. package/dist/test-seams.d.ts +9 -5
  516. package/dist/tools/builtin/ellipse/useEllipseTool.js +1 -0
  517. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  518. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +2 -1
  519. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  520. package/dist/tools/builtin/hand/dragPanContribution.js +4 -1
  521. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -1
  522. package/dist/tools/builtin/hand/useHandTool.js +7 -4
  523. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  524. package/dist/tools/builtin/image/useImageTool.js +1 -0
  525. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  526. package/dist/tools/builtin/lasso/useLassoTool.js +1 -0
  527. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  528. package/dist/tools/builtin/line/useLineTool.js +1 -0
  529. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  530. package/dist/tools/builtin/measure/useMeasureTool.js +12 -5
  531. package/dist/tools/builtin/measure/useMeasureTool.js.map +1 -1
  532. package/dist/tools/builtin/pen/penHandle.js +3 -5
  533. package/dist/tools/builtin/pen/penHandle.js.map +1 -1
  534. package/dist/tools/builtin/pen/usePenTool.js +14 -6
  535. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  536. package/dist/tools/builtin/pencil/usePencilTool.js +1 -0
  537. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  538. package/dist/tools/builtin/polygon/usePolygonTool.js +13 -4
  539. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  540. package/dist/tools/builtin/rect/useRectTool.js +1 -0
  541. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  542. package/dist/tools/builtin/select/adapterPointQuery.js +3 -2
  543. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -1
  544. package/dist/tools/builtin/select/pressDecision.js +32 -0
  545. package/dist/tools/builtin/select/pressDecision.js.map +1 -0
  546. package/dist/tools/builtin/select/selectionContributions.js +22 -13
  547. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  548. package/dist/tools/builtin/select/useSelectTool.js +13 -10
  549. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  550. package/dist/tools/builtin/slice/useSliceTool.js +22 -8
  551. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  552. package/dist/tools/builtin/star/useStarTool.js +13 -4
  553. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  554. package/dist/tools/builtin/sticky/stickyNode.js +4 -1
  555. package/dist/tools/builtin/sticky/stickyNode.js.map +1 -1
  556. package/dist/tools/builtin/sticky/useStickyTool.js +10 -5
  557. package/dist/tools/builtin/sticky/useStickyTool.js.map +1 -1
  558. package/dist/tools/builtin/text/useTextTool.js +3 -1
  559. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  560. package/dist/tools/index.js +26 -0
  561. package/dist/{types-CHVXGfYm.d.ts → types-7puAuVD2.d.ts} +3 -262
  562. package/dist/types-BN9hbdMI.d.ts +184 -0
  563. package/dist/types-CniVctmk.d.ts +949 -0
  564. package/dist/types-oFeQ5VjV.d.ts +264 -0
  565. package/dist/util/paint.js +1 -3
  566. package/dist/util/paint.js.map +1 -1
  567. package/dist/version.js +1 -1
  568. package/package.json +39 -25
  569. package/dist/canvas/SceneCanvas/useBuiltinRigTools.js +0 -65
  570. package/dist/canvas/SceneCanvas/useBuiltinRigTools.js.map +0 -1
  571. package/dist/tools/builtin/bone/boneActions.js +0 -156
  572. package/dist/tools/builtin/bone/boneActions.js.map +0 -1
  573. package/dist/tools/builtin/bone/boneOverlay.js +0 -71
  574. package/dist/tools/builtin/bone/boneOverlay.js.map +0 -1
  575. package/dist/tools/builtin/bone/placedRig.js +0 -28
  576. package/dist/tools/builtin/bone/placedRig.js.map +0 -1
  577. package/dist/tools/builtin/bone/rigEditState.js +0 -30
  578. package/dist/tools/builtin/bone/rigEditState.js.map +0 -1
  579. package/dist/tools/builtin/bone/useBoneTool.js +0 -125
  580. package/dist/tools/builtin/bone/useBoneTool.js.map +0 -1
  581. package/dist/tools/builtin/weight/useWeightTool.js +0 -101
  582. package/dist/tools/builtin/weight/useWeightTool.js.map +0 -1
  583. package/dist/tools/builtin/weight/weightActions.js +0 -140
  584. package/dist/tools/builtin/weight/weightActions.js.map +0 -1
  585. package/dist/tools/builtin/weight/weightOverlay.js +0 -78
  586. package/dist/tools/builtin/weight/weightOverlay.js.map +0 -1
@@ -0,0 +1,264 @@
1
+ import { L as LayoutStrategy, P as ParallaxOpts } from './types-7puAuVD2.js';
2
+ import { Op } from '@weasel-js/history';
3
+ import { View } from '@weasel-js/geom';
4
+ import { P as PoseDescriptor } from './poseDescriptor-DN2yfnq_.js';
5
+ import { Target } from '@weasel-js/animator';
6
+
7
+ /**
8
+ * Opaque clipboard payload: the kit never inspects entries. The adapter both
9
+ * produces snapshots (`snapshotSelection`) and consumes them (`commitPaste`).
10
+ */
11
+ interface ClipboardSnapshot {
12
+ items: unknown[];
13
+ }
14
+ /**
15
+ * A copied node a paste did not make, and why:
16
+ *
17
+ * - `dependency-not-copied` — it derives from the nodes in `missing`, which
18
+ * were not copied with it.
19
+ * - `derivation-not-registered` — it derives from other nodes through a
20
+ * function that did not survive the clipboard and is not in the scene's
21
+ * registry.
22
+ * - `container-not-pasted` — its container was left out.
23
+ */
24
+ interface PasteOmission {
25
+ /** The id the node had when it was copied. */
26
+ id: string;
27
+ reason: 'dependency-not-copied' | 'derivation-not-registered' | 'container-not-pasted';
28
+ missing?: string[];
29
+ }
30
+ /** What `commitPaste` is told beyond the snapshot and the offset. */
31
+ interface PasteCtx {
32
+ dropPoint?: {
33
+ worldX: number;
34
+ worldY: number;
35
+ };
36
+ /** Called once per copied node the paste leaves out. */
37
+ onOmit?: (omission: PasteOmission) => void;
38
+ }
39
+ /**
40
+ * Where a dragged node would re-parent to if released. `slotPose` is the pose
41
+ * (in world coordinates) the node should snap to within the target;
42
+ * `metadata` is an opaque pass-through for app-specific snap details.
43
+ */
44
+ interface SnapTarget<TPose = unknown> {
45
+ parentId: string;
46
+ slotPose: TPose;
47
+ metadata?: unknown;
48
+ }
49
+ /**
50
+ * The contracts below are slices: each names what one reader asks of an
51
+ * adapter. The whole of it, as the kit builds it over a `Scene`, is
52
+ * `SceneCanvasAdapter` (`sceneToAdapter`).
53
+ *
54
+ * **Pose semantics:** `getPose` / `setPose` work in **local** coordinates —
55
+ * relative to the node's direct parent (or world, for root-parented nodes).
56
+ * `getWorldPose`, where an adapter has it, is the composed reading.
57
+ *
58
+ * **Every adapter carries the tree:** `getNode`, `getParent`, and
59
+ * `getChildren`. A list with no nesting is a tree whose nodes are all roots:
60
+ * `getParent` answers `null` and `getChildren(null)` answers every id,
61
+ * bottom first.
62
+ */
63
+ /** Narrow adapter for move. Apps without container-snapping leave out `findSnapTarget`. */
64
+ interface MoveAdapter<TNode extends {
65
+ id: string;
66
+ }, TPose> {
67
+ getNode(id: string): TNode | undefined;
68
+ getNodes(): TNode[];
69
+ getPose(id: string): TPose;
70
+ /** The node's container, `null` for a root. */
71
+ getParent(id: string): string | null;
72
+ /** Optional paint depth, read by `pickTopMostHit` to resolve two *siblings*
73
+ * whose bodies both cover the pointer. Without it the hit list's own order
74
+ * decides, which is right for a back-to-front walk and wrong for anything
75
+ * else. See `PickTopMostHitAdapter` for the `compareZ` alternative. */
76
+ getZIndex?(id: string): number | null | undefined;
77
+ compareZ?(a: string, b: string): number;
78
+ setPose(id: string, pose: TPose): void;
79
+ /** Optional. Used only by reparent ops; an adapter that never reparents may omit. */
80
+ setParent?(id: string, parentId: string | null): void;
81
+ /** Optional. The commit point of a gesture. When omitted, ops are applied
82
+ * against the adapter one by one; an adapter with a history of its own
83
+ * takes them here as one entry. */
84
+ applyOps?(ops: Op[], label: string): void;
85
+ /** Optional. Show each node at its pose without writing the document, so
86
+ * nothing is recorded; `null` withdraws a node's preview. What a behavior
87
+ * that keeps moving nodes after the gesture ends writes each frame. */
88
+ previewPoses?(poses: ReadonlyMap<string, TPose | null>): void;
89
+ /** Optional. The animation target of node `id`'s pose, the same one on
90
+ * every call, so everything animating the node adds; `descriptor` supplies
91
+ * its axes the first time. `tweenPose`, `springPose`, and `momentum` move
92
+ * it where it is there, and write `setPose` each frame where it is not or
93
+ * it answers `undefined`. */
94
+ poseTarget?(id: string, descriptor?: PoseDescriptor<TPose>): Target<TPose> | undefined;
95
+ findSnapTarget?(draggedId: string, worldX: number, worldY: number): SnapTarget<TPose> | null;
96
+ /** Ordered children of `parentId`, `null` for the root siblings, in
97
+ * z-order: index 0 is the bottom. One contract with
98
+ * {@link OrderedAdapter.getChildren} — the two land on the same adapter
99
+ * object. Picking walks it, and the ops read a node's sibling slot from it.
100
+ * A node with no children answers `[]`. */
101
+ getChildren(parentId: string | null): string[];
102
+ /** Optional: layout strategy attached to a container, or null if the
103
+ * container uses absolute positioning. When present, a move uses it to
104
+ * compute drop targets, sibling reflow, and the commit op batch. */
105
+ getLayout?(containerId: string): LayoutStrategy<TPose> | null;
106
+ }
107
+ /** Narrow adapter for resize. */
108
+ interface ResizeAdapter<TNode extends {
109
+ id: string;
110
+ }, TPose> {
111
+ getNode(id: string): TNode | undefined;
112
+ getPose(id: string): TPose;
113
+ setPose(id: string, pose: TPose): void;
114
+ /** Optional: see MoveAdapter.applyOps. */
115
+ applyOps?(ops: Op[], label: string): void;
116
+ }
117
+ /** Narrow adapter for rotate, which mutates pose only and never reparents. */
118
+ interface RotateAdapter<TNode extends {
119
+ id: string;
120
+ }, TPose> {
121
+ getNode(id: string): TNode | undefined;
122
+ getPose(id: string): TPose;
123
+ setPose(id: string, pose: TPose): void;
124
+ /** Optional: see MoveAdapter.applyOps. */
125
+ applyOps?(ops: Op[], label: string): void;
126
+ }
127
+ /** The view a region pick answers for. */
128
+ interface RegionPickView {
129
+ /** The camera the region was drawn under. With it, a node on a parallax
130
+ * layer is tested where that camera's plane paints it. */
131
+ get?(): View;
132
+ /** Whether that view paints a layer at all. */
133
+ layerIsPainted?(layer: string): boolean;
134
+ }
135
+ /**
136
+ * Narrow adapter for marquee selection. Transient: no checkpoint, no
137
+ * history — `applyOps(ops)` is called with no label.
138
+ *
139
+ * All fields are **optional**. `useSelectTool` only wires the default marquee
140
+ * behavior when `hitTestArea`, `getSelection`, `setSelection`, and `applyOps`
141
+ * are all present on the adapter; otherwise empty-space drags do nothing.
142
+ */
143
+ interface AreaSelectAdapter {
144
+ /** Returns ids of nodes intersecting the world-space rect, as the view the
145
+ * rect was drawn in paints them. */
146
+ hitTestArea?(rect: {
147
+ x: number;
148
+ y: number;
149
+ width: number;
150
+ height: number;
151
+ }, view?: RegionPickView): string[];
152
+ /** Current selection — read by behaviors to compute additive merges. */
153
+ getSelection?(): string[];
154
+ /** Mutator wired by `setSelection` op. */
155
+ setSelection?(ids: string[]): void;
156
+ /** Apply ops without checkpointing or pushing a history entry. The optional
157
+ * `label` parameter is accepted (and ignored by transient implementations)
158
+ * so that this signature is compatible with `MoveAdapter.applyOps`. */
159
+ applyOps?(ops: Op[], label?: string): void;
160
+ }
161
+ /**
162
+ * Hit mode for `LassoSelectAdapter.hitTestLasso`:
163
+ * - 'centers' — the center of the node's visual bounds is inside the polygon.
164
+ * - 'intersect' — the node's outline meets the polygon anywhere.
165
+ * - 'enclosed' — the node's whole outline is inside the polygon.
166
+ *
167
+ * The outline is the drawn silhouette, rotation included.
168
+ */
169
+ type LassoHitMode = 'centers' | 'intersect' | 'enclosed';
170
+ /**
171
+ * Narrow adapter for lasso selection: `AreaSelectAdapter` plus a polygon
172
+ * hit-test. `selectFromLasso` does nothing without `hitTestLasso`.
173
+ */
174
+ interface LassoSelectAdapter extends AreaSelectAdapter {
175
+ /** Hit-test against a closed polygon. Vertex order may be CW or CCW; the
176
+ * closing edge from last → first is implicit. */
177
+ hitTestLasso?(polygon: ReadonlyArray<{
178
+ x: number;
179
+ y: number;
180
+ }>, mode: LassoHitMode, view?: RegionPickView): string[];
181
+ }
182
+ /**
183
+ * Narrow adapter for insert and `useClipboardOps`. The kit knows nothing
184
+ * about what shape to construct; it asks the adapter to produce node(s) given
185
+ * gesture or paste inputs, and wraps each in an `InsertOp`.
186
+ */
187
+ interface InsertAdapter<TNode extends {
188
+ id: string;
189
+ }> {
190
+ getNode(id: string): TNode | undefined;
191
+ getParent(id: string): string | null;
192
+ /** Ordered children of `parentId`, `null` for the root siblings. An insert
193
+ * resolves its sibling slot against it. */
194
+ getChildren(parentId: string | null): string[];
195
+ /** Materialize a new node from drag-rect bounds (drag-to-insert tools).
196
+ * Optional: `sceneToAdapter` only fills it in when `options.commitInsert`
197
+ * is supplied. */
198
+ commitInsert?(bounds: {
199
+ x: number;
200
+ y: number;
201
+ width: number;
202
+ height: number;
203
+ }): TNode | null;
204
+ /** Materialize the new nodes from a clipboard snapshot, in order.
205
+ * Optional — required only for paste. */
206
+ commitPaste?(clipboard: ClipboardSnapshot, offset: {
207
+ dx: number;
208
+ dy: number;
209
+ }, ctx?: PasteCtx): TNode[];
210
+ /** Snapshot the current selection into the clipboard payload shape.
211
+ * Optional — required only for copy, cut, and clone's ghost capture. */
212
+ snapshotSelection?(ids: string[]): ClipboardSnapshot;
213
+ getPasteOffset?(clipboard: ClipboardSnapshot): {
214
+ dx: number;
215
+ dy: number;
216
+ };
217
+ /** Mutator wired by `insertNode`-using ops (kit-side InsertOp). `index` is
218
+ * the node's z-position among its siblings. `createDeleteOp` captures it
219
+ * and `invert()` forwards it, so an implementation that drops it makes
220
+ * undo of a delete restore the node at the top instead of where it was.
221
+ * Omit only for an unordered store. */
222
+ insertNode(node: TNode, index?: number): void;
223
+ /** Mutator wired by `setSelection` ops batched alongside paste. */
224
+ setSelection(ids: string[]): void;
225
+ /** Optional: see MoveAdapter.applyOps. */
226
+ applyOps?(ops: Op[], label: string): void;
227
+ /** Returns the current selection. Used by clone behaviors. */
228
+ getSelection(): string[];
229
+ }
230
+ /**
231
+ * The layer list of an adapter whose nodes sit on layers. The scene slot
232
+ * paints one canvas layer per entry; a pick over a bare adapter reads it for
233
+ * parallax planes where it is there.
234
+ */
235
+ interface LayerEnumerableAdapter<TLayer extends string = string> {
236
+ getLayers?(): readonly {
237
+ id: TLayer;
238
+ visible: boolean;
239
+ parallax?: ParallaxOpts;
240
+ }[];
241
+ /** Call `listener` whenever the list `getLayers` answers may have changed.
242
+ * A canvas reads the list at mount and again on each call, so an adapter
243
+ * whose list never changes leaves this out. */
244
+ subscribeLayers?(listener: () => void): () => void;
245
+ }
246
+ /**
247
+ * Sibling z-order: what the reorder ops read and write.
248
+ *
249
+ * **Convention:** array order IS z-order. Index 0 is the bottom of the
250
+ * stack, the last index is the top. Hit-testing should iterate the returned
251
+ * list in REVERSE (top to bottom). Render layers iterate FORWARD (bottom to
252
+ * top).
253
+ */
254
+ interface OrderedAdapter {
255
+ /** Ordered children of `parentId` (or root siblings if null), in z-order:
256
+ * index 0 is bottom, last index is top. The same contract
257
+ * {@link MoveAdapter.getChildren} declares — one method, two readers. */
258
+ getChildren(parentId: string | null): string[];
259
+ /** Rewrite the order of `parentId`'s children. Length and contents must
260
+ * match the existing children — reorder only, no add/remove. */
261
+ setChildOrder(parentId: string | null, ids: string[]): void;
262
+ }
263
+
264
+ export type { AreaSelectAdapter as A, ClipboardSnapshot as C, InsertAdapter as I, LayerEnumerableAdapter as L, MoveAdapter as M, OrderedAdapter as O, PasteOmission as P, RegionPickView as R, SnapTarget as S, LassoHitMode as a, ResizeAdapter as b, RotateAdapter as c, LassoSelectAdapter as d, PasteCtx as e };
@@ -86,8 +86,6 @@ function strokeWith(paint, width = 1) {
86
86
  width
87
87
  };
88
88
  }
89
- /** The kit's default node fill — what a shape with no declared fill paints. */
90
- var DEFAULT_SHAPE_FILL = { paint: { color: "#888" } };
91
89
  /**
92
90
  * The 0..1 alpha a paint paints at.
93
91
  *
@@ -123,5 +121,5 @@ function paintWithColor(paint, color) {
123
121
  }
124
122
 
125
123
  //#endregion
126
- export { DEFAULT_FILL_COLOR, DEFAULT_PALETTE, DEFAULT_SHAPE_FILL, DEFAULT_STROKE_COLOR, GHOST_STROKE, cycleFill, paintAlpha, paintWithAlpha, paintWithColor, solid, strokeOf, strokeWith };
124
+ export { DEFAULT_FILL_COLOR, DEFAULT_PALETTE, DEFAULT_STROKE_COLOR, GHOST_STROKE, cycleFill, paintAlpha, paintWithAlpha, paintWithColor, solid, strokeOf, strokeWith };
127
125
  //# sourceMappingURL=paint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"paint.js","names":[],"sources":["../../src/util/paint.ts"],"sourcesContent":["/** Kit-shipped default paint constants.\n *\n * Single source of truth for the colors the built-in tools and the default\n * fill/stroke actions reach for. Consumers that want to match the kit's\n * out-of-the-box look (e.g. seed their own active-paint state) should import\n * these rather than re-declaring the literals.\n *\n * All values are `#rrggbbaa` so they round-trip through the kit's hex8 alpha\n * helpers (`util/color`) without ambiguity.\n */\nimport {\n colorLiteralToHex,\n hexToColorLiteral,\n resolvePaletteColor,\n type ColorLiteral,\n type CommandStroke,\n type Fill,\n type Paint,\n type Palette,\n type SolidPaint,\n type Stroke,\n} from '@weasel-js/paint';\nimport { getAlpha01 } from './color';\n\n/** Default fill paint for shapes and the fill action — opaque white. */\nexport const DEFAULT_FILL_COLOR = '#ffffffff';\n\n/** Default stroke paint for shapes and the stroke action — opaque black. */\nexport const DEFAULT_STROKE_COLOR = '#000000ff';\n\nconst srgb = (hex: string): ColorLiteral => hexToColorLiteral(hex) as ColorLiteral;\n\n/** Default fill palette cycled through for auto-generated shape nodes\n * (the kit's built-in shape tools and the `insert` action). */\nexport const DEFAULT_PALETTE: Palette = {\n entries: [\n { name: 'sage', color: srgb('#7fb069') },\n { name: 'tan', color: srgb('#d4a574') },\n { name: 'lavender', color: srgb('#a48bd4') },\n { name: 'sky', color: srgb('#7ab8d4') },\n { name: 'rose', color: srgb('#d47a7a') },\n ],\n};\n\n/** The `seq`th color of `palette`'s entries as hex, wrapping past the end.\n * An entry that resolves to nothing, or to a space with no hex form, gives\n * `fallback`. */\nexport function cycleFill(seq: number, palette: Palette = DEFAULT_PALETTE, fallback = DEFAULT_FILL_COLOR): string {\n const { entries } = palette;\n const entry = entries[((seq % entries.length) + entries.length) % entries.length];\n const color = entry && resolvePaletteColor(palette, { ref: entry.name });\n return (color && colorLiteralToHex(color)) ?? fallback;\n}\n\n/** Preview / \"ghost\" stroke color used by drag-to-draw tool overlays and the\n * selected-anchor highlight. Derived from the first palette entry so the\n * preview chrome matches the default insert color. */\nexport const GHOST_STROKE: string = cycleFill(0);\n\n/**\n * A solid paint from a color string — the authoring shorthand for the one\n * shape a `Fill.paint` or a `Stroke.paint` may take.\n *\n * An alpha channel in `color` moves to `opacity`, because that is where every\n * paint kind carries its alpha; leaving it in the hex too would multiply the\n * two in the renderer.\n */\nexport function solid(color: string): SolidPaint {\n const a = getAlpha01(color);\n const rgb = color.length === 9 && color.startsWith('#') ? color.slice(0, 7) : color;\n return a === 1 ? { color: rgb } : { color: rgb, opacity: a };\n}\n\n/** A solid stroke of `color` at `width` world units. Authoring shorthand for\n * `{ paint: solid(color), width }`. */\nexport function strokeOf(color: string, width = 1): CommandStroke & { paint: SolidPaint } {\n return { paint: solid(color), width };\n}\n\n/** A stroke painted with `paint` at `width` world units — `strokeOf`'s sibling\n * for a gradient or pattern, which has no color to pass. */\nexport function strokeWith(paint: Paint, width = 1): Stroke {\n return { paint, width };\n}\n\n/** The kit's default node fill — what a shape with no declared fill paints. */\nexport const DEFAULT_SHAPE_FILL: Fill & { paint: Paint } = { paint: { color: '#888' } };\n\n/**\n * The 0..1 alpha a paint paints at.\n *\n * Every paint kind carries its alpha in `opacity` — that is the one slot a\n * gradient or a pattern has, so it is the slot all of them use.\n */\nexport function paintAlpha(paint: Paint | undefined): number {\n return paint?.opacity ?? 1;\n}\n\n/** `paint` painting at `alpha01` (clamped to 0..1). */\nexport function paintWithAlpha(paint: Paint, alpha01: number): Paint {\n return { ...paint, opacity: Math.max(0, Math.min(1, alpha01)) };\n}\n\n/**\n * `paint` recolored to `color`, keeping everything else about it.\n *\n * A solid paint takes the new color; a gradient or a pattern has no single\n * color to replace, so it is superseded by a solid one — picking a color off\n * a swatch means \"paint this color\". An alpha channel in `color` wins;\n * without one, the paint's existing opacity carries over.\n */\nexport function paintWithColor(paint: Paint | undefined, color: string): Paint {\n const next = solid(color);\n const explicitAlpha = color.length === 9 && color.startsWith('#');\n if (explicitAlpha || paint === undefined) return next;\n const alpha = paintAlpha(paint);\n return alpha === 1 ? next : { ...next, opacity: alpha };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAyBA,IAAa,qBAAqB;;AAGlC,IAAa,uBAAuB;AAEpC,IAAM,QAAQ,QAA8B,kBAAkB,GAAG;;;AAIjE,IAAa,kBAA2B,EACtC,SAAS;CACP;EAAE,MAAM;EAAQ,OAAO,KAAK,SAAS;CAAE;CACvC;EAAE,MAAM;EAAO,OAAO,KAAK,SAAS;CAAE;CACtC;EAAE,MAAM;EAAY,OAAO,KAAK,SAAS;CAAE;CAC3C;EAAE,MAAM;EAAO,OAAO,KAAK,SAAS;CAAE;CACtC;EAAE,MAAM;EAAQ,OAAO,KAAK,SAAS;CAAE;AACzC,EACF;;;;AAKA,SAAgB,UAAU,KAAa,UAAmB,iBAAiB,WAAW,oBAA4B;CAChH,MAAM,EAAE,YAAY;CACpB,MAAM,QAAQ,SAAU,MAAM,QAAQ,SAAU,QAAQ,UAAU,QAAQ;CAC1E,MAAM,QAAQ,SAAS,oBAAoB,SAAS,EAAE,KAAK,MAAM,KAAK,CAAC;CACvE,QAAQ,SAAS,kBAAkB,KAAK,MAAM;AAChD;;;;AAKA,IAAa,eAAuB,UAAU,CAAC;;;;;;;;;AAU/C,SAAgB,MAAM,OAA2B;CAC/C,MAAM,IAAI,WAAW,KAAK;CAC1B,MAAM,MAAM,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI;CAC9E,OAAO,MAAM,IAAI,EAAE,OAAO,IAAI,IAAI;EAAE,OAAO;EAAK,SAAS;CAAE;AAC7D;;;AAIA,SAAgB,SAAS,OAAe,QAAQ,GAA0C;CACxF,OAAO;EAAE,OAAO,MAAM,KAAK;EAAG;CAAM;AACtC;;;AAIA,SAAgB,WAAW,OAAc,QAAQ,GAAW;CAC1D,OAAO;EAAE;EAAO;CAAM;AACxB;;AAGA,IAAa,qBAA8C,EAAE,OAAO,EAAE,OAAO,OAAO,EAAE;;;;;;;AAQtF,SAAgB,WAAW,OAAkC;CAC3D,OAAO,OAAO,WAAW;AAC3B;;AAGA,SAAgB,eAAe,OAAc,SAAwB;CACnE,OAAO;EAAE,GAAG;EAAO,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;CAAE;AAChE;;;;;;;;;AAUA,SAAgB,eAAe,OAA0B,OAAsB;CAC7E,MAAM,OAAO,MAAM,KAAK;CAExB,IADsB,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG,KAC3C,UAAU,QAAW,OAAO;CACjD,MAAM,QAAQ,WAAW,KAAK;CAC9B,OAAO,UAAU,IAAI,OAAO;EAAE,GAAG;EAAM,SAAS;CAAM;AACxD"}
1
+ {"version":3,"file":"paint.js","names":[],"sources":["../../src/util/paint.ts"],"sourcesContent":["/** Kit-shipped default paint constants.\n *\n * Single source of truth for the colors the built-in tools and the default\n * fill/stroke actions reach for. Consumers that want to match the kit's\n * out-of-the-box look (e.g. seed their own active-paint state) should import\n * these rather than re-declaring the literals.\n *\n * All values are `#rrggbbaa` so they round-trip through the kit's hex8 alpha\n * helpers (`util/color`) without ambiguity.\n */\nimport {\n colorLiteralToHex,\n hexToColorLiteral,\n resolvePaletteColor,\n type ColorLiteral,\n type CommandStroke,\n type Paint,\n type Palette,\n type SolidPaint,\n type Stroke,\n} from '@weasel-js/paint';\nimport { getAlpha01 } from './color';\n\n/** Default fill paint for shapes and the fill action — opaque white. */\nexport const DEFAULT_FILL_COLOR = '#ffffffff';\n\n/** Default stroke paint for shapes and the stroke action — opaque black. */\nexport const DEFAULT_STROKE_COLOR = '#000000ff';\n\nconst srgb = (hex: string): ColorLiteral => hexToColorLiteral(hex) as ColorLiteral;\n\n/** Default fill palette cycled through for auto-generated shape nodes\n * (the kit's built-in shape tools and the `insert` action). */\nexport const DEFAULT_PALETTE: Palette = {\n entries: [\n { name: 'sage', color: srgb('#7fb069') },\n { name: 'tan', color: srgb('#d4a574') },\n { name: 'lavender', color: srgb('#a48bd4') },\n { name: 'sky', color: srgb('#7ab8d4') },\n { name: 'rose', color: srgb('#d47a7a') },\n ],\n};\n\n/** The `seq`th color of `palette`'s entries as hex, wrapping past the end.\n * An entry that resolves to nothing, or to a space with no hex form, gives\n * `fallback`. */\nexport function cycleFill(seq: number, palette: Palette = DEFAULT_PALETTE, fallback = DEFAULT_FILL_COLOR): string {\n const { entries } = palette;\n const entry = entries[((seq % entries.length) + entries.length) % entries.length];\n const color = entry && resolvePaletteColor(palette, { ref: entry.name });\n return (color && colorLiteralToHex(color)) ?? fallback;\n}\n\n/** Preview / \"ghost\" stroke color used by drag-to-draw tool overlays and the\n * selected-anchor highlight. Derived from the first palette entry so the\n * preview chrome matches the default insert color. */\nexport const GHOST_STROKE: string = cycleFill(0);\n\n/**\n * A solid paint from a color string — the authoring shorthand for the one\n * shape a `Fill.paint` or a `Stroke.paint` may take.\n *\n * An alpha channel in `color` moves to `opacity`, because that is where every\n * paint kind carries its alpha; leaving it in the hex too would multiply the\n * two in the renderer.\n */\nexport function solid(color: string): SolidPaint {\n const a = getAlpha01(color);\n const rgb = color.length === 9 && color.startsWith('#') ? color.slice(0, 7) : color;\n return a === 1 ? { color: rgb } : { color: rgb, opacity: a };\n}\n\n/** A solid stroke of `color` at `width` world units. Authoring shorthand for\n * `{ paint: solid(color), width }`. */\nexport function strokeOf(color: string, width = 1): CommandStroke & { paint: SolidPaint } {\n return { paint: solid(color), width };\n}\n\n/** A stroke painted with `paint` at `width` world units — `strokeOf`'s sibling\n * for a gradient or pattern, which has no color to pass. */\nexport function strokeWith(paint: Paint, width = 1): Stroke {\n return { paint, width };\n}\n\n/**\n * The 0..1 alpha a paint paints at.\n *\n * Every paint kind carries its alpha in `opacity` — that is the one slot a\n * gradient or a pattern has, so it is the slot all of them use.\n */\nexport function paintAlpha(paint: Paint | undefined): number {\n return paint?.opacity ?? 1;\n}\n\n/** `paint` painting at `alpha01` (clamped to 0..1). */\nexport function paintWithAlpha(paint: Paint, alpha01: number): Paint {\n return { ...paint, opacity: Math.max(0, Math.min(1, alpha01)) };\n}\n\n/**\n * `paint` recolored to `color`, keeping everything else about it.\n *\n * A solid paint takes the new color; a gradient or a pattern has no single\n * color to replace, so it is superseded by a solid one — picking a color off\n * a swatch means \"paint this color\". An alpha channel in `color` wins;\n * without one, the paint's existing opacity carries over.\n */\nexport function paintWithColor(paint: Paint | undefined, color: string): Paint {\n const next = solid(color);\n const explicitAlpha = color.length === 9 && color.startsWith('#');\n if (explicitAlpha || paint === undefined) return next;\n const alpha = paintAlpha(paint);\n return alpha === 1 ? next : { ...next, opacity: alpha };\n}\n"],"mappings":";;;;;;;;;;;;;;;AAwBA,IAAa,qBAAqB;;AAGlC,IAAa,uBAAuB;AAEpC,IAAM,QAAQ,QAA8B,kBAAkB,GAAG;;;AAIjE,IAAa,kBAA2B,EACtC,SAAS;CACP;EAAE,MAAM;EAAQ,OAAO,KAAK,SAAS;CAAE;CACvC;EAAE,MAAM;EAAO,OAAO,KAAK,SAAS;CAAE;CACtC;EAAE,MAAM;EAAY,OAAO,KAAK,SAAS;CAAE;CAC3C;EAAE,MAAM;EAAO,OAAO,KAAK,SAAS;CAAE;CACtC;EAAE,MAAM;EAAQ,OAAO,KAAK,SAAS;CAAE;AACzC,EACF;;;;AAKA,SAAgB,UAAU,KAAa,UAAmB,iBAAiB,WAAW,oBAA4B;CAChH,MAAM,EAAE,YAAY;CACpB,MAAM,QAAQ,SAAU,MAAM,QAAQ,SAAU,QAAQ,UAAU,QAAQ;CAC1E,MAAM,QAAQ,SAAS,oBAAoB,SAAS,EAAE,KAAK,MAAM,KAAK,CAAC;CACvE,QAAQ,SAAS,kBAAkB,KAAK,MAAM;AAChD;;;;AAKA,IAAa,eAAuB,UAAU,CAAC;;;;;;;;;AAU/C,SAAgB,MAAM,OAA2B;CAC/C,MAAM,IAAI,WAAW,KAAK;CAC1B,MAAM,MAAM,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG,IAAI,MAAM,MAAM,GAAG,CAAC,IAAI;CAC9E,OAAO,MAAM,IAAI,EAAE,OAAO,IAAI,IAAI;EAAE,OAAO;EAAK,SAAS;CAAE;AAC7D;;;AAIA,SAAgB,SAAS,OAAe,QAAQ,GAA0C;CACxF,OAAO;EAAE,OAAO,MAAM,KAAK;EAAG;CAAM;AACtC;;;AAIA,SAAgB,WAAW,OAAc,QAAQ,GAAW;CAC1D,OAAO;EAAE;EAAO;CAAM;AACxB;;;;;;;AAQA,SAAgB,WAAW,OAAkC;CAC3D,OAAO,OAAO,WAAW;AAC3B;;AAGA,SAAgB,eAAe,OAAc,SAAwB;CACnE,OAAO;EAAE,GAAG;EAAO,SAAS,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC;CAAE;AAChE;;;;;;;;;AAUA,SAAgB,eAAe,OAA0B,OAAsB;CAC7E,MAAM,OAAO,MAAM,KAAK;CAExB,IADsB,MAAM,WAAW,KAAK,MAAM,WAAW,GAAG,KAC3C,UAAU,QAAW,OAAO;CACjD,MAAM,QAAQ,WAAW,KAAK;CAC9B,OAAO,UAAU,IAAI,OAAO;EAAE,GAAG;EAAM,SAAS;CAAM;AACxD"}
package/dist/version.js CHANGED
@@ -7,7 +7,7 @@
7
7
  * throwing, since nothing about version reporting should be able to break a
8
8
  * consumer's build.
9
9
  */
10
- var VERSION = "1.11.0";
10
+ var VERSION = "1.12.0";
11
11
 
12
12
  //#endregion
13
13
  export { VERSION };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@weasel-js/core",
3
- "version": "1.11.0",
3
+ "version": "1.12.0",
4
4
  "description": "A 2D scene-graph engine for React, rendered on WebGL2: the scene tree, viewport math, pointer and keyboard input, layered rendering, and op-based undo.",
5
5
  "weasel": {
6
6
  "needs": ["webgl2"]
@@ -20,6 +20,8 @@
20
20
  "sideEffects": [
21
21
  "*.css",
22
22
  "./src/import-shims/mesh.ts",
23
+ "./src/import-shims/devtools.ts",
24
+ "./dist/devtools.js",
23
25
  "./src/core/paint/registerMesh.ts",
24
26
  "./dist/mesh.js",
25
27
  "./dist/core/paint/registerMesh.js"
@@ -73,6 +75,18 @@
73
75
  "import": "./dist/clone.js",
74
76
  "types": "./dist/clone.d.ts"
75
77
  },
78
+ "./json": {
79
+ "import": "./dist/json.js",
80
+ "types": "./dist/json.d.ts"
81
+ },
82
+ "./devtools": {
83
+ "import": "./dist/devtools.js",
84
+ "types": "./dist/devtools.d.ts"
85
+ },
86
+ "./devtools-protocol": {
87
+ "import": "./dist/devtools-protocol.js",
88
+ "types": "./dist/devtools-protocol.d.ts"
89
+ },
76
90
  "./patterns-builtin": {
77
91
  "import": "./dist/patterns-builtin.js",
78
92
  "types": "./dist/patterns-builtin.d.ts"
@@ -96,30 +110,30 @@
96
110
  "typecheck": "tsc --noEmit -p tsconfig.json"
97
111
  },
98
112
  "peerDependencies": {
99
- "@weasel-js/font": "1.11.0",
113
+ "@weasel-js/font": "1.12.0",
100
114
  "react": ">=18"
101
115
  },
102
116
  "dependencies": {
103
- "@msb235/blits": "0.10.0",
104
- "@weasel-js/animator": "1.11.0",
105
- "@weasel-js/cursor": "1.11.0",
106
- "@weasel-js/geom": "1.11.0",
107
- "@weasel-js/gestures": "1.11.0",
108
- "@weasel-js/history": "1.11.0",
109
- "@weasel-js/icons": "1.11.0",
110
- "@weasel-js/modes": "1.11.0",
111
- "@weasel-js/paint": "1.11.0",
112
- "@weasel-js/prefs": "1.11.0",
113
- "@weasel-js/quantity": "1.11.0",
114
- "@weasel-js/react": "1.11.0",
115
- "@weasel-js/registry": "1.11.0",
116
- "@weasel-js/renderer": "1.11.0",
117
- "@weasel-js/routing": "1.11.0",
118
- "@weasel-js/select": "1.11.0",
119
- "@weasel-js/simulation": "1.11.0",
120
- "@weasel-js/stroke": "1.11.0",
121
- "@weasel-js/text": "1.11.0",
122
- "@weasel-js/text-dom": "1.11.0",
117
+ "@msb235/blits": "0.11.0",
118
+ "@weasel-js/animator": "1.12.0",
119
+ "@weasel-js/cursor": "1.12.0",
120
+ "@weasel-js/geom": "1.12.0",
121
+ "@weasel-js/gestures": "1.12.0",
122
+ "@weasel-js/history": "1.12.0",
123
+ "@weasel-js/icons": "1.12.0",
124
+ "@weasel-js/modes": "1.12.0",
125
+ "@weasel-js/paint": "1.12.0",
126
+ "@weasel-js/prefs": "1.12.0",
127
+ "@weasel-js/quantity": "1.12.0",
128
+ "@weasel-js/react": "1.12.0",
129
+ "@weasel-js/registry": "1.12.0",
130
+ "@weasel-js/renderer": "1.12.0",
131
+ "@weasel-js/routing": "1.12.0",
132
+ "@weasel-js/select": "1.12.0",
133
+ "@weasel-js/simulation": "1.12.0",
134
+ "@weasel-js/stroke": "1.12.0",
135
+ "@weasel-js/text": "1.12.0",
136
+ "@weasel-js/text-dom": "1.12.0",
123
137
  "earcut": "3.2.3",
124
138
  "polygon-clipping": "^0.15.7"
125
139
  },
@@ -137,8 +151,8 @@
137
151
  "2d"
138
152
  ],
139
153
  "devDependencies": {
140
- "@weasel-js/icons-plugin": "1.11.0",
141
- "@weasel-js/modes": "1.11.0",
142
- "@weasel-js/theme": "1.11.0"
154
+ "@weasel-js/icons-plugin": "1.12.0",
155
+ "@weasel-js/modes": "1.12.0",
156
+ "@weasel-js/theme": "1.12.0"
143
157
  }
144
158
  }
@@ -1,65 +0,0 @@
1
- import { createRigEditState } from "../../tools/builtin/bone/rigEditState.js";
2
- import { useBoneTool } from "../../tools/builtin/bone/useBoneTool.js";
3
- import { useWeightTool } from "../../tools/builtin/weight/useWeightTool.js";
4
- import { useMemo } from "react";
5
- import { useLatest } from "@weasel-js/react";
6
-
7
- //#region src/canvas/SceneCanvas/useBuiltinRigTools.ts
8
- /**
9
- * The bone and weight tools as `<SceneCanvas>` mounts them: on the canvas's
10
- * own scene, sharing one `RigEditState`, and acting on the rig the selection
11
- * names unless `toolOptions.rig` fixes one.
12
- *
13
- * Both hooks always run (React rules of hooks); `resolveToolRegistry` decides
14
- * which the canvas registers.
15
- */
16
- /**
17
- * The rig a selection names: with one node selected, the nearest of it and its
18
- * ancestors whose `data.skeleton` exists, else that node itself, so a first
19
- * bone can be drawn onto it. With none or several selected, `null`.
20
- */
21
- function rigOfSelection(scene, ids) {
22
- if (ids.length !== 1) return null;
23
- const own = ids[0];
24
- for (let id = own; id !== null;) {
25
- const node = scene.get(id);
26
- if (!node) break;
27
- if (node.data?.skeleton) return id;
28
- id = node.parent;
29
- }
30
- return scene.get(own) ? own : null;
31
- }
32
- function useBuiltinRigTools(args) {
33
- const { scene, options } = args;
34
- const latest = useLatest({
35
- scene,
36
- selection: args.selection,
37
- rig: options?.rig?.rig
38
- });
39
- const rig = useMemo(() => () => {
40
- const { scene: s, selection, rig: fixed } = latest.current;
41
- return fixed ? fixed() : rigOfSelection(s, selection());
42
- }, [latest]);
43
- const ownState = useMemo(() => createRigEditState(), []);
44
- const state = options?.rig?.state ?? ownState;
45
- const reach = options?.rig?.reach;
46
- return {
47
- bone: useBoneTool({
48
- scene,
49
- rig,
50
- state,
51
- reach
52
- }),
53
- weight: useWeightTool({
54
- scene,
55
- rig,
56
- state,
57
- reach,
58
- radius: options?.weight?.radius
59
- })
60
- };
61
- }
62
-
63
- //#endregion
64
- export { rigOfSelection, useBuiltinRigTools };
65
- //# sourceMappingURL=useBuiltinRigTools.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useBuiltinRigTools.js","names":[],"sources":["../../../src/canvas/SceneCanvas/useBuiltinRigTools.ts"],"sourcesContent":["/**\n * The bone and weight tools as `<SceneCanvas>` mounts them: on the canvas's\n * own scene, sharing one `RigEditState`, and acting on the rig the selection\n * names unless `toolOptions.rig` fixes one.\n *\n * Both hooks always run (React rules of hooks); `resolveToolRegistry` decides\n * which the canvas registers.\n */\nimport { useMemo } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport type { RigNodeData } from '../../animation/rig/rigNode';\nimport { useBoneTool } from 'tools/builtin/bone/useBoneTool';\nimport { createRigEditState } from 'tools/builtin/bone/rigEditState';\nimport { useWeightTool } from 'tools/builtin/weight/useWeightTool';\nimport type { Tool } from 'tools/overlayBinding';\nimport type { BuiltinToolOptions } from './useBuiltinShapeTools';\n\n/**\n * The rig a selection names: with one node selected, the nearest of it and its\n * ancestors whose `data.skeleton` exists, else that node itself, so a first\n * bone can be drawn onto it. With none or several selected, `null`.\n */\nexport function rigOfSelection(\n scene: { get(id: NodeId): { parent: NodeId | null; data?: unknown } | undefined },\n ids: readonly NodeId[],\n): NodeId | null {\n if (ids.length !== 1) return null;\n const own = ids[0];\n for (let id: NodeId | null = own; id !== null;) {\n const node = scene.get(id);\n if (!node) break;\n if ((node.data as RigNodeData | null | undefined)?.skeleton) return id;\n id = node.parent;\n }\n return scene.get(own) ? own : null;\n}\n\nexport interface UseBuiltinRigToolsArgs {\n scene: Scene<unknown, string, unknown>;\n /** The canvas's selection, read when a tool acts. */\n selection: () => readonly NodeId[];\n options?: BuiltinToolOptions;\n}\n\nexport function useBuiltinRigTools(args: UseBuiltinRigToolsArgs): { bone: Tool; weight: Tool } {\n const { scene, options } = args;\n const latest = useLatest({ scene, selection: args.selection, rig: options?.rig?.rig });\n const rig = useMemo(() => (): NodeId | null => {\n const { scene: s, selection, rig: fixed } = latest.current;\n return fixed ? fixed() : rigOfSelection(s, selection());\n }, [latest]);\n const ownState = useMemo(() => createRigEditState(), []);\n const state = options?.rig?.state ?? ownState;\n const reach = options?.rig?.reach;\n const bone = useBoneTool({ scene, rig, state, reach });\n const weight = useWeightTool({ scene, rig, state, reach, radius: options?.weight?.radius });\n return { bone, weight };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,SAAgB,eACd,OACA,KACe;CACf,IAAI,IAAI,WAAW,GAAG,OAAO;CAC7B,MAAM,MAAM,IAAI;CAChB,KAAK,IAAI,KAAoB,KAAK,OAAO,OAAO;EAC9C,MAAM,OAAO,MAAM,IAAI,EAAE;EACzB,IAAI,CAAC,MAAM;EACX,IAAK,KAAK,MAAyC,UAAU,OAAO;EACpE,KAAK,KAAK;CACZ;CACA,OAAO,MAAM,IAAI,GAAG,IAAI,MAAM;AAChC;AASA,SAAgB,mBAAmB,MAA4D;CAC7F,MAAM,EAAE,OAAO,YAAY;CAC3B,MAAM,SAAS,UAAU;EAAE;EAAO,WAAW,KAAK;EAAW,KAAK,SAAS,KAAK;CAAI,CAAC;CACrF,MAAM,MAAM,oBAAmC;EAC7C,MAAM,EAAE,OAAO,GAAG,WAAW,KAAK,UAAU,OAAO;EACnD,OAAO,QAAQ,MAAM,IAAI,eAAe,GAAG,UAAU,CAAC;CACxD,GAAG,CAAC,MAAM,CAAC;CACX,MAAM,WAAW,cAAc,mBAAmB,GAAG,CAAC,CAAC;CACvD,MAAM,QAAQ,SAAS,KAAK,SAAS;CACrC,MAAM,QAAQ,SAAS,KAAK;CAG5B,OAAO;EAAE,MAFI,YAAY;GAAE;GAAO;GAAK;GAAO;EAAM,CAE3C;EAAM,QADA,cAAc;GAAE;GAAO;GAAK;GAAO;GAAO,QAAQ,SAAS,QAAQ;EAAO,CAC1E;CAAO;AACxB"}
@@ -1,156 +0,0 @@
1
- import { createSetDataOp } from "../../../core/ops/setData.js";
2
- import { defaultCommitAdapter } from "../../../interactions/actions/defaultCommitAdapter.js";
3
- import { unplaceSkeleton } from "../../../animation/rig/rigNode.js";
4
- import { sceneReach } from "./placedRig.js";
5
- import { ActionDisabledReason } from "@weasel-js/routing";
6
- import { addJoint, dropSkinJoints, jointAt, jointPositions, moveJoint, removeJoint } from "@weasel-js/animator";
7
-
8
- //#region src/tools/builtin/bone/boneActions.ts
9
- var eligible = { capability: "edits-page" };
10
- var reachOf = (env, deps) => sceneReach(deps, env.reachPx());
11
- var activeIn = (env, skeleton) => {
12
- const name = env.state.active();
13
- return name !== null && skeleton.joints.some((j) => j.name === name) ? name : null;
14
- };
15
- /** Write `next`, a skeleton in the scene's space, into the rig node, and take `removed`
16
- * joints out of the skins under it, as one undo entry. */
17
- function commitSkeleton(scene, deps, id, next, label, removed = []) {
18
- const node = scene.get(id);
19
- if (!node) return;
20
- const ops = [createSetDataOp({
21
- id,
22
- from: node.data,
23
- to: {
24
- ...node.data,
25
- skeleton: unplaceSkeleton(next, node.pose)
26
- },
27
- label
28
- })];
29
- const strip = (parent) => {
30
- for (const child of scene.childrenOf(parent)) {
31
- const data = scene.get(child)?.data;
32
- const kept = data?.skin && dropSkinJoints(data.skin, removed);
33
- if (kept && kept !== data.skin) ops.push(createSetDataOp({
34
- id: child,
35
- from: data,
36
- to: {
37
- ...data,
38
- skin: kept
39
- },
40
- label
41
- }));
42
- strip(child);
43
- }
44
- };
45
- if (removed.length > 0) strip(id);
46
- if (deps.applyOps) deps.applyOps(ops, label);
47
- else scene.applyBatch(ops, label, defaultCommitAdapter(scene, deps.selection?.adapterMethods));
48
- }
49
- function dragAction(env, editing) {
50
- return {
51
- id: "bone.drag",
52
- label: "Bone — move a joint or draw a bone",
53
- eligible,
54
- requires: [
55
- "view",
56
- "selection",
57
- "applyOps"
58
- ],
59
- enabled: editing,
60
- invoker: {
61
- timing: "ongoing",
62
- start: ({ deps, drag, world }) => {
63
- const at = env.placed();
64
- if (!at) return {};
65
- const press = drag?.start ?? world;
66
- const before = env.state.active();
67
- const hit = jointAt(at.skeleton, press.x, press.y, reachOf(env, deps));
68
- let origin = at.skeleton;
69
- let name = hit;
70
- if (name === null) {
71
- let parent = activeIn(env, origin);
72
- if (parent === null) ({skeleton: origin, name: parent} = addJoint(origin, null, press.x, press.y));
73
- ({skeleton: origin, name} = addJoint(origin, parent, press.x, press.y));
74
- }
75
- const joint = name;
76
- const from = jointPositions(origin).get(joint);
77
- env.state.setActive(joint);
78
- env.show(origin);
79
- return {
80
- onMove: (move) => {
81
- env.show(moveJoint(origin, joint, from.x + move.world.x - press.x, from.y + move.world.y - press.y));
82
- },
83
- onEnd: (_end, reason) => {
84
- const next = env.shown();
85
- env.show(null);
86
- if (reason === "cancel" || !next) {
87
- env.state.setActive(before);
88
- return;
89
- }
90
- commitSkeleton(env.scene(), deps, at.id, next, hit === null ? "Add bone" : "Move joint");
91
- }
92
- };
93
- }
94
- }
95
- };
96
- }
97
- /** The bone tool's actions: `bone.drag`, `bone.pick`, `bone.remove`, and `bone.clear`. */
98
- function createBoneActions(env) {
99
- const editing = () => env.placed() ? true : ActionDisabledReason.NotApplicable;
100
- const hasActive = () => {
101
- const at = env.placed();
102
- return at && activeIn(env, at.skeleton) !== null ? true : ActionDisabledReason.NotApplicable;
103
- };
104
- return [
105
- dragAction(env, editing),
106
- {
107
- id: "bone.pick",
108
- label: "Bone — pick the active joint",
109
- eligible,
110
- requires: ["view"],
111
- enabled: editing,
112
- invoker: {
113
- timing: "immediate",
114
- run: (deps, params) => {
115
- const p = params;
116
- const at = env.placed();
117
- if (!at || p?.pressX === void 0 || p.pressY === void 0) return;
118
- env.state.setActive(jointAt(at.skeleton, p.pressX, p.pressY, reachOf(env, deps)));
119
- }
120
- }
121
- },
122
- {
123
- id: "bone.remove",
124
- label: "Bone — remove the active joint",
125
- eligible,
126
- requires: ["selection", "applyOps"],
127
- enabled: hasActive,
128
- invoker: {
129
- timing: "immediate",
130
- run: (deps) => {
131
- const at = env.placed();
132
- const name = at && activeIn(env, at.skeleton);
133
- if (!at || name == null) return;
134
- const parent = at.skeleton.joints.find((j) => j.name === name).parent;
135
- const { skeleton, removed } = removeJoint(at.skeleton, name);
136
- commitSkeleton(env.scene(), deps, at.id, skeleton, "Remove joint", removed);
137
- env.state.setActive(parent);
138
- }
139
- }
140
- },
141
- {
142
- id: "bone.clear",
143
- label: "Bone — clear the active joint",
144
- eligible,
145
- enabled: hasActive,
146
- invoker: {
147
- timing: "immediate",
148
- run: () => env.state.setActive(null)
149
- }
150
- }
151
- ];
152
- }
153
-
154
- //#endregion
155
- export { createBoneActions };
156
- //# sourceMappingURL=boneActions.js.map