@weasel-js/core 1.9.4 → 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 (1092) hide show
  1. package/CHANGELOG.md +750 -0
  2. package/README.md +5 -3
  3. package/dist/WeaselProvider.js +5 -7
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +91 -83
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  7. package/dist/affordances/cornerResize.js +3 -2
  8. package/dist/affordances/cornerResize.js.map +1 -1
  9. package/dist/affordances/hitAffordanceRegions.js +54 -100
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js.map +1 -1
  12. package/dist/affordances/rotationHandle.js +5 -4
  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 +48 -136
  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 +8 -7
  44. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  45. package/dist/animation/wrappers/animateOnSetPose.js +31 -31
  46. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  47. package/dist/animation/wrappers/instantPose.js.map +1 -1
  48. package/dist/animation/writtenPoseTarget.js +33 -0
  49. package/dist/animation/writtenPoseTarget.js.map +1 -0
  50. package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
  51. package/dist/barrel/canvas.js +31 -0
  52. package/dist/barrel/chrome.js +10 -10
  53. package/dist/barrel/input.js +16 -17
  54. package/dist/barrel/interactions.js +35 -39
  55. package/dist/barrel/paint.js +11 -18
  56. package/dist/barrel/paths.js +12 -19
  57. package/dist/barrel/renderer.js +14 -20
  58. package/dist/barrel/routing.js +42 -36
  59. package/dist/barrel/scene.js +37 -0
  60. package/dist/barrel/text.js +9 -18
  61. package/dist/barrel/viewport.js +41 -51
  62. package/dist/canvas/Canvas.js +281 -475
  63. package/dist/canvas/Canvas.js.map +1 -1
  64. package/dist/canvas/CanvasView.js +169 -188
  65. package/dist/canvas/CanvasView.js.map +1 -1
  66. package/dist/canvas/CursorCoordsHud.js +22 -23
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  68. package/dist/canvas/DrawCanvas.js +39 -56
  69. package/dist/canvas/DrawCanvas.js.map +1 -1
  70. package/dist/canvas/ModalityHud.js.map +1 -1
  71. package/dist/canvas/NodeShape.js +28 -29
  72. package/dist/canvas/NodeShape.js.map +1 -1
  73. package/dist/canvas/PickHud.js.map +1 -1
  74. package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
  75. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
  76. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
  77. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
  78. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +27 -31
  79. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  80. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +51 -54
  81. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
  82. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
  83. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
  84. package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
  85. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +40 -29
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/features.js +73 -43
  92. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  96. package/dist/canvas/SceneCanvas/props.js +15 -14
  97. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  98. package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
  99. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
  101. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  102. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
  104. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/useCanvasCamera.js +38 -0
  106. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
  107. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
  108. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
  109. package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
  110. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
  112. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
  113. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +29 -29
  114. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  115. package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
  116. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
  117. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
  118. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
  119. package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
  120. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
  121. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +39 -37
  122. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  123. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
  124. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
  125. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
  126. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
  127. package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
  128. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
  129. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
  130. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
  131. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +76 -80
  132. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  133. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
  134. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
  135. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
  136. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
  137. package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
  138. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
  139. package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
  140. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  141. package/dist/canvas/SceneCanvas/worldPointAt.js +9 -0
  142. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
  143. package/dist/canvas/SceneCanvas.js +303 -707
  144. package/dist/canvas/SceneCanvas.js.map +1 -1
  145. package/dist/canvas/SceneViewCanvas.js +41 -47
  146. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  147. package/dist/canvas/adapterDerivedPath.js +26 -0
  148. package/dist/canvas/adapterDerivedPath.js.map +1 -0
  149. package/dist/canvas/affordanceAt.js +11 -1
  150. package/dist/canvas/affordanceAt.js.map +1 -1
  151. package/dist/canvas/buildSceneLayer.js +81 -61
  152. package/dist/canvas/buildSceneLayer.js.map +1 -1
  153. package/dist/canvas/buildSceneTree.js.map +1 -1
  154. package/dist/canvas/canvasRenderer.js +40 -44
  155. package/dist/canvas/canvasRenderer.js.map +1 -1
  156. package/dist/canvas/colorOverrides.js.map +1 -1
  157. package/dist/canvas/defaultDrawOne.js +12 -12
  158. package/dist/canvas/defaultDrawOne.js.map +1 -1
  159. package/dist/canvas/deps/areaSelect.js +4 -4
  160. package/dist/canvas/deps/areaSelect.js.map +1 -1
  161. package/dist/canvas/deps/debug.js.map +1 -1
  162. package/dist/canvas/deps/editAnchors.js +49 -68
  163. package/dist/canvas/deps/editAnchors.js.map +1 -1
  164. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  165. package/dist/canvas/deps/hitTestArea.js +31 -26
  166. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  167. package/dist/canvas/deps/insert.js +65 -54
  168. package/dist/canvas/deps/insert.js.map +1 -1
  169. package/dist/canvas/deps/lassoSelect.js +5 -5
  170. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  171. package/dist/canvas/deps/poseDescriptor.js +1 -1
  172. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  173. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  174. package/dist/canvas/deps/slice.js +44 -45
  175. package/dist/canvas/deps/slice.js.map +1 -1
  176. package/dist/canvas/deps/textEdit.js +8 -8
  177. package/dist/canvas/deps/textEdit.js.map +1 -1
  178. package/dist/canvas/deps/view.js.map +1 -1
  179. package/dist/canvas/derivedPath.js +43 -41
  180. package/dist/canvas/derivedPath.js.map +1 -1
  181. package/dist/canvas/drawEnvelope.js +8 -4
  182. package/dist/canvas/drawEnvelope.js.map +1 -1
  183. package/dist/canvas/getNodeAtPoint.js +2 -6
  184. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  185. package/dist/canvas/hud.module.js.map +1 -1
  186. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  187. package/dist/canvas/layerOrder.js.map +1 -1
  188. package/dist/canvas/layerSlots.js +6 -1
  189. package/dist/canvas/layerSlots.js.map +1 -1
  190. package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
  191. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  192. package/dist/canvas/nodeShapes/imagePainter.js +10 -10
  193. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
  194. package/dist/canvas/nodeShapes/memo.js.map +1 -1
  195. package/dist/canvas/nodeShapes/nodePaint.js +34 -23
  196. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  197. package/dist/canvas/nodeShapes/pathPainter.js +23 -22
  198. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  199. package/dist/canvas/nodeShapes/poseBox.js +6 -6
  200. package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
  201. package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
  202. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  203. package/dist/canvas/nodeShapes/shapePainter.js +16 -16
  204. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  205. package/dist/canvas/nodeShapes/textPainter.js +1 -1
  206. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  207. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  208. package/dist/canvas/paintCull.js +6 -8
  209. package/dist/canvas/paintCull.js.map +1 -1
  210. package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
  211. package/dist/canvas/paintedCursorLayer.js.map +1 -0
  212. package/dist/canvas/pickWalk.js +52 -50
  213. package/dist/canvas/pickWalk.js.map +1 -1
  214. package/dist/canvas/planeClips.js +18 -19
  215. package/dist/canvas/planeClips.js.map +1 -1
  216. package/dist/canvas/poseCascade.js +41 -0
  217. package/dist/canvas/poseCascade.js.map +1 -0
  218. package/dist/canvas/poseRotation.js +1 -3
  219. package/dist/canvas/poseRotation.js.map +1 -1
  220. package/dist/canvas/rasterReadback.js +22 -0
  221. package/dist/canvas/rasterReadback.js.map +1 -0
  222. package/dist/canvas/renderDebugSnapshot.js +12 -12
  223. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  224. package/dist/canvas/renderNeeds.js +3 -3
  225. package/dist/canvas/renderNeeds.js.map +1 -1
  226. package/dist/canvas/renderSceneToPixels.js +64 -83
  227. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  228. package/dist/canvas/sceneAdapter.js +68 -132
  229. package/dist/canvas/sceneAdapter.js.map +1 -1
  230. package/dist/canvas/sceneClipboard.js +1 -1
  231. package/dist/canvas/sceneClipboard.js.map +1 -1
  232. package/dist/canvas/sceneLayerPaint.js +4 -4
  233. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  234. package/dist/canvas/sceneSlotWiring.js +4 -4
  235. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  236. package/dist/canvas/sceneViewRender.js +36 -35
  237. package/dist/canvas/sceneViewRender.js.map +1 -1
  238. package/dist/canvas/slopsDebugLayer.js +4 -4
  239. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  240. package/dist/canvas/surface.module.js +6 -0
  241. package/dist/canvas/surface.module.js.map +1 -0
  242. package/dist/canvas/surfaceBox.js +16 -0
  243. package/dist/canvas/surfaceBox.js.map +1 -0
  244. package/dist/canvas/useCanvasRenderer.js +23 -11
  245. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  246. package/dist/canvas/useCanvasSurface.js +31 -0
  247. package/dist/canvas/useCanvasSurface.js.map +1 -0
  248. package/dist/canvas/useCanvasView.js +46 -37
  249. package/dist/canvas/useCanvasView.js.map +1 -1
  250. package/dist/canvas/useFrameLoop.js +11 -12
  251. package/dist/canvas/useFrameLoop.js.map +1 -1
  252. package/dist/canvas/useHostAnchor.js +35 -33
  253. package/dist/canvas/useHostAnchor.js.map +1 -1
  254. package/dist/canvas/useLateContentRedraw.js +8 -8
  255. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  256. package/dist/canvas/useSceneLayerList.js +4 -14
  257. package/dist/canvas/useSceneLayerList.js.map +1 -1
  258. package/dist/canvas/useSurfaceInput.js +42 -0
  259. package/dist/canvas/useSurfaceInput.js.map +1 -0
  260. package/dist/canvas/useToolCursor.js +29 -0
  261. package/dist/canvas/useToolCursor.js.map +1 -0
  262. package/dist/canvas/useViewHelpers.js +46 -85
  263. package/dist/canvas/useViewHelpers.js.map +1 -1
  264. package/dist/canvas/viewInputs.js.map +1 -1
  265. package/dist/canvas/viewRegistry.js +25 -27
  266. package/dist/canvas/viewRegistry.js.map +1 -1
  267. package/dist/canvas/watchElementMove.js +43 -0
  268. package/dist/canvas/watchElementMove.js.map +1 -0
  269. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  270. package/dist/clipboard.d.ts +7 -14
  271. package/dist/{types-B4iJRHC3.d.ts → clone-2a5hVbBd.d.ts} +122 -77
  272. package/dist/clone.d.ts +4 -8
  273. package/dist/clone.js +0 -2
  274. package/dist/core/device/targets.js.map +1 -1
  275. package/dist/core/device/useDeviceProfile.js +13 -13
  276. package/dist/core/device/useDeviceProfile.js.map +1 -1
  277. package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
  278. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
  279. package/dist/core/geometry/pathPoseDescriptor.js +88 -0
  280. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
  281. package/dist/core/geometry/poseDescriptor.js +61 -14
  282. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  283. package/dist/core/geometry/regionHit.js +35 -37
  284. package/dist/core/geometry/regionHit.js.map +1 -1
  285. package/dist/core/geometry/targetFrame.js +94 -0
  286. package/dist/core/geometry/targetFrame.js.map +1 -0
  287. package/dist/core/geometry/unionBounds.js +4 -5
  288. package/dist/core/geometry/unionBounds.js.map +1 -1
  289. package/dist/core/layers/backgroundFill.js +31 -0
  290. package/dist/core/layers/backgroundFill.js.map +1 -0
  291. package/dist/{features/groups → core/layers}/children.js +1 -1
  292. package/dist/core/layers/children.js.map +1 -0
  293. package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
  294. package/dist/core/layers/gateLayer.js.map +1 -0
  295. package/dist/core/layers/layerGroup.js +40 -0
  296. package/dist/core/layers/layerGroup.js.map +1 -0
  297. package/dist/core/layers/render.js +50 -76
  298. package/dist/core/layers/render.js.map +1 -1
  299. package/dist/core/ops/createHistory.js +9 -9
  300. package/dist/core/ops/createHistory.js.map +1 -1
  301. package/dist/core/ops/delete.js.map +1 -1
  302. package/dist/core/paint/meshKind.js +16 -0
  303. package/dist/core/paint/meshKind.js.map +1 -0
  304. package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +103 -92
  305. package/dist/core/paint/meshKindLazy.js.map +1 -0
  306. package/dist/core/paint/paintKindEntry.js +8 -0
  307. package/dist/core/paint/paintKindEntry.js.map +1 -0
  308. package/dist/core/paint/paintKinds.js +144 -0
  309. package/dist/core/paint/paintKinds.js.map +1 -0
  310. package/dist/core/paint/registerMesh.js +7 -0
  311. package/dist/core/paint/registerMesh.js.map +1 -0
  312. package/dist/core/scene/NodeProperties.js.map +1 -1
  313. package/dist/core/scene/NodeRouting.js.map +1 -1
  314. package/dist/core/scene/arrivalWindow.js +65 -64
  315. package/dist/core/scene/arrivalWindow.js.map +1 -1
  316. package/dist/core/scene/boundOps.js +40 -0
  317. package/dist/core/scene/boundOps.js.map +1 -0
  318. package/dist/core/scene/composeFrame.js +9 -6
  319. package/dist/core/scene/composeFrame.js.map +1 -1
  320. package/dist/{features/groups → core/scene}/composePose.js +18 -18
  321. package/dist/core/scene/composePose.js.map +1 -0
  322. package/dist/core/scene/depMemo.js +31 -6
  323. package/dist/core/scene/depMemo.js.map +1 -1
  324. package/dist/core/scene/derivedPath.js +19 -20
  325. package/dist/core/scene/derivedPath.js.map +1 -1
  326. package/dist/core/scene/editMode.js +26 -0
  327. package/dist/core/scene/editMode.js.map +1 -0
  328. package/dist/core/scene/effectivePose.js +38 -39
  329. package/dist/core/scene/effectivePose.js.map +1 -1
  330. package/dist/core/scene/fieldEdits.js +98 -0
  331. package/dist/core/scene/fieldEdits.js.map +1 -0
  332. package/dist/core/scene/historyFacade.js +116 -70
  333. package/dist/core/scene/historyFacade.js.map +1 -1
  334. package/dist/core/scene/historyForm.js +6 -0
  335. package/dist/core/scene/historyForm.js.map +1 -0
  336. package/dist/core/scene/kitOps.js +83 -71
  337. package/dist/core/scene/kitOps.js.map +1 -1
  338. package/dist/core/scene/kitRegistry.js.map +1 -1
  339. package/dist/core/scene/layerStack.js +105 -12
  340. package/dist/core/scene/layerStack.js.map +1 -1
  341. package/dist/core/scene/layoutPass.js +58 -59
  342. package/dist/core/scene/layoutPass.js.map +1 -1
  343. package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
  344. package/dist/core/scene/nestedHit.js.map +1 -0
  345. package/dist/core/scene/nodeFnFields.js +9 -9
  346. package/dist/core/scene/nodeFnFields.js.map +1 -1
  347. package/dist/core/scene/nodeMemo.js.map +1 -1
  348. package/dist/core/scene/nodeStore.js +72 -71
  349. package/dist/core/scene/nodeStore.js.map +1 -1
  350. package/dist/core/scene/notifier.js +37 -0
  351. package/dist/core/scene/notifier.js.map +1 -0
  352. package/dist/core/scene/opTable.js +50 -0
  353. package/dist/core/scene/opTable.js.map +1 -0
  354. package/dist/core/scene/outerOps.js +66 -0
  355. package/dist/core/scene/outerOps.js.map +1 -0
  356. package/dist/core/scene/poseHold.js +39 -0
  357. package/dist/core/scene/poseHold.js.map +1 -0
  358. package/dist/core/scene/poseOverrides.js +44 -36
  359. package/dist/core/scene/poseOverrides.js.map +1 -1
  360. package/dist/core/scene/poseSnapshot.js.map +1 -1
  361. package/dist/core/scene/reconcileSpecs.js +3 -2
  362. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  363. package/dist/core/scene/recorder.js +86 -0
  364. package/dist/core/scene/recorder.js.map +1 -0
  365. package/dist/core/scene/renderOrder.js.map +1 -1
  366. package/dist/core/scene/scene.js +81 -690
  367. package/dist/core/scene/scene.js.map +1 -1
  368. package/dist/core/scene/sceneEdits.js +58 -0
  369. package/dist/core/scene/sceneEdits.js.map +1 -0
  370. package/dist/core/scene/sceneMutators.js +49 -0
  371. package/dist/core/scene/sceneMutators.js.map +1 -0
  372. package/dist/core/scene/scenePoseAdapter.js +16 -0
  373. package/dist/core/scene/scenePoseAdapter.js.map +1 -0
  374. package/dist/core/scene/sceneRecording.js +90 -0
  375. package/dist/core/scene/sceneRecording.js.map +1 -0
  376. package/dist/core/scene/sceneSelection.js +28 -0
  377. package/dist/core/scene/sceneSelection.js.map +1 -0
  378. package/dist/core/scene/sceneState.js +49 -0
  379. package/dist/core/scene/sceneState.js.map +1 -0
  380. package/dist/core/scene/serialization.js +8 -5
  381. package/dist/core/scene/serialization.js.map +1 -1
  382. package/dist/core/scene/staleReplay.js +51 -0
  383. package/dist/core/scene/staleReplay.js.map +1 -0
  384. package/dist/core/scene/statedFields.js +9 -0
  385. package/dist/core/scene/statedFields.js.map +1 -0
  386. package/dist/core/scene/treeEdits.js +127 -0
  387. package/dist/core/scene/treeEdits.js.map +1 -0
  388. package/dist/core/scene/treeReads.js +26 -0
  389. package/dist/core/scene/treeReads.js.map +1 -0
  390. package/dist/core/scene/types.js.map +1 -1
  391. package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
  392. package/dist/core/scene/unionOfChildren.js.map +1 -0
  393. package/dist/core/scene/unitScopes.js +13 -0
  394. package/dist/core/scene/unitScopes.js.map +1 -0
  395. package/dist/core/scene/useScene.js.map +1 -1
  396. package/dist/core/selection/readOnlySelection.js +32 -0
  397. package/dist/core/selection/readOnlySelection.js.map +1 -0
  398. package/dist/core/selection/usePublishSceneSelection.js +26 -0
  399. package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
  400. package/dist/core/selection/useSelection.js +34 -25
  401. package/dist/core/selection/useSelection.js.map +1 -1
  402. package/dist/core/shapeKinds.js.map +1 -1
  403. package/dist/core/stylus/stylus.js.map +1 -1
  404. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  405. package/dist/core/usePaintKinds.js +1 -1
  406. package/dist/core/usePaintKinds.js.map +1 -1
  407. package/dist/core/viewport/clientToWorld.js.map +1 -1
  408. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  409. package/dist/core/viewport/parallax.js.map +1 -1
  410. package/dist/core/viewport/screenSlop.js +11 -11
  411. package/dist/core/viewport/screenSlop.js.map +1 -1
  412. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  413. package/dist/core/viewport/useDecayLoop.js +8 -8
  414. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  415. package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
  416. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
  417. package/dist/core/viewport/useViewAnimation.js +102 -43
  418. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  419. package/dist/core/viewport/view.js +7 -7
  420. package/dist/core/viewport/view.js.map +1 -1
  421. package/dist/core/viewport/wheelHandler.js.map +1 -1
  422. package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BEshc4z3.d.ts} +11 -24
  423. package/dist/debug/createDebugOverlayLayer.js +100 -100
  424. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  425. package/dist/debug/createDebugSink.js.map +1 -1
  426. package/dist/debug/frameStats.js.map +1 -1
  427. package/dist/debug/useDebugSink.js +52 -0
  428. package/dist/debug/useDebugSink.js.map +1 -0
  429. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  430. package/dist/features/chrome-caps/conditions.js.map +1 -1
  431. package/dist/features/chrome-caps/defaults.js.map +1 -1
  432. package/dist/features/chrome-caps/resolve.js.map +1 -1
  433. package/dist/features/chrome-caps/useChromeCaps.js +54 -0
  434. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
  435. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  436. package/dist/features/ingestion/contentHandlers.js +25 -19
  437. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  438. package/dist/features/ingestion/imageHandler.js +21 -24
  439. package/dist/features/ingestion/imageHandler.js.map +1 -1
  440. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  441. package/dist/features/ingestion/placement.js +16 -0
  442. package/dist/features/ingestion/placement.js.map +1 -0
  443. package/dist/features/ingestion/svgHandler.js +5 -0
  444. package/dist/features/ingestion/svgHandler.js.map +1 -1
  445. package/dist/features/ingestion/textHandler.js +28 -0
  446. package/dist/features/ingestion/textHandler.js.map +1 -0
  447. package/dist/features/ingestion/useCanvasIngestion.js +48 -0
  448. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
  449. package/dist/features/ingestion/weaselJsonHandler.js +5 -0
  450. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  451. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  452. package/dist/features/modes/modeLayers.js +7 -7
  453. package/dist/features/modes/modeLayers.js.map +1 -1
  454. package/dist/features/paths/editablePath.js +47 -0
  455. package/dist/features/paths/editablePath.js.map +1 -0
  456. package/dist/features/paths/index.js +9 -16
  457. package/dist/features/paths/pathEditState.js +41 -0
  458. package/dist/features/paths/pathEditState.js.map +1 -0
  459. package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
  460. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  461. package/dist/features/paths/pathLayer.js +3 -2
  462. package/dist/features/paths/pathLayer.js.map +1 -1
  463. package/dist/features/paths/penPreviewLayer.js +86 -88
  464. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  465. package/dist/features/paths/usePathEdit.js +34 -0
  466. package/dist/features/paths/usePathEdit.js.map +1 -0
  467. package/dist/features/poseRun/usePoseRun.js +42 -55
  468. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  469. package/dist/features/selection/overlay.js +170 -178
  470. package/dist/features/selection/overlay.js.map +1 -1
  471. package/dist/features/text/index.js +6 -0
  472. package/dist/features/text/textLayer.js +1 -1
  473. package/dist/features/text/textLayer.js.map +1 -1
  474. package/dist/features/text/useSceneTextEdit.js +95 -82
  475. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  476. package/dist/features/viewports/viewportLayer.js +25 -36
  477. package/dist/features/viewports/viewportLayer.js.map +1 -1
  478. package/dist/index.d.ts +4507 -8459
  479. package/dist/index.js +275 -320
  480. package/dist/input/keyState.js +14 -14
  481. package/dist/interactions/actions/actionShortcuts.js.map +1 -1
  482. package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
  483. package/dist/interactions/actions/align/action.js.map +1 -0
  484. package/dist/interactions/actions/align/align.js +23 -23
  485. package/dist/interactions/actions/align/align.js.map +1 -1
  486. package/dist/interactions/actions/booleans/action.js +65 -0
  487. package/dist/interactions/actions/booleans/action.js.map +1 -0
  488. package/dist/interactions/actions/booleans/booleans.js +69 -78
  489. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  490. package/dist/interactions/actions/booleans/operands.js +40 -0
  491. package/dist/interactions/actions/booleans/operands.js.map +1 -0
  492. package/dist/interactions/actions/booleans/pieces.js +45 -0
  493. package/dist/interactions/actions/booleans/pieces.js.map +1 -0
  494. package/dist/interactions/actions/booleans/placement.js +24 -0
  495. package/dist/interactions/actions/booleans/placement.js.map +1 -0
  496. package/dist/interactions/actions/booleans/useBooleans.js +11 -9
  497. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  498. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  499. package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
  500. package/dist/interactions/actions/clipboard/action.js.map +1 -0
  501. package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
  502. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  503. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  504. package/dist/interactions/actions/clone/action.js +98 -0
  505. package/dist/interactions/actions/clone/action.js.map +1 -0
  506. package/dist/interactions/actions/clone/behaviors.js +52 -0
  507. package/dist/interactions/actions/clone/behaviors.js.map +1 -0
  508. package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
  509. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  510. package/dist/interactions/actions/defaults/anchorEditing.js +41 -43
  511. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  512. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  513. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  514. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  515. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  516. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  517. package/dist/interactions/actions/defaults/duplicate.js +19 -19
  518. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  519. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  520. package/dist/interactions/actions/defaults/group.js +35 -40
  521. package/dist/interactions/actions/defaults/group.js.map +1 -1
  522. package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
  523. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
  524. package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
  525. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
  526. package/dist/interactions/actions/defaults/ingest.js +19 -15
  527. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  528. package/dist/interactions/actions/defaults/insertPathAnchor.js +14 -15
  529. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  530. package/dist/interactions/actions/defaults/nudge.js +30 -31
  531. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  532. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  533. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  534. package/dist/interactions/actions/defaults/setFill.js +9 -3
  535. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  536. package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
  537. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  538. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  539. package/dist/interactions/actions/defaults/sliceOps.js +20 -22
  540. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  541. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  542. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  543. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
  544. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  545. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  546. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  547. package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
  548. package/dist/interactions/actions/distribute/action.js.map +1 -0
  549. package/dist/interactions/actions/distribute/distribute.js +11 -11
  550. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  551. package/dist/interactions/actions/{defaults/editAnchors.js → edit-anchors/action.js} +19 -21
  552. package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
  553. package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
  554. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  555. package/dist/interactions/actions/flip/action.js +124 -0
  556. package/dist/interactions/actions/flip/action.js.map +1 -0
  557. package/dist/interactions/actions/flip/helpers.js +1 -1
  558. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  559. package/dist/interactions/actions/gestureFrames.js +18 -0
  560. package/dist/interactions/actions/gestureFrames.js.map +1 -0
  561. package/dist/interactions/actions/gestureLifecycle.js +47 -20
  562. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  563. package/dist/interactions/actions/insert/action.js +72 -0
  564. package/dist/interactions/actions/insert/action.js.map +1 -0
  565. package/dist/interactions/actions/insert/commit.js +28 -0
  566. package/dist/interactions/actions/insert/commit.js.map +1 -0
  567. package/dist/interactions/actions/insert/extras.js +65 -0
  568. package/dist/interactions/actions/insert/extras.js.map +1 -0
  569. package/dist/interactions/actions/insert/frame.js +48 -0
  570. package/dist/interactions/actions/insert/frame.js.map +1 -0
  571. package/dist/interactions/actions/insert/geometry.js +35 -0
  572. package/dist/interactions/actions/insert/geometry.js.map +1 -0
  573. package/dist/interactions/actions/insert/rotateAction.js +21 -0
  574. package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
  575. package/dist/interactions/actions/insert/session.js +59 -0
  576. package/dist/interactions/actions/insert/session.js.map +1 -0
  577. package/dist/interactions/actions/insert/shape.js +34 -0
  578. package/dist/interactions/actions/insert/shape.js.map +1 -0
  579. package/dist/interactions/actions/lasso-select/action.js +143 -0
  580. package/dist/interactions/actions/lasso-select/action.js.map +1 -0
  581. package/dist/interactions/actions/move/action.js +87 -0
  582. package/dist/interactions/actions/move/action.js.map +1 -0
  583. package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
  584. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
  585. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
  586. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
  587. package/dist/interactions/actions/move/behaviors/snapToContainer.js +24 -23
  588. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  589. package/dist/interactions/actions/move/capture.js +99 -0
  590. package/dist/interactions/actions/move/capture.js.map +1 -0
  591. package/dist/interactions/actions/move/commit/index.js +41 -0
  592. package/dist/interactions/actions/move/commit/index.js.map +1 -0
  593. package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
  594. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
  595. package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
  596. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
  597. package/dist/interactions/actions/move/commit/rebase.js +18 -0
  598. package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
  599. package/dist/interactions/actions/move/commit/reparent.js +65 -0
  600. package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
  601. package/dist/interactions/actions/move/delta.js +51 -0
  602. package/dist/interactions/actions/move/delta.js.map +1 -0
  603. package/dist/interactions/actions/move/frame.js +59 -0
  604. package/dist/interactions/actions/move/frame.js.map +1 -0
  605. package/dist/interactions/actions/move/gestureAdapter.js +15 -40
  606. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  607. package/dist/interactions/actions/move/landedDescendants.js +8 -8
  608. package/dist/interactions/actions/move/layout/container.js +94 -0
  609. package/dist/interactions/actions/move/layout/container.js.map +1 -0
  610. package/dist/interactions/actions/move/layout/dragged.js +58 -0
  611. package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
  612. package/dist/interactions/actions/move/layout/dropPass.js +122 -0
  613. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
  614. package/dist/interactions/actions/move/layout/exits.js +38 -0
  615. package/dist/interactions/actions/move/layout/exits.js.map +1 -0
  616. package/dist/interactions/actions/move/layout/glide.js +48 -0
  617. package/dist/interactions/actions/move/layout/glide.js.map +1 -0
  618. package/dist/interactions/actions/move/session.js +63 -0
  619. package/dist/interactions/actions/move/session.js.map +1 -0
  620. package/dist/interactions/actions/move/translate.js +61 -0
  621. package/dist/interactions/actions/move/translate.js.map +1 -0
  622. package/dist/interactions/actions/outlines/createOutlines.js +17 -64
  623. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  624. package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
  625. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
  626. package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
  627. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
  628. package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
  629. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
  630. package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
  631. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
  632. package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
  633. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
  634. package/dist/interactions/actions/planeInput.js.map +1 -1
  635. package/dist/interactions/actions/pointerState.js +12 -0
  636. package/dist/interactions/actions/pointerState.js.map +1 -0
  637. package/dist/interactions/actions/poseDescriptorDep.js +1 -1
  638. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  639. package/dist/interactions/actions/poseFrame.js +26 -26
  640. package/dist/interactions/actions/poseFrame.js.map +1 -1
  641. package/dist/interactions/actions/resize/action.js +55 -0
  642. package/dist/interactions/actions/resize/action.js.map +1 -0
  643. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
  644. package/dist/interactions/actions/resize/boxFrame.js +16 -0
  645. package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
  646. package/dist/interactions/actions/resize/capture.js +85 -0
  647. package/dist/interactions/actions/resize/capture.js.map +1 -0
  648. package/dist/interactions/actions/resize/commit.js +69 -0
  649. package/dist/interactions/actions/resize/commit.js.map +1 -0
  650. package/dist/interactions/actions/resize/frame.js +74 -0
  651. package/dist/interactions/actions/resize/frame.js.map +1 -0
  652. package/dist/interactions/actions/resize/pointSnap.js +111 -0
  653. package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
  654. package/dist/interactions/actions/resize/ruleBounds.js +9 -0
  655. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
  656. package/dist/interactions/actions/resize/session.js +49 -0
  657. package/dist/interactions/actions/resize/session.js.map +1 -0
  658. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  659. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  660. package/dist/interactions/actions/rotate/action.js +56 -0
  661. package/dist/interactions/actions/rotate/action.js.map +1 -0
  662. package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
  663. package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
  664. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
  665. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
  666. package/dist/interactions/actions/rotate/commit.js +40 -0
  667. package/dist/interactions/actions/rotate/commit.js.map +1 -0
  668. package/dist/interactions/actions/rotate/frame.js +65 -0
  669. package/dist/interactions/actions/rotate/frame.js.map +1 -0
  670. package/dist/interactions/actions/rotate/handle.js +12 -12
  671. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  672. package/dist/interactions/actions/rotate/session.js +92 -0
  673. package/dist/interactions/actions/rotate/session.js.map +1 -0
  674. package/dist/interactions/actions/spatialReference.js.map +1 -1
  675. package/dist/interactions/actions/useStandardActions.js +77 -72
  676. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  677. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
  678. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  679. package/dist/interactions/gestures/shared/originProjection.js +1 -1
  680. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  681. package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
  682. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  683. package/dist/interactions/gestures/shared/snap.js.map +1 -1
  684. package/dist/layout/arrivals.js +20 -23
  685. package/dist/layout/arrivals.js.map +1 -1
  686. package/dist/math-CYUjoyyU.d.ts +33 -0
  687. package/dist/math.d.ts +5 -2
  688. package/dist/math.js +6 -6
  689. package/dist/mesh.d.ts +4 -268
  690. package/dist/mesh.js +3 -7
  691. package/dist/move.d.ts +6 -4
  692. package/dist/{originProjection-gHnOup4e.d.ts → originProjection-PPT88jZv.d.ts} +1 -1
  693. package/dist/patterns-builtin.d.ts +1 -118
  694. package/dist/patterns-builtin.js +2 -3
  695. package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
  696. package/dist/renderer.d.ts +1 -92
  697. package/dist/renderer.js +2 -19
  698. package/dist/resize.d.ts +11 -22
  699. package/dist/resize.js +1 -1
  700. package/dist/style.css +1 -1
  701. package/dist/test-hook/install.js.map +1 -1
  702. package/dist/test-hook/useTestHook.js +22 -0
  703. package/dist/test-hook/useTestHook.js.map +1 -0
  704. package/dist/test-seams-D0pyV3pR.d.ts +149 -0
  705. package/dist/test-seams.d.ts +4 -4
  706. package/dist/test-seams.js +2 -2
  707. package/dist/tools/builtin/bone/boneActions.js +130 -0
  708. package/dist/tools/builtin/bone/boneActions.js.map +1 -0
  709. package/dist/tools/builtin/bone/boneOverlay.js +58 -0
  710. package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
  711. package/dist/tools/builtin/bone/placedRig.js +24 -0
  712. package/dist/tools/builtin/bone/placedRig.js.map +1 -0
  713. package/dist/tools/builtin/bone/rigEditState.js +21 -0
  714. package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
  715. package/dist/tools/builtin/bone/useBoneTool.js +98 -0
  716. package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
  717. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  718. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  719. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  720. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  721. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  722. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  723. package/dist/tools/builtin/pen/usePenTool.js +161 -163
  724. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  725. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  726. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  727. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  728. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  729. package/dist/tools/builtin/select/adapterPointQuery.js +36 -0
  730. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
  731. package/dist/tools/builtin/select/selectionContributions.js +4 -4
  732. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  733. package/dist/tools/builtin/select/useSelectTool.js +43 -71
  734. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  735. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
  736. package/dist/tools/builtin/slice/useSliceTool.js +67 -72
  737. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  738. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  739. package/dist/tools/builtin/text/useTextTool.js +8 -0
  740. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  741. package/dist/tools/builtin/weight/useWeightTool.js +77 -0
  742. package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
  743. package/dist/tools/builtin/weight/weightActions.js +112 -0
  744. package/dist/tools/builtin/weight/weightActions.js.map +1 -0
  745. package/dist/tools/builtin/weight/weightOverlay.js +61 -0
  746. package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
  747. package/dist/tools/overlayBinding.js.map +1 -1
  748. package/dist/tools/useKeybindings.js +20 -14
  749. package/dist/tools/useKeybindings.js.map +1 -1
  750. package/dist/{types-k-5Oqh-U.d.ts → types-CIKDwlsP.d.ts} +84 -164
  751. package/dist/util/paint.js +1 -1
  752. package/dist/util/paint.js.map +1 -1
  753. package/dist/version.js +1 -1
  754. package/package.json +26 -21
  755. package/dist/animation/colorHelpers.js +0 -135
  756. package/dist/animation/colorHelpers.js.map +0 -1
  757. package/dist/animation/colorRegistry.js +0 -37
  758. package/dist/animation/colorRegistry.js.map +0 -1
  759. package/dist/animation/engine/axes.js +0 -36
  760. package/dist/animation/engine/axes.js.map +0 -1
  761. package/dist/animation/engine/codec.js +0 -170
  762. package/dist/animation/engine/codec.js.map +0 -1
  763. package/dist/animation/engine/integrator.js +0 -12
  764. package/dist/animation/engine/integrator.js.map +0 -1
  765. package/dist/animation/loop.js +0 -60
  766. package/dist/animation/loop.js.map +0 -1
  767. package/dist/animation/observe.js +0 -23
  768. package/dist/animation/observe.js.map +0 -1
  769. package/dist/animation/rig/blendPoses.js +0 -43
  770. package/dist/animation/rig/blendPoses.js.map +0 -1
  771. package/dist/animation/rig/mirrorPose.js +0 -19
  772. package/dist/animation/rig/mirrorPose.js.map +0 -1
  773. package/dist/animation/rig/resolveSkeleton.js +0 -33
  774. package/dist/animation/rig/resolveSkeleton.js.map +0 -1
  775. package/dist/animation/rig/solveIk.js +0 -103
  776. package/dist/animation/rig/solveIk.js.map +0 -1
  777. package/dist/animation/rig/types.js +0 -12
  778. package/dist/animation/rig/types.js.map +0 -1
  779. package/dist/animation/slew.js +0 -27
  780. package/dist/animation/slew.js.map +0 -1
  781. package/dist/animation/stagger.js +0 -146
  782. package/dist/animation/stagger.js.map +0 -1
  783. package/dist/animation/timeline/booking.js +0 -114
  784. package/dist/animation/timeline/booking.js.map +0 -1
  785. package/dist/animation/timeline/createTimeline.js +0 -125
  786. package/dist/animation/timeline/createTimeline.js.map +0 -1
  787. package/dist/animation/timeline/sampleTrack.js +0 -79
  788. package/dist/animation/timeline/sampleTrack.js.map +0 -1
  789. package/dist/animation/useAnimator.js +0 -388
  790. package/dist/animation/useAnimator.js.map +0 -1
  791. package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
  792. package/dist/builtins-DPcdghtB.d.ts +0 -1223
  793. package/dist/canvas/MinimapCanvas.js +0 -140
  794. package/dist/canvas/MinimapCanvas.js.map +0 -1
  795. package/dist/canvas/deps/poseComposition.js +0 -11
  796. package/dist/canvas/deps/poseComposition.js.map +0 -1
  797. package/dist/canvas/minimapMath.js +0 -82
  798. package/dist/canvas/minimapMath.js.map +0 -1
  799. package/dist/canvas/toolPreview.js +0 -39
  800. package/dist/canvas/toolPreview.js.map +0 -1
  801. package/dist/core/adapters/arrayAdapter.js +0 -94
  802. package/dist/core/adapters/arrayAdapter.js.map +0 -1
  803. package/dist/core/adapters/useArrayAdapter.js +0 -13
  804. package/dist/core/adapters/useArrayAdapter.js.map +0 -1
  805. package/dist/core/fillInPoseFrame.js +0 -102
  806. package/dist/core/fillInPoseFrame.js.map +0 -1
  807. package/dist/core/geometry/poseFrame.js +0 -44
  808. package/dist/core/geometry/poseFrame.js.map +0 -1
  809. package/dist/core/geometry/poseRotation.js +0 -58
  810. package/dist/core/geometry/poseRotation.js.map +0 -1
  811. package/dist/core/gradient.js +0 -136
  812. package/dist/core/gradient.js.map +0 -1
  813. package/dist/core/markerInset.js +0 -24
  814. package/dist/core/markerInset.js.map +0 -1
  815. package/dist/core/mixed.js +0 -6
  816. package/dist/core/mixed.js.map +0 -1
  817. package/dist/core/paintKinds.js +0 -156
  818. package/dist/core/paintKinds.js.map +0 -1
  819. package/dist/core/scene/pickability.js +0 -6
  820. package/dist/core/scene/pickability.js.map +0 -1
  821. package/dist/core/strokeMarkerShapes.js +0 -139
  822. package/dist/core/strokeMarkerShapes.js.map +0 -1
  823. package/dist/core/strokeMarkers.js +0 -28
  824. package/dist/core/strokeMarkers.js.map +0 -1
  825. package/dist/core/viewport/meanScale.js +0 -8
  826. package/dist/core/viewport/meanScale.js.map +0 -1
  827. package/dist/core/viewport/pxExtent.js +0 -42
  828. package/dist/core/viewport/pxExtent.js.map +0 -1
  829. package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
  830. package/dist/features/focus/gateLayer.js.map +0 -1
  831. package/dist/features/focus/useCanvasFocus.js +0 -29
  832. package/dist/features/focus/useCanvasFocus.js.map +0 -1
  833. package/dist/features/groups/children.js.map +0 -1
  834. package/dist/features/groups/composePose.js.map +0 -1
  835. package/dist/features/groups/nestedHit.js.map +0 -1
  836. package/dist/features/groups/unionOfChildren.js.map +0 -1
  837. package/dist/features/images/imageCache.js +0 -104
  838. package/dist/features/images/imageCache.js.map +0 -1
  839. package/dist/features/ingestion/index.js +0 -8
  840. package/dist/features/meshPaint/bake.js +0 -79
  841. package/dist/features/meshPaint/bake.js.map +0 -1
  842. package/dist/features/meshPaint/bakeCache.js +0 -59
  843. package/dist/features/meshPaint/bakeCache.js.map +0 -1
  844. package/dist/features/meshPaint/handles.js +0 -86
  845. package/dist/features/meshPaint/handles.js.map +0 -1
  846. package/dist/features/meshPaint/lazyKind.js.map +0 -1
  847. package/dist/features/meshPaint/meshPaint.js +0 -239
  848. package/dist/features/meshPaint/meshPaint.js.map +0 -1
  849. package/dist/features/meshPaint/meshShader.js +0 -6
  850. package/dist/features/meshPaint/meshShader.js.map +0 -1
  851. package/dist/features/meshPaint/register.js +0 -7
  852. package/dist/features/meshPaint/register.js.map +0 -1
  853. package/dist/features/meshPaint/surface.js +0 -110
  854. package/dist/features/meshPaint/surface.js.map +0 -1
  855. package/dist/features/minimap/actions.js +0 -53
  856. package/dist/features/minimap/actions.js.map +0 -1
  857. package/dist/features/minimap/createMinimapContribution.js +0 -96
  858. package/dist/features/minimap/createMinimapContribution.js.map +0 -1
  859. package/dist/features/minimap/layers.js +0 -85
  860. package/dist/features/minimap/layers.js.map +0 -1
  861. package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
  862. package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
  863. package/dist/features/parallax/createParallaxLayer.js +0 -26
  864. package/dist/features/parallax/createParallaxLayer.js.map +0 -1
  865. package/dist/features/parallax/createParallaxPlane.js +0 -22
  866. package/dist/features/parallax/createParallaxPlane.js.map +0 -1
  867. package/dist/features/paths/anchorEdits.js +0 -167
  868. package/dist/features/paths/anchorEdits.js.map +0 -1
  869. package/dist/features/paths/anchors.js +0 -159
  870. package/dist/features/paths/anchors.js.map +0 -1
  871. package/dist/features/paths/booleans.js +0 -2
  872. package/dist/features/paths/markerCommands.js +0 -149
  873. package/dist/features/paths/markerCommands.js.map +0 -1
  874. package/dist/features/paths/markerSites.js +0 -59
  875. package/dist/features/paths/markerSites.js.map +0 -1
  876. package/dist/features/paths/markers.js +0 -95
  877. package/dist/features/paths/markers.js.map +0 -1
  878. package/dist/features/paths/nearestAnchor.js +0 -36
  879. package/dist/features/paths/nearestAnchor.js.map +0 -1
  880. package/dist/features/paths/pathInWorld.js +0 -41
  881. package/dist/features/paths/pathInWorld.js.map +0 -1
  882. package/dist/features/paths/poseDescriptor.js +0 -39
  883. package/dist/features/paths/poseDescriptor.js.map +0 -1
  884. package/dist/features/paths/strokeToPath.js +0 -40
  885. package/dist/features/paths/strokeToPath.js.map +0 -1
  886. package/dist/features/paths/tessellate/dash.js +0 -52
  887. package/dist/features/paths/tessellate/dash.js.map +0 -1
  888. package/dist/features/paths/tessellate/insets.js +0 -32
  889. package/dist/features/paths/tessellate/insets.js.map +0 -1
  890. package/dist/features/paths/tessellate/metric.js +0 -72
  891. package/dist/features/paths/tessellate/metric.js.map +0 -1
  892. package/dist/features/paths/tessellate/stroke.js +0 -170
  893. package/dist/features/paths/tessellate/stroke.js.map +0 -1
  894. package/dist/features/paths/tessellate/vertexWidths.js +0 -32
  895. package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
  896. package/dist/features/patterns/commandPaint.js +0 -18
  897. package/dist/features/patterns/commandPaint.js.map +0 -1
  898. package/dist/features/patterns/index.js +0 -11
  899. package/dist/features/patterns/index.js.map +0 -1
  900. package/dist/features/patterns/patterns-builtin.js +0 -38
  901. package/dist/features/patterns/patterns-builtin.js.map +0 -1
  902. package/dist/features/patterns/rasterizeTile.js +0 -17
  903. package/dist/features/patterns/rasterizeTile.js.map +0 -1
  904. package/dist/features/patterns/resolveSpec.js +0 -65
  905. package/dist/features/patterns/resolveSpec.js.map +0 -1
  906. package/dist/features/patterns/tileGeometry.js +0 -158
  907. package/dist/features/patterns/tileGeometry.js.map +0 -1
  908. package/dist/features/pointer/PointerContext.js +0 -45
  909. package/dist/features/pointer/PointerContext.js.map +0 -1
  910. package/dist/features/selection/SelectionContext.js +0 -51
  911. package/dist/features/selection/SelectionContext.js.map +0 -1
  912. package/dist/features/simulation/createSimulation.js +0 -61
  913. package/dist/features/simulation/createSimulation.js.map +0 -1
  914. package/dist/features/simulation/types.js +0 -6
  915. package/dist/features/simulation/types.js.map +0 -1
  916. package/dist/features/simulation/useSimulation.js +0 -74
  917. package/dist/features/simulation/useSimulation.js.map +0 -1
  918. package/dist/features/text/domOffsets.js +0 -82
  919. package/dist/features/text/domOffsets.js.map +0 -1
  920. package/dist/features/text/domRuns.js +0 -230
  921. package/dist/features/text/domRuns.js.map +0 -1
  922. package/dist/features/text/fitTextPose.js +0 -38
  923. package/dist/features/text/fitTextPose.js.map +0 -1
  924. package/dist/features/text/hitTest.js +0 -48
  925. package/dist/features/text/hitTest.js.map +0 -1
  926. package/dist/features/text/isTextData.js +0 -8
  927. package/dist/features/text/isTextData.js.map +0 -1
  928. package/dist/features/text/overlayDirection.js +0 -15
  929. package/dist/features/text/overlayDirection.js.map +0 -1
  930. package/dist/features/text/renderLabel.js +0 -14
  931. package/dist/features/text/renderLabel.js.map +0 -1
  932. package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
  933. package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
  934. package/dist/features/text/runs/flagRange.js +0 -53
  935. package/dist/features/text/runs/flagRange.js.map +0 -1
  936. package/dist/features/text/runs/rangeStyle.js +0 -133
  937. package/dist/features/text/runs/rangeStyle.js.map +0 -1
  938. package/dist/features/text/textCommand.js +0 -60
  939. package/dist/features/text/textCommand.js.map +0 -1
  940. package/dist/features/text/textToPath.js +0 -181
  941. package/dist/features/text/textToPath.js.map +0 -1
  942. package/dist/features/text/useTextEdit.js +0 -491
  943. package/dist/features/text/useTextEdit.js.map +0 -1
  944. package/dist/features/tiling/createTiledLayer.js +0 -65
  945. package/dist/features/tiling/createTiledLayer.js.map +0 -1
  946. package/dist/features/tiling/tiledProject.js +0 -14
  947. package/dist/features/tiling/tiledProject.js.map +0 -1
  948. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
  949. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
  950. package/dist/interactions/actions/defaults/align.js.map +0 -1
  951. package/dist/interactions/actions/defaults/booleans.js +0 -52
  952. package/dist/interactions/actions/defaults/booleans.js.map +0 -1
  953. package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
  954. package/dist/interactions/actions/defaults/clone.js +0 -91
  955. package/dist/interactions/actions/defaults/clone.js.map +0 -1
  956. package/dist/interactions/actions/defaults/createOutlines.js +0 -47
  957. package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
  958. package/dist/interactions/actions/defaults/distribute.js.map +0 -1
  959. package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
  960. package/dist/interactions/actions/defaults/flip.js +0 -125
  961. package/dist/interactions/actions/defaults/flip.js.map +0 -1
  962. package/dist/interactions/actions/defaults/insert.js +0 -287
  963. package/dist/interactions/actions/defaults/insert.js.map +0 -1
  964. package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
  965. package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
  966. package/dist/interactions/actions/defaults/move.js +0 -778
  967. package/dist/interactions/actions/defaults/move.js.map +0 -1
  968. package/dist/interactions/actions/defaults/resize.js +0 -341
  969. package/dist/interactions/actions/defaults/resize.js.map +0 -1
  970. package/dist/interactions/actions/defaults/rotate.js +0 -185
  971. package/dist/interactions/actions/defaults/rotate.js.map +0 -1
  972. package/dist/interactions/actions/previewOverrides.js +0 -25
  973. package/dist/interactions/actions/previewOverrides.js.map +0 -1
  974. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
  975. package/dist/math-J-ACHyEg.d.ts +0 -159
  976. package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
  977. package/dist/renderer/DrawCommand.js +0 -6
  978. package/dist/renderer/DrawCommand.js.map +0 -1
  979. package/dist/renderer/WeaselRenderer.js +0 -333
  980. package/dist/renderer/WeaselRenderer.js.map +0 -1
  981. package/dist/renderer/batchClip.js +0 -46
  982. package/dist/renderer/batchClip.js.map +0 -1
  983. package/dist/renderer/cache/GLImageCache.js +0 -74
  984. package/dist/renderer/cache/GLImageCache.js.map +0 -1
  985. package/dist/renderer/cache/GLMeshCache.js +0 -102
  986. package/dist/renderer/cache/GLMeshCache.js.map +0 -1
  987. package/dist/renderer/cache/GLTextureCache.js +0 -68
  988. package/dist/renderer/cache/GLTextureCache.js.map +0 -1
  989. package/dist/renderer/cache/GradientRampAtlas.js +0 -82
  990. package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
  991. package/dist/renderer/cache/cache.js +0 -13
  992. package/dist/renderer/cache/cache.js.map +0 -1
  993. package/dist/renderer/cache/markerCommandCache.js +0 -63
  994. package/dist/renderer/cache/markerCommandCache.js.map +0 -1
  995. package/dist/renderer/cache/outlineMeshCache.js +0 -15
  996. package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
  997. package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
  998. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
  999. package/dist/renderer/cache/strokeMeshCache.js +0 -55
  1000. package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
  1001. package/dist/renderer/cullDrawCommands.js +0 -90
  1002. package/dist/renderer/cullDrawCommands.js.map +0 -1
  1003. package/dist/renderer/draw/batch.js +0 -133
  1004. package/dist/renderer/draw/batch.js.map +0 -1
  1005. package/dist/renderer/draw/clip.js +0 -89
  1006. package/dist/renderer/draw/clip.js.map +0 -1
  1007. package/dist/renderer/draw/customShader.js +0 -230
  1008. package/dist/renderer/draw/customShader.js.map +0 -1
  1009. package/dist/renderer/draw/drawTriangles.js +0 -8
  1010. package/dist/renderer/draw/drawTriangles.js.map +0 -1
  1011. package/dist/renderer/draw/effects.js +0 -28
  1012. package/dist/renderer/draw/effects.js.map +0 -1
  1013. package/dist/renderer/draw/flushBatch.js +0 -35
  1014. package/dist/renderer/draw/flushBatch.js.map +0 -1
  1015. package/dist/renderer/draw/gradient.js +0 -90
  1016. package/dist/renderer/draw/gradient.js.map +0 -1
  1017. package/dist/renderer/draw/image.js +0 -38
  1018. package/dist/renderer/draw/image.js.map +0 -1
  1019. package/dist/renderer/draw/mesh.js +0 -16
  1020. package/dist/renderer/draw/mesh.js.map +0 -1
  1021. package/dist/renderer/draw/paintBind.js +0 -70
  1022. package/dist/renderer/draw/paintBind.js.map +0 -1
  1023. package/dist/renderer/draw/pathPaint.js +0 -142
  1024. package/dist/renderer/draw/pathPaint.js.map +0 -1
  1025. package/dist/renderer/draw/scratchPass.js +0 -83
  1026. package/dist/renderer/draw/scratchPass.js.map +0 -1
  1027. package/dist/renderer/draw/stencil.js +0 -28
  1028. package/dist/renderer/draw/stencil.js.map +0 -1
  1029. package/dist/renderer/draw/text.js +0 -167
  1030. package/dist/renderer/draw/text.js.map +0 -1
  1031. package/dist/renderer/draw/uniforms.js +0 -77
  1032. package/dist/renderer/draw/uniforms.js.map +0 -1
  1033. package/dist/renderer/draw.js +0 -79
  1034. package/dist/renderer/draw.js.map +0 -1
  1035. package/dist/renderer/drawBatch.js +0 -198
  1036. package/dist/renderer/drawBatch.js.map +0 -1
  1037. package/dist/renderer/effects/EffectTargets.js +0 -48
  1038. package/dist/renderer/effects/EffectTargets.js.map +0 -1
  1039. package/dist/renderer/effects/builtins.js +0 -31
  1040. package/dist/renderer/effects/builtins.js.map +0 -1
  1041. package/dist/renderer/effects/composite.js +0 -11
  1042. package/dist/renderer/effects/composite.js.map +0 -1
  1043. package/dist/renderer/effects/effectPrelude.js +0 -10
  1044. package/dist/renderer/effects/effectPrelude.js.map +0 -1
  1045. package/dist/renderer/effects/types.js +0 -10
  1046. package/dist/renderer/effects/types.js.map +0 -1
  1047. package/dist/renderer/glyphOutlineMesh.js +0 -67
  1048. package/dist/renderer/glyphOutlineMesh.js.map +0 -1
  1049. package/dist/renderer/index.js +0 -20
  1050. package/dist/renderer/math/color.js +0 -321
  1051. package/dist/renderer/math/color.js.map +0 -1
  1052. package/dist/renderer/math/mat3.js +0 -80
  1053. package/dist/renderer/math/mat3.js.map +0 -1
  1054. package/dist/renderer/math/patternSpace.js +0 -22
  1055. package/dist/renderer/math/patternSpace.js.map +0 -1
  1056. package/dist/renderer/math/viewToMat3.js +0 -19
  1057. package/dist/renderer/math/viewToMat3.js.map +0 -1
  1058. package/dist/renderer/paintResources.js +0 -18
  1059. package/dist/renderer/paintResources.js.map +0 -1
  1060. package/dist/renderer/paintScratch.js +0 -37
  1061. package/dist/renderer/paintScratch.js.map +0 -1
  1062. package/dist/renderer/shaders/ShaderProgram.js +0 -74
  1063. package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
  1064. package/dist/renderer/shaders/batchFill.js +0 -119
  1065. package/dist/renderer/shaders/batchFill.js.map +0 -1
  1066. package/dist/renderer/shaders/customPrelude.js +0 -34
  1067. package/dist/renderer/shaders/customPrelude.js.map +0 -1
  1068. package/dist/renderer/shaders/extractUniformNames.js +0 -184
  1069. package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
  1070. package/dist/renderer/shaders/glyphPaint.js +0 -61
  1071. package/dist/renderer/shaders/glyphPaint.js.map +0 -1
  1072. package/dist/renderer/shaders/gradFill.js +0 -31
  1073. package/dist/renderer/shaders/gradFill.js.map +0 -1
  1074. package/dist/renderer/shaders/pathFill.js +0 -14
  1075. package/dist/renderer/shaders/pathFill.js.map +0 -1
  1076. package/dist/renderer/shaders/patternFill.js +0 -25
  1077. package/dist/renderer/shaders/patternFill.js.map +0 -1
  1078. package/dist/renderer/shaders/registerProgram.js +0 -18
  1079. package/dist/renderer/shaders/registerProgram.js.map +0 -1
  1080. package/dist/renderer/spriteSheet.js +0 -14
  1081. package/dist/renderer/spriteSheet.js.map +0 -1
  1082. package/dist/renderer/state/GroupState.js +0 -77
  1083. package/dist/renderer/state/GroupState.js.map +0 -1
  1084. package/dist/renderer/strokeLengths.js +0 -50
  1085. package/dist/renderer/strokeLengths.js.map +0 -1
  1086. package/dist/renderer/syntheticItalic.js +0 -6
  1087. package/dist/renderer/syntheticItalic.js.map +0 -1
  1088. package/dist/renderer/textures/registerTexture.js +0 -34
  1089. package/dist/renderer/textures/registerTexture.js.map +0 -1
  1090. package/dist/scheduling/useVisibleRaf.js +0 -69
  1091. package/dist/scheduling/useVisibleRaf.js.map +0 -1
  1092. package/dist/test-seams-DM2B87-g.d.ts +0 -356
@@ -1 +1 @@
1
- {"version":3,"file":"StandardActionsRegistrar.js","names":["_Fragment","StandardActionsRegistrar","registry","useActionsRegistry","useEffect","actionsRegistryRef","dispatcher","a","id","getActionRef","decayLoop","useDecayLoop","view","useViewDepSource","currentViewRef","onViewChange","viewportRecenter","el","canvasRef","viewAnimation","layerIsPainted","useStandardActions","scene","excludeActions","useDepSource","pointer","usePointerContext","useViewportActions","viewportPanEnabled","viewportZoom","viewportPinchZoom","useAreaSelectDepSource","selection","poseDescriptor","poseComposition","alphaOf","useNodeAtPointDepSource","pickEvery","useLayoutDepSource","layouts","layoutDropTarget","reflowTransition","useLayoutArrivals","useInsertDepSource","adapter","insertNodeFactories","insertPaint","useSliceDepSource","useSnapDepSource","snapPoint","useDebugDepSource","canvasApiRef","useDepChangeNotices","useIngestionDepSource","ingestionResolveSrc","ingestionSvg","ingestionClipboard","useLassoSelectDepSource","useTextEditDepSource","useEditAnchorsDepSource","editAnchorsExternalState","useDispatcherDepSource","usePoseDescriptorDepSource","usePoseCompositionDepSource","useActionsPropResolver","actions","Fragment","resizeOptions","ResizePolicyRegistrar","geometryProjection","GeometryProjectionRegistrar"],"sources":["../../../src/canvas/SceneCanvas/StandardActionsRegistrar.tsx"],"sourcesContent":["import type { Action, ActionsProp, ActionsRegistry } from '@weasel-js/routing';\nimport type { Dispatcher } from '@weasel-js/routing';\nimport { useActionsRegistry, useDepSource } from '@weasel-js/routing/react';\nimport type { Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport { useDecayLoop } from 'core/viewport/useDecayLoop';\nimport type { ViewAnimationApi } from 'core/viewport/useViewAnimation';\nimport type { View } from 'core/viewport/view';\nimport { usePointerContext } from 'features/pointer/PointerContext';\nimport type { PinchZoomOptions } from 'interactions/actions/defaults/pinchZoom';\nimport type { WheelPanOptions } from 'interactions/actions/defaults/viewportWheelPan';\nimport type { ViewportZoomOptions } from 'interactions/actions/defaults/viewportZoom';\nimport type { ClipboardIngestCtx, SvgIngestOptions } from 'interactions/actions/depSchema';\nimport type { GeometryProjection } from 'interactions/actions/geometryProjection';\nimport type { PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport { useStandardActions } from 'interactions/actions/useStandardActions';\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport { useLayoutArrivals } from '../../layout/arrivals';\nimport type { LayoutDropTargetMode, ReflowTransition } from '../../layout/types';\nimport type { CanvasExtensionApi } from '../canvasExtension';\nimport {\n useAreaSelectDepSource,\n useDebugDepSource,\n useDepChangeNotices,\n useDispatcherDepSource,\n useEditAnchorsDepSource,\n useIngestionDepSource,\n useInsertDepSource,\n useLassoSelectDepSource,\n useLayoutDepSource,\n useNodeAtPointDepSource,\n usePoseCompositionDepSource,\n usePoseDescriptorDepSource,\n useSliceDepSource,\n useSnapDepSource,\n useTextEditDepSource,\n useViewDepSource,\n type InsertNodeFactory,\n type InsertPaint\n} from '../deps';\nimport { GeometryProjectionRegistrar, ResizePolicyRegistrar } from './poseRegistrars';\nimport type { BridgeAdapter, SceneCanvasProps } from './props';\nimport { useActionsPropResolver } from './useActionsPropResolver';\nimport { useViewportActions } from './useViewportActions';\n\n/**\n * Registers the kit's default action set into this canvas's input scope.\n *\n * For `delete`, `duplicate`, `group`, and `ungroup` the descriptor's\n * invoker is a stub (those deps aren't in `DepSchema` yet — Phase 4 T8\n * TODO). This component registers legacy bridge overrides for them so the\n * consumer-facing `run` path is functional. The overrides land after the\n * descriptor registrations (last-writer-wins) and use the same id, so the\n * dispatcher and keybinding system see a real `run` body.\n */\nexport function StandardActionsRegistrar({\n selection,\n scene,\n adapter,\n actions,\n excludeActions,\n currentViewRef,\n onViewChange,\n resizeOptions,\n poseDescriptor,\n geometryProjection,\n dispatcher,\n getActionRef,\n pickEvery,\n layerIsPainted,\n alphaOf,\n viewportPanEnabled,\n viewportZoom,\n viewportPinchZoom,\n viewportRecenter,\n viewAnimation,\n editAnchorsExternalState,\n anchorEditingAllowed,\n poseComposition,\n layouts,\n layoutDropTarget,\n reflowTransition,\n insertNodeFactories,\n insertPaint,\n snapPoint,\n canvasRef,\n canvasApiRef,\n ingestionResolveSrc,\n ingestionSvg,\n ingestionClipboard,\n actionsRegistryRef,\n}: {\n selection: SelectionApi;\n scene: Scene<unknown, string, unknown>;\n adapter: BridgeAdapter;\n actionDefaults?: SceneCanvasProps<unknown, string, unknown>['actionDefaults'];\n actions?: ActionsProp;\n /** Kit-standard action ids this canvas's presets and tools leave out. */\n excludeActions: readonly string[];\n currentViewRef: React.RefObject<View>;\n onViewChange: (v: View) => void;\n /** Forwarded from `selectTool.resize` — wires the `resizePolicy` dep\n * consumed by the dispatcher-path `resizeAction`. The legacy\n * `useResizeTool` consumes the same options separately (both paths run\n * in parallel during the dispatcher migration). */\n resizeOptions?: UseResizeOptions<unknown>;\n /** Forwarded from `SceneCanvasProps.poseDescriptor` — wires the\n * `poseDescriptor` dep every built-in pose-touching action reads. */\n poseDescriptor: PoseDescriptor<unknown>;\n /** Forwarded from `SceneCanvasProps.geometryProjection` — wires the\n * `geometryProjection` dep consumed by pose-transform actions (move,\n * resize, nudge, flip). Conditionally mounted so absent → dep undefined. */\n geometryProjection?: GeometryProjection;\n /** Forwarded so `cancelGestureAction` and other actions that need to\n * abort in-flight handles can read the dispatcher's control surface. */\n dispatcher: Dispatcher;\n /** Ref populated with a live action-lookup function so the dispatcher's\n * `getAction` closure can resolve action ids after the registry is\n * mounted. Set on first render; cleared on unmount. */\n getActionRef: React.MutableRefObject<((id: string) => Action | undefined) | null>;\n /** World-space picker forwarded so the `nodeAtPoint` dep source can\n * reuse the same hit-test plumbing the tool dispatcher uses. */\n pickEvery: (worldX: number, worldY: number) => string[];\n /** This canvas's own view gate for scene layers, published on the `view`\n * dep and read by the selecting actions. Absent when it hides nothing. */\n layerIsPainted?: (layerId: string) => boolean;\n /** The composed paint alpha, when the consumer fades anything, so a region\n * select passes over what is painted at zero. */\n alphaOf?: (id: string) => number;\n /** Resolved `viewport.pan` flag — default true, false to disable. */\n viewportPanEnabled: boolean | WheelPanOptions;\n /** Resolved `viewport.zoom` setting — `true` (default Cmd+wheel zoom),\n * `false` (disabled), or a {@link ViewportZoomOptions} config. */\n viewportZoom: boolean | ViewportZoomOptions;\n /** Resolved `viewport.pinchZoom` setting — `true` (default two-finger pinch),\n * `false` (disabled), or a {@link PinchZoomOptions} scale clamp. */\n viewportPinchZoom: boolean | PinchZoomOptions;\n /** Optional recenter callback. When supplied, wires through to the\n * `view` dep so `viewport.zoom` reset (Cmd-0) calls it instead of\n * snapping to identity. A returned `View` is a target the kit may\n * animate to; `void` means the callback dispatched it itself. */\n viewportRecenter?: () => View | void;\n /** The canvas's camera runner, published on the `view` dep so\n * `viewport.zoom`'s discrete branches can animate. */\n viewAnimation: ViewAnimationApi;\n /** Lifted edit-mode state so the `pathEditingOverlay` chrome (rendered\n * outside this subtree) can read the same `editingId` the dep does. */\n editAnchorsExternalState: import('../deps/editAnchors').EditAnchorsStateRef;\n /** Present only when a mode registry is wired (`modes`); see\n * `EditAnchorsDepOptions.anchorEditingAllowed` for why absence — not a\n * predicate over an empty capability set — is the safe default. */\n anchorEditingAllowed?: () => boolean;\n /** Forwarded from `SceneCanvasProps` so the `layout` dep source can wire\n * the per-container layout strategy lookup consumed by `moveAction`. */\n layouts?: SceneCanvasProps<unknown, string, unknown>['layouts'];\n layoutDropTarget?: LayoutDropTargetMode;\n reflowTransition?: ReflowTransition<unknown> | null;\n /** Forwarded from `SceneCanvasProps` so the marquee and lasso dep sources\n * test where a node is drawn rather than where its pose is stored. */\n poseComposition?: SceneCanvasProps<unknown, string, unknown>['poseComposition'];\n /** Forwarded from `SceneCanvasProps` so `useInsertDepSource` can wire the\n * consumer's per-kind node factories into the `insert` dep. */\n insertNodeFactories?: Record<string, InsertNodeFactory>;\n insertPaint?: InsertPaint;\n /** Forwarded from `SceneCanvasProps.toolOptions.snapPoint` so the `snap`\n * dep source can expose grid snapping to `insertAction`. */\n snapPoint?: (p: { x: number; y: number }) => { x: number; y: number };\n /** The canvas element ref, so `useIngestionDepSource` can compute the\n * visible world rect from the client rect + current view. */\n canvasRef: React.RefObject<HTMLElement | null>;\n /** The canvas handle, whose debug sink backs the `debug` dep. */\n canvasApiRef: React.RefObject<CanvasExtensionApi | null>;\n /** Forwarded from `SceneCanvasProps.ingestion.resolveSrc` — consumer\n * file→src override for the kit image handler. */\n ingestionResolveSrc?: (file: File) => Promise<string>;\n /** Forwarded from `SceneCanvasProps.ingestion.svg` — kit SVG-handler\n * options (`unpack`). */\n ingestionSvg?: SvgIngestOptions;\n /** Clipboard-paste ctx (this canvas's adapter + the consumer's reviver)\n * for the kit weasel-JSON handler — built in SceneCanvasInner where the\n * typed adapter is in scope; absent when disabled. */\n ingestionClipboard?: ClipboardIngestCtx;\n /** Populated with the live registry so `CanvasExtensionApi.ingest`\n * (assembled in SceneCanvasInner, OUTSIDE the actions provider) can call\n * `registry.trigger('ingest', …)`. Cleared on unmount. */\n actionsRegistryRef: React.MutableRefObject<ActionsRegistry | null>;\n}) {\n const registry = useActionsRegistry();\n\n // Stash the registry for SceneCanvasInner's imperative `ingest` handle.\n useEffect(() => {\n actionsRegistryRef.current = registry;\n return () => { actionsRegistryRef.current = null; };\n }, [registry, actionsRegistryRef]);\n\n // Wire the dispatcher into the registry so registry.begin() can delegate\n // to dispatcher.beginUiOngoing() for UI-driven ongoing actions (color,\n // opacity).\n useEffect(() => {\n if (!registry) return;\n return registry.setDispatcher(dispatcher);\n }, [registry, dispatcher]);\n\n // Populate the action-lookup ref so the dispatcher's getAction closure\n // can resolve action ids once the registry is in scope.\n useEffect(() => {\n if (!registry) return;\n getActionRef.current = (id: string) => registry.list().find((a) => a.id === id);\n return () => { getActionRef.current = null; };\n }, [registry, getActionRef]);\n\n // Momentum for `viewport.dragPan`. The loop must be a hook (it owns a\n // `useVisibleRaf`), so it is built here and republished on the view dep.\n const decayLoop = useDecayLoop();\n\n // Build the ViewApi (stable identity, refreshed closures) and hand it to\n // useStandardActions (which publishes the `view` dep along with selection,\n // scene, history, pointer, activeTool). `hostSize` reads the live canvas\n // element so keyboard zoom (Cmd+=/-) can anchor at the visible center.\n const view = useViewDepSource(\n currentViewRef,\n onViewChange,\n viewportRecenter,\n () => {\n const el = canvasRef.current;\n return el ? { width: el.clientWidth, height: el.clientHeight } : null;\n },\n viewAnimation,\n decayLoop,\n layerIsPainted,\n );\n useStandardActions({ selection, scene, view, history: scene.history, exclude: excludeActions });\n // A view overlays `view` with its own camera; this name it leaves alone.\n useDepSource('rootView', () => view);\n const pointer = usePointerContext();\n useDepSource('pointer', () => pointer ?? undefined);\n\n // viewport.pan / viewport.zoom are SceneCanvas-coupled (need the `view` dep\n // published just above), so they're registered here rather than in\n // KIT_STANDARD_DESCRIPTORS. Both default ON; consumer opts out via\n // `viewport={{ pan: false }}` / `viewport={{ zoom: false }}`.\n useViewportActions({ pan: viewportPanEnabled, zoom: viewportZoom, pinchZoom: viewportPinchZoom });\n\n // Per-dep wiring modules under `src/canvas/deps/`. See each file for the\n // dep's contract and trade-offs.\n useAreaSelectDepSource(scene, selection, poseDescriptor, poseComposition, alphaOf);\n useNodeAtPointDepSource(pickEvery);\n useLayoutDepSource(scene, layouts, layoutDropTarget, reflowTransition);\n useLayoutArrivals(scene, { layouts, poseDescriptor, poseComposition });\n useInsertDepSource(scene, adapter, insertNodeFactories, insertPaint);\n useSliceDepSource(scene, selection, adapter, poseComposition, poseDescriptor);\n useSnapDepSource(snapPoint);\n useDebugDepSource(canvasApiRef);\n useDepChangeNotices(scene, selection.current);\n useIngestionDepSource(canvasRef, () => currentViewRef.current, ingestionResolveSrc, ingestionSvg, ingestionClipboard);\n useLassoSelectDepSource(scene, selection, poseDescriptor, poseComposition, alphaOf);\n useTextEditDepSource(scene);\n useEditAnchorsDepSource(scene, selection, adapter, editAnchorsExternalState, {\n anchorEditingAllowed,\n });\n useDispatcherDepSource(dispatcher);\n usePoseDescriptorDepSource(poseDescriptor);\n usePoseCompositionDepSource(poseComposition);\n\n // Keyed on the exclusion too: a re-registration of the standard set would\n // otherwise land over the overrides applied on top of it.\n useActionsPropResolver(actions, excludeActions.join('|'));\n\n // Gate the `resizePolicy` dep registration on the consumer having\n // passed `selectTool.resize`. When absent, consumers wire it via a child\n // component (see PointSnapDemo / GroupsDemo). Registering empty defaults\n // here would race with child-component registrations — React runs child\n // effects before parent effects, so the parent's empty default would\n // overwrite the child's real value. The conditional mount avoids that.\n //\n // Same pattern for `geometryProjection`: only mount when the consumer\n // passed the prop so absent → dep undefined → actions stay pose-only.\n return (\n <>\n {resizeOptions ? <ResizePolicyRegistrar options={resizeOptions} /> : null}\n {geometryProjection ? <GeometryProjectionRegistrar projection={geometryProjection} /> : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAyDA,SAAgBC,EAAyB,EACvC,cACA,UACA,YACA,YACA,mBACA,mBACA,iBACA,kBACA,mBACA,uBACA,eACA,iBACA,cACA,oBACA,YACA,uBACA,iBACA,sBACA,qBACA,kBACA,6BACA,yBACA,oBACA,YACA,qBACA,sBACA,yBACA,iBACA,eACA,cACA,iBACA,yBACA,kBACA,wBACA,yBAgGC;CACD,IAAMC,IAAWC,EAAmB;CAkBpC,AAfAC,SACE,EAAmB,UAAUF,SAChB;EAAE,EAAmB,UAAU;CAAM,IACjD,CAACA,GAAUG,CAAkB,CAAC,GAKjCD,QAAgB;EACd,IAAKF,GACL,OAAOA,EAAS,cAAcI,CAAU;CAC1C,GAAG,CAACJ,GAAUI,CAAU,CAAC,GAIzBF,QAAgB;EACd,IAAKF,GAEL,OADA,EAAa,WAAW,MAAeA,EAAS,KAAK,CAAC,CAAC,MAAM,MAAMK,EAAE,OAAOC,CAAE,SACjE;GAAE,EAAa,UAAU;EAAM;CAC9C,GAAG,CAACN,GAAUO,CAAY,CAAC;CAI3B,IAAMC,KAAYC,EAAa,GAMzBC,IAAOC,EACXC,GACAC,GACAC,SACM;EACJ,IAAMC,IAAKC,EAAU;EACrB,OAAOD,IAAK;GAAE,OAAOA,EAAG;GAAa,QAAQA,EAAG;EAAa,IAAI;CACnE,GACAE,GACAT,IACAU,EACF;CAGA,AAFAC,EAAmB;EAAE;EAAW;EAAO;EAAM,SAASC,EAAM;EAAS,SAASC;CAAe,CAAC,GAE9FC,EAAa,kBAAkBZ,CAAI;CACnC,IAAMa,KAAUC,EAAkB;CA2ClC,OA1CAF,EAAa,iBAAiBC,MAAW,KAAA,CAAS,GAMlDE,EAAmB;EAAE,KAAKC;EAAoB,MAAMC;EAAc,WAAWC;CAAkB,CAAC,GAIhGC,EAAuBT,GAAOU,GAAWC,GAAgBC,GAAiBC,CAAO,GACjFC,EAAwBC,CAAS,GACjCC,GAAmBhB,GAAOiB,GAASC,GAAkBC,EAAgB,GACrEC,EAAkBpB,GAAO;EAAE;EAAS;EAAgB;CAAgB,CAAC,GACrEqB,EAAmBrB,GAAOsB,GAASC,IAAqBC,EAAW,GACnEC,EAAkBzB,GAAOU,GAAWY,GAASV,GAAiBD,CAAc,GAC5Ee,EAAiBC,EAAS,GAC1BC,EAAkBC,CAAY,GAC9BC,EAAoB9B,GAAOU,EAAU,OAAO,GAC5CqB,GAAsBnC,SAAiBJ,EAAe,SAASwC,IAAqBC,IAAcC,EAAkB,GACpHC,EAAwBnC,GAAOU,GAAWC,GAAgBC,GAAiBC,CAAO,GAClFuB,EAAqBpC,CAAK,GAC1BqC,EAAwBrC,GAAOU,GAAWY,GAASgB,GAA0B,EAC3E,wBACF,CAAC,GACDC,EAAuBvD,CAAU,GACjCwD,EAA2B7B,CAAc,GACzC8B,EAA4B7B,CAAe,GAI3C8B,GAAuBC,GAAS1C,EAAe,KAAK,GAAG,CAAC,GAYtD,kBAAAvB,GAAA,EAAA,UAAA,CACGmE,IAAgB,kBAACC,IAAD,EAAuB,SAASD,EAAgB,CAAA,IAAI,MACpEE,IAAqB,kBAACC,IAAD,EAA6B,YAAYD,EAAqB,CAAA,IAAI,IACxF,EAAA,CAAA;AAEN"}
1
+ {"version":3,"file":"StandardActionsRegistrar.js","names":["_Fragment","StandardActionsRegistrar","registry","useActionsRegistry","useEffect","actionsRegistryRef","dispatcher","a","id","getActionRef","decayLoop","useDecayLoop","view","useViewDepSource","currentViewRef","onViewChange","viewportRecenter","el","canvasRef","viewAnimation","layerIsPainted","useStandardActions","scene","excludeActions","useDepSource","pointer","usePointerContext","useViewportActions","viewportPanEnabled","viewportZoom","viewportPinchZoom","useAreaSelectDepSource","selection","poseDescriptor","alphaOf","useNodeAtPointDepSource","pickEvery","useLayoutDepSource","layouts","layoutDropTarget","reflowTransition","useLayoutArrivals","useInsertDepSource","adapter","insertNodeFactories","insertPaint","useSliceDepSource","useSnapDepSource","snapPoint","useDebugDepSource","canvasApiRef","useDepChangeNotices","useIngestionDepSource","ingestionResolveSrc","ingestionSvg","ingestionClipboard","useLassoSelectDepSource","useTextEditDepSource","useEditAnchorsDepSource","editAnchorsExternalState","useDispatcherDepSource","usePoseDescriptorDepSource","useActionsPropResolver","actions","Fragment","resizeOptions","ResizePolicyRegistrar","geometryProjection","GeometryProjectionRegistrar"],"sources":["../../../src/canvas/SceneCanvas/StandardActionsRegistrar.tsx"],"sourcesContent":["import type { Action, ActionsProp, ActionsRegistry } from '@weasel-js/routing';\nimport type { Dispatcher } from '@weasel-js/routing';\nimport { useActionsRegistry, useDepSource, usePointerContext } from '@weasel-js/routing/react';\nimport type { Scene } from 'core/scene/types';\nimport type { SelectionApi } from 'core/selection/useSelection';\nimport { useDecayLoop } from 'core/viewport/useDecayLoop';\nimport type { ViewAnimationApi } from 'core/viewport/useViewAnimation';\nimport type { View } from 'core/viewport/view';\nimport type { PinchZoomOptions } from 'interactions/actions/defaults/pinchZoom';\nimport type { WheelPanOptions } from 'interactions/actions/defaults/viewportWheelPan';\nimport type { ViewportZoomOptions } from 'interactions/actions/defaults/viewportZoom';\nimport type { ClipboardIngestCtx, SvgIngestOptions } from 'interactions/actions/depSchema';\nimport type { GeometryProjection } from 'interactions/actions/geometryProjection';\nimport type { PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport { useStandardActions } from 'interactions/actions/useStandardActions';\nimport type React from 'react';\nimport { useEffect } from 'react';\nimport { useLayoutArrivals } from '../../layout/arrivals';\nimport type { LayoutDropTargetMode, ReflowTransition } from '../../layout/types';\nimport type { CanvasExtensionApi } from '../canvasExtension';\nimport {\n useAreaSelectDepSource,\n useDebugDepSource,\n useDepChangeNotices,\n useDispatcherDepSource,\n useEditAnchorsDepSource,\n useIngestionDepSource,\n useInsertDepSource,\n useLassoSelectDepSource,\n useLayoutDepSource,\n useNodeAtPointDepSource,\n usePoseDescriptorDepSource,\n useSliceDepSource,\n useSnapDepSource,\n useTextEditDepSource,\n useViewDepSource,\n type InsertNodeFactory,\n type InsertPaint\n} from '../deps';\nimport { GeometryProjectionRegistrar, ResizePolicyRegistrar } from './poseRegistrars';\nimport type { BridgeAdapter, SceneCanvasProps } from './props';\nimport { useActionsPropResolver } from './useActionsPropResolver';\nimport { useViewportActions } from './useViewportActions';\n\n/**\n * Registers the kit's default action set into this canvas's input scope.\n *\n * For `delete`, `duplicate`, `group`, and `ungroup` the descriptor's\n * invoker is a stub (those deps aren't in `DepSchema` yet — Phase 4 T8\n * TODO). This component registers legacy bridge overrides for them so the\n * consumer-facing `run` path is functional. The overrides land after the\n * descriptor registrations (last-writer-wins) and use the same id, so the\n * dispatcher and keybinding system see a real `run` body.\n */\nexport function StandardActionsRegistrar({\n selection,\n scene,\n adapter,\n actions,\n excludeActions,\n currentViewRef,\n onViewChange,\n resizeOptions,\n poseDescriptor,\n geometryProjection,\n dispatcher,\n getActionRef,\n pickEvery,\n layerIsPainted,\n alphaOf,\n viewportPanEnabled,\n viewportZoom,\n viewportPinchZoom,\n viewportRecenter,\n viewAnimation,\n editAnchorsExternalState,\n layouts,\n layoutDropTarget,\n reflowTransition,\n insertNodeFactories,\n insertPaint,\n snapPoint,\n canvasRef,\n canvasApiRef,\n ingestionResolveSrc,\n ingestionSvg,\n ingestionClipboard,\n actionsRegistryRef,\n}: {\n selection: SelectionApi;\n scene: Scene<unknown, string, unknown>;\n adapter: BridgeAdapter;\n actions?: ActionsProp;\n /** Kit-standard action ids this canvas's presets and tools leave out. */\n excludeActions: readonly string[];\n currentViewRef: React.RefObject<View>;\n onViewChange: (v: View) => void;\n /** Forwarded from `selectTool.resize` — wires the `resizePolicy` dep\n * consumed by the dispatcher-path `resizeAction`. The legacy\n * `useResizeTool` consumes the same options separately (both paths run\n * in parallel during the dispatcher migration). */\n resizeOptions?: UseResizeOptions<unknown>;\n /** Forwarded from `SceneCanvasProps.poseDescriptor` — wires the\n * `poseDescriptor` dep every built-in pose-touching action reads. */\n poseDescriptor: PoseDescriptor<unknown>;\n /** Forwarded from `SceneCanvasProps.geometryProjection` — wires the\n * `geometryProjection` dep consumed by pose-transform actions (move,\n * resize, nudge, flip). Conditionally mounted so absent → dep undefined. */\n geometryProjection?: GeometryProjection;\n /** Forwarded so `cancelGestureAction` and other actions that need to\n * abort in-flight handles can read the dispatcher's control surface. */\n dispatcher: Dispatcher;\n /** Ref populated with a live action-lookup function so the dispatcher's\n * `getAction` closure can resolve action ids after the registry is\n * mounted. Set on first render; cleared on unmount. */\n getActionRef: React.MutableRefObject<((id: string) => Action | undefined) | null>;\n /** World-space picker forwarded so the `nodeAtPoint` dep source can\n * reuse the same hit-test plumbing the tool dispatcher uses. */\n pickEvery: (worldX: number, worldY: number) => string[];\n /** This canvas's own view gate for scene layers, published on the `view`\n * dep and read by the selecting actions. Absent when it hides nothing. */\n layerIsPainted?: (layerId: string) => boolean;\n /** The composed paint alpha, when the consumer fades anything, so a region\n * select passes over what is painted at zero. */\n alphaOf?: (id: string) => number;\n /** Resolved `viewport.pan` flag — default true, false to disable. */\n viewportPanEnabled: boolean | WheelPanOptions;\n /** Resolved `viewport.zoom` setting — `true` (default Cmd+wheel zoom),\n * `false` (disabled), or a {@link ViewportZoomOptions} config. */\n viewportZoom: boolean | ViewportZoomOptions;\n /** Resolved `viewport.pinchZoom` setting — `true` (default two-finger pinch),\n * `false` (disabled), or a {@link PinchZoomOptions} scale clamp. */\n viewportPinchZoom: boolean | PinchZoomOptions;\n /** Optional recenter callback. When supplied, wires through to the\n * `view` dep so `viewport.zoom` reset (Cmd-0) calls it instead of\n * snapping to identity. A returned `View` is a target the kit may\n * animate to; `void` means the callback dispatched it itself. */\n viewportRecenter?: () => View | void;\n /** The canvas's camera runner, published on the `view` dep so\n * `viewport.zoom`'s discrete branches can animate. */\n viewAnimation: ViewAnimationApi;\n /** Lifted edit-mode state so the `pathEditingOverlay` chrome (rendered\n * outside this subtree) can read the same `editingId` the dep does. */\n editAnchorsExternalState: import('../deps/editAnchors').EditAnchorsStateRef;\n /** Forwarded from `SceneCanvasProps` so the `layout` dep source can wire\n * the per-container layout strategy lookup consumed by `moveAction`. */\n layouts?: SceneCanvasProps<unknown, string, unknown>['layouts'];\n layoutDropTarget?: LayoutDropTargetMode;\n reflowTransition?: ReflowTransition<unknown> | null;\n /** Forwarded from `SceneCanvasProps` so `useInsertDepSource` can wire the\n * consumer's per-kind node factories into the `insert` dep. */\n insertNodeFactories?: Record<string, InsertNodeFactory>;\n insertPaint?: InsertPaint;\n /** Forwarded from `SceneCanvasProps.toolOptions.snapPoint` so the `snap`\n * dep source can expose grid snapping to `insertAction`. */\n snapPoint?: (p: { x: number; y: number }) => { x: number; y: number };\n /** The canvas element ref, so `useIngestionDepSource` can compute the\n * visible world rect from the client rect + current view. */\n canvasRef: React.RefObject<HTMLElement | null>;\n /** The canvas handle, whose debug sink backs the `debug` dep. */\n canvasApiRef: React.RefObject<CanvasExtensionApi | null>;\n /** Forwarded from `SceneCanvasProps.ingestion.resolveSrc` — consumer\n * file→src override for the kit image handler. */\n ingestionResolveSrc?: (file: File) => Promise<string>;\n /** Forwarded from `SceneCanvasProps.ingestion.svg` — kit SVG-handler\n * options (`unpack`). */\n ingestionSvg?: SvgIngestOptions;\n /** Clipboard-paste ctx (this canvas's adapter + the consumer's reviver)\n * for the kit weasel-JSON handler, from `useCanvasIngestion`; absent\n * when disabled. */\n ingestionClipboard?: ClipboardIngestCtx;\n /** Populated with the live registry so `CanvasExtensionApi.ingest`\n * (assembled in SceneCanvasInner, OUTSIDE the actions provider) can call\n * `registry.trigger('ingest', …)`. Cleared on unmount. */\n actionsRegistryRef: React.MutableRefObject<ActionsRegistry | null>;\n}) {\n const registry = useActionsRegistry();\n\n // Stash the registry for SceneCanvasInner's imperative `ingest` handle.\n useEffect(() => {\n actionsRegistryRef.current = registry;\n return () => { actionsRegistryRef.current = null; };\n }, [registry, actionsRegistryRef]);\n\n // Wire the dispatcher into the registry so registry.begin() can delegate\n // to dispatcher.beginUiOngoing() for UI-driven ongoing actions (color,\n // opacity).\n useEffect(() => {\n if (!registry) return;\n return registry.setDispatcher(dispatcher);\n }, [registry, dispatcher]);\n\n // Populate the action-lookup ref so the dispatcher's getAction closure\n // can resolve action ids once the registry is in scope.\n useEffect(() => {\n if (!registry) return;\n getActionRef.current = (id: string) => registry.list().find((a) => a.id === id);\n return () => { getActionRef.current = null; };\n }, [registry, getActionRef]);\n\n // Momentum for `viewport.dragPan`. The loop must be a hook (it owns a\n // `useVisibleRaf`), so it is built here and republished on the view dep.\n const decayLoop = useDecayLoop();\n\n // Build the ViewApi (stable identity, refreshed closures) and hand it to\n // useStandardActions (which publishes the `view` dep along with selection,\n // scene, history, pointer, activeTool). `hostSize` reads the live canvas\n // element so keyboard zoom (Cmd+=/-) can anchor at the visible center.\n const view = useViewDepSource(\n currentViewRef,\n onViewChange,\n viewportRecenter,\n () => {\n const el = canvasRef.current;\n return el ? { width: el.clientWidth, height: el.clientHeight } : null;\n },\n viewAnimation,\n decayLoop,\n layerIsPainted,\n );\n useStandardActions({ selection, scene, view, history: scene.history, exclude: excludeActions });\n // A view overlays `view` with its own camera; this name it leaves alone.\n useDepSource('rootView', () => view);\n const pointer = usePointerContext();\n useDepSource('pointer', () => pointer ?? undefined);\n\n // viewport.pan / viewport.zoom are SceneCanvas-coupled (need the `view` dep\n // published just above), so they're registered here rather than in\n // KIT_STANDARD_DESCRIPTORS. Both default ON; consumer opts out via\n // `viewport={{ pan: false }}` / `viewport={{ zoom: false }}`.\n useViewportActions({ pan: viewportPanEnabled, zoom: viewportZoom, pinchZoom: viewportPinchZoom });\n\n // Per-dep wiring modules under `src/canvas/deps/`. See each file for the\n // dep's contract and trade-offs.\n useAreaSelectDepSource(scene, selection, poseDescriptor, alphaOf);\n useNodeAtPointDepSource(pickEvery);\n useLayoutDepSource(scene, layouts, layoutDropTarget, reflowTransition);\n useLayoutArrivals(scene, { layouts, poseDescriptor });\n useInsertDepSource(scene, adapter, insertNodeFactories, insertPaint);\n useSliceDepSource(scene, selection, adapter, poseDescriptor);\n useSnapDepSource(snapPoint);\n useDebugDepSource(canvasApiRef);\n useDepChangeNotices(scene, selection.current);\n useIngestionDepSource(canvasRef, () => currentViewRef.current, ingestionResolveSrc, ingestionSvg, ingestionClipboard);\n useLassoSelectDepSource(scene, selection, poseDescriptor, alphaOf);\n useTextEditDepSource(scene);\n useEditAnchorsDepSource(scene, selection, adapter, editAnchorsExternalState);\n useDispatcherDepSource(dispatcher);\n usePoseDescriptorDepSource(poseDescriptor);\n\n // Keyed on the exclusion too: a re-registration of the standard set would\n // otherwise land over the overrides applied on top of it.\n useActionsPropResolver(actions, excludeActions.join('|'));\n\n // Gate the `resizePolicy` dep registration on the consumer having\n // passed `selectTool.resize`. When absent, consumers wire it via a child\n // component (see PointSnapDemo / GroupsDemo). Registering empty defaults\n // here would race with child-component registrations — React runs child\n // effects before parent effects, so the parent's empty default would\n // overwrite the child's real value. The conditional mount avoids that.\n //\n // Same pattern for `geometryProjection`: only mount when the consumer\n // passed the prop so absent → dep undefined → actions stay pose-only.\n return (\n <>\n {resizeOptions ? <ResizePolicyRegistrar options={resizeOptions} /> : null}\n {geometryProjection ? <GeometryProjectionRegistrar projection={geometryProjection} /> : null}\n </>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAuDA,SAAgBC,EAAyB,EACvC,cACA,UACA,YACA,YACA,mBACA,mBACA,iBACA,kBACA,mBACA,uBACA,eACA,iBACA,cACA,oBACA,YACA,uBACA,iBACA,sBACA,qBACA,kBACA,6BACA,YACA,qBACA,qBACA,wBACA,gBACA,eACA,cACA,kBACA,yBACA,kBACA,wBACA,yBAwFC;CACD,IAAMC,IAAWC,EAAmB;CAkBpC,AAfAC,SACE,EAAmB,UAAUF,SAChB;EAAE,EAAmB,UAAU;CAAM,IACjD,CAACA,GAAUG,CAAkB,CAAC,GAKjCD,QAAgB;EACd,IAAKF,GACL,OAAOA,EAAS,cAAcI,CAAU;CAC1C,GAAG,CAACJ,GAAUI,CAAU,CAAC,GAIzBF,QAAgB;EACd,IAAKF,GAEL,OADA,EAAa,WAAW,MAAeA,EAAS,KAAK,CAAC,CAAC,MAAM,MAAMK,EAAE,OAAOC,CAAE,SACjE;GAAE,EAAa,UAAU;EAAM;CAC9C,GAAG,CAACN,GAAUO,CAAY,CAAC;CAI3B,IAAMC,IAAYC,EAAa,GAMzBC,IAAOC,EACXC,GACAC,GACAC,SACM;EACJ,IAAMC,IAAKC,EAAU;EACrB,OAAOD,IAAK;GAAE,OAAOA,EAAG;GAAa,QAAQA,EAAG;EAAa,IAAI;CACnE,GACAE,GACAT,GACAU,EACF;CAGA,AAFAC,EAAmB;EAAE;EAAW;EAAO;EAAM,SAASC,EAAM;EAAS,SAASC;CAAe,CAAC,GAE9FC,EAAa,kBAAkBZ,CAAI;CACnC,IAAMa,KAAUC,EAAkB;CAwClC,OAvCAF,EAAa,iBAAiBC,MAAW,KAAA,CAAS,GAMlDE,GAAmB;EAAE,KAAKC;EAAoB,MAAMC;EAAc,WAAWC;CAAkB,CAAC,GAIhGC,EAAuBT,GAAOU,GAAWC,GAAgBC,CAAO,GAChEC,EAAwBC,CAAS,GACjCC,EAAmBf,GAAOgB,GAASC,GAAkBC,CAAgB,GACrEC,EAAkBnB,GAAO;EAAE;EAAS;CAAe,CAAC,GACpDoB,EAAmBpB,GAAOqB,GAASC,GAAqBC,CAAW,GACnEC,EAAkBxB,GAAOU,GAAWW,GAASV,CAAc,GAC3Dc,EAAiBC,EAAS,GAC1BC,EAAkBC,EAAY,GAC9BC,EAAoB7B,GAAOU,EAAU,OAAO,GAC5CoB,GAAsBlC,SAAiBJ,EAAe,SAASuC,IAAqBC,IAAcC,EAAkB,GACpHC,EAAwBlC,GAAOU,GAAWC,GAAgBC,CAAO,GACjEuB,EAAqBnC,CAAK,GAC1BoC,EAAwBpC,GAAOU,GAAWW,GAASgB,CAAwB,GAC3EC,EAAuBtD,CAAU,GACjCuD,EAA2B5B,CAAc,GAIzC6B,GAAuBC,GAASxC,EAAe,KAAK,GAAG,CAAC,GAYtD,kBAAAvB,GAAA,EAAA,UAAA,CACGiE,IAAgB,kBAACC,IAAD,EAAuB,SAASD,EAAgB,CAAA,IAAI,MACpEE,IAAqB,kBAACC,IAAD,EAA6B,YAAYD,EAAqB,CAAA,IAAI,IACxF,EAAA,CAAA;AAEN"}
@@ -1,13 +1,13 @@
1
1
  import { useKeybindings as e } from "../../tools/useKeybindings.js";
2
2
  import { useContributionRoles as t } from "./useContributionRoles.js";
3
3
  //#region src/canvas/SceneCanvas/ToolKeybindingsMounter.tsx
4
- function n({ internalTools: n, toolsTakeover: r, enableKeybindings: i, isToolEligible: a, canvasApi: o, versionCheck: s }) {
4
+ function n({ internalTools: n, toolsTakeover: r, enableKeybindings: i, modes: a, canvasApi: o, versionCheck: s }) {
5
5
  return e(n, {
6
6
  disable: !!r || !i,
7
- isToolEligible: a
7
+ modes: a
8
8
  }), e(r ?? n, {
9
9
  disable: !r || !i,
10
- isToolEligible: a
10
+ modes: a
11
11
  }), t(r ?? n, o, s), null;
12
12
  }
13
13
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"ToolKeybindingsMounter.js","names":["ToolKeybindingsMounter","useKeybindings","internalTools","toolsTakeover","enableKeybindings","useContributionRoles","canvasApi","versionCheck"],"sources":["../../../src/canvas/SceneCanvas/ToolKeybindingsMounter.tsx"],"sourcesContent":["import { useKeybindings } from 'tools/useKeybindings';\nimport type { ToolsApi } from '../../tools/overlayBinding';\nimport type { CanvasExtensionApi } from '../canvasExtension';\nimport { useContributionRoles, type VersionCheck } from './useContributionRoles';\n\n/**\n * Mounts the gesture dispatcher on this canvas's input scope.\n *\n * Accepts `selectionRef`, `boundsOf`, `pickEvery`, and `viewRef` so\n * it can wire `affordanceAt` + `classifyTarget` thunks into the dispatcher.\n * These thunks convert client coords → world coords via the canvas rect + view,\n * then classify the pointer position against affordances and scene bodies.\n */\n/**\n * Mounts `useKeybindings`, whose `tool.activate` / `tool.offhand` /\n * `tool.resetToDefault` registrations land in this canvas's scope.\n *\n * Two calls, mirroring the pair that used to live in `SceneCanvasInner`: the\n * hook snapshots the initial active tool for Escape-returns-to-default, so\n * the internal and consumer-supplied `ToolsApi` each need their own instance\n * and the hook count has to stay stable across the takeover branch.\n */\nexport function ToolKeybindingsMounter({\n internalTools,\n toolsTakeover,\n enableKeybindings,\n isToolEligible,\n canvasApi,\n versionCheck,\n}: {\n internalTools: ToolsApi;\n toolsTakeover?: ToolsApi;\n enableKeybindings: boolean;\n isToolEligible: (toolId: string) => boolean;\n canvasApi: CanvasExtensionApi | null;\n versionCheck?: VersionCheck;\n}) {\n useKeybindings(internalTools, {\n disable: !!toolsTakeover || !enableKeybindings,\n isToolEligible,\n });\n useKeybindings(toolsTakeover ?? internalTools, {\n disable: !toolsTakeover || !enableKeybindings,\n isToolEligible,\n });\n // Entry-owned roles: actions (polygon.adjustSides, …), deps and `attach`.\n // Same reason this lives here and not in the tool hooks: the hooks run above\n // the provider. Not gated on `enableKeybindings` — these back wheel and\n // pointer bindings too, not just keys.\n useContributionRoles(toolsTakeover ?? internalTools, canvasApi, versionCheck);\n return null;\n}\n"],"mappings":";;;AAsBA,SAAgBA,EAAuB,EACrC,kBACA,kBACA,sBACA,mBACA,cACA,mBAQC;CAcD,OAbAC,EAAeC,GAAe;EAC5B,SAAS,CAAC,CAACC,KAAiB,CAACC;EAC7B;CACF,CAAC,GACDH,EAAeE,KAAiBD,GAAe;EAC7C,SAAS,CAACC,KAAiB,CAACC;EAC5B;CACF,CAAC,GAKDC,EAAqBF,KAAiBD,GAAeI,GAAWC,CAAY,GACrE;AACT"}
1
+ {"version":3,"file":"ToolKeybindingsMounter.js","names":["ToolKeybindingsMounter","useKeybindings","internalTools","toolsTakeover","enableKeybindings","useContributionRoles","canvasApi","versionCheck"],"sources":["../../../src/canvas/SceneCanvas/ToolKeybindingsMounter.tsx"],"sourcesContent":["import type { ModeRegistry } from '@weasel-js/modes';\nimport { useKeybindings } from 'tools/useKeybindings';\nimport type { ToolsApi } from '../../tools/overlayBinding';\nimport type { CanvasExtensionApi } from '../canvasExtension';\nimport { useContributionRoles, type VersionCheck } from './useContributionRoles';\n\n/**\n * Mounts `useKeybindings`, whose `tool.activate` / `tool.offhand` /\n * `tool.resetToDefault` registrations land in this canvas's scope.\n *\n * Two calls: the hook snapshots the initial active tool for\n * Escape-returns-to-default, so the internal and consumer-supplied `ToolsApi`\n * each need their own instance and the hook count has to stay stable across\n * the takeover branch.\n */\nexport function ToolKeybindingsMounter({\n internalTools,\n toolsTakeover,\n enableKeybindings,\n modes,\n canvasApi,\n versionCheck,\n}: {\n internalTools: ToolsApi;\n toolsTakeover?: ToolsApi;\n enableKeybindings: boolean;\n modes?: ModeRegistry;\n canvasApi: CanvasExtensionApi | null;\n versionCheck?: VersionCheck;\n}) {\n useKeybindings(internalTools, {\n disable: !!toolsTakeover || !enableKeybindings,\n modes,\n });\n useKeybindings(toolsTakeover ?? internalTools, {\n disable: !toolsTakeover || !enableKeybindings,\n modes,\n });\n // Entry-owned roles live here and not in the tool hooks because the hooks\n // run above the provider. Not gated on `enableKeybindings` — these back\n // wheel and pointer bindings too, not just keys.\n useContributionRoles(toolsTakeover ?? internalTools, canvasApi, versionCheck);\n return null;\n}\n"],"mappings":";;;AAeA,SAAgBA,EAAuB,EACrC,kBACA,kBACA,sBACA,UACA,cACA,mBAQC;CAaD,OAZAC,EAAeC,GAAe;EAC5B,SAAS,CAAC,CAACC,KAAiB,CAACC;EAC7B;CACF,CAAC,GACDH,EAAeE,KAAiBD,GAAe;EAC7C,SAAS,CAACC,KAAiB,CAACC;EAC5B;CACF,CAAC,GAIDC,EAAqBF,KAAiBD,GAAeI,GAAWC,CAAY,GACrE;AACT"}
@@ -1,10 +1,46 @@
1
1
  import { IS_DEV as e } from "./isDev.js";
2
2
  //#region src/canvas/SceneCanvas/coordTrace.ts
3
3
  var t = 200, n = [], r = e;
4
+ r && typeof window < "u" && (window.__weaselCoordLog__ = n);
4
5
  function i(e) {
5
6
  r && (n.push(e), n.length > t && n.shift());
6
7
  }
8
+ function a(e, t, n, a, o) {
9
+ if (!r) return;
10
+ if (!n || !a) {
11
+ i({
12
+ ts: Date.now(),
13
+ clientX: e,
14
+ clientY: t,
15
+ rect: null,
16
+ view: null,
17
+ world: o,
18
+ fallback: !0
19
+ });
20
+ return;
21
+ }
22
+ let s = n.getBoundingClientRect();
23
+ i({
24
+ ts: Date.now(),
25
+ clientX: e,
26
+ clientY: t,
27
+ rect: {
28
+ left: s.left,
29
+ top: s.top,
30
+ width: s.width,
31
+ height: s.height
32
+ },
33
+ view: {
34
+ x: a.x,
35
+ y: a.y,
36
+ scaleX: a.scale.x,
37
+ scaleY: a.scale.y
38
+ },
39
+ world: o,
40
+ fallback: !1
41
+ });
42
+ }
7
43
  //#endregion
8
- export { r as COORD_DEV, t as COORD_TRACE_LIMIT, n as coordTrace, i as recordCoordTrace };
44
+ export { r as COORD_DEV, t as COORD_TRACE_LIMIT, n as coordTrace, a as traceConversion };
9
45
 
10
46
  //# sourceMappingURL=coordTrace.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"coordTrace.js","names":["COORD_TRACE_LIMIT","coordTrace","COORD_DEV","IS_DEV","recordCoordTrace","entry"],"sources":["../../../src/canvas/SceneCanvas/coordTrace.ts"],"sourcesContent":["import { IS_DEV } from './isDev';\n\n// ---------------------------------------------------------------------------\n// Dev-only coord trace\n// ---------------------------------------------------------------------------\n\n/** Records every `clientToWorld` call so dev tools (and agents) can\n * reconcile cursor coords with computed world coords. Mirrors the\n * dispatcher's trace log. Exposed on `window.__weaselCoordLog__`. */\nexport interface CoordTraceEntry {\n ts: number;\n clientX: number;\n clientY: number;\n rect: { left: number; top: number; width: number; height: number } | null;\n view: { x: number; y: number; scaleX: number; scaleY: number } | null;\n world: { x: number; y: number };\n /** True when canvas/view weren't available and we returned identity. */\n fallback: boolean;\n}\n\nexport const COORD_TRACE_LIMIT = 200;\n\nexport const coordTrace: CoordTraceEntry[] = [];\n\nexport const COORD_DEV: boolean = IS_DEV;\n\nexport function recordCoordTrace(entry: CoordTraceEntry): void {\n if (!COORD_DEV) return;\n coordTrace.push(entry);\n if (coordTrace.length > COORD_TRACE_LIMIT) coordTrace.shift();\n}\n"],"mappings":";;AAoBA,IAAaA,IAAoB,KAEpBC,IAAgC,CAAC,GAEjCC,IAAqBC;AAElC,SAAgBC,EAAiB,GAA8B;CAC7D,AAAKF,MACLD,EAAW,KAAKI,CAAK,GACjBJ,EAAW,SAASD,KAAmBC,EAAW,MAAM;AAC9D"}
1
+ {"version":3,"file":"coordTrace.js","names":["COORD_TRACE_LIMIT","coordTrace","COORD_DEV","IS_DEV","recordCoordTrace","entry","traceConversion","canvas","view","rect"],"sources":["../../../src/canvas/SceneCanvas/coordTrace.ts"],"sourcesContent":["import type { View } from 'core/viewport/view';\nimport { IS_DEV } from './isDev';\n\n// ---------------------------------------------------------------------------\n// Dev-only coord trace\n// ---------------------------------------------------------------------------\n\n/** Records every `clientToWorld` call so dev tools (and agents) can\n * reconcile cursor coords with computed world coords. Mirrors the\n * dispatcher's trace log. Exposed on `window.__weaselCoordLog__`. */\nexport interface CoordTraceEntry {\n ts: number;\n clientX: number;\n clientY: number;\n rect: { left: number; top: number; width: number; height: number } | null;\n view: { x: number; y: number; scaleX: number; scaleY: number } | null;\n world: { x: number; y: number };\n /** True when canvas/view weren't available and we returned identity. */\n fallback: boolean;\n}\n\nexport const COORD_TRACE_LIMIT = 200;\n\nexport const coordTrace: CoordTraceEntry[] = [];\n\nexport const COORD_DEV: boolean = IS_DEV;\n\nif (COORD_DEV && typeof window !== 'undefined') {\n (window as unknown as { __weaselCoordLog__: CoordTraceEntry[] }).__weaselCoordLog__ = coordTrace;\n}\n\nfunction recordCoordTrace(entry: CoordTraceEntry): void {\n if (!COORD_DEV) return;\n coordTrace.push(entry);\n if (coordTrace.length > COORD_TRACE_LIMIT) coordTrace.shift();\n}\n\n/** Record one conversion against the rect and view it was made under. A null\n * `canvas` or a missing `view` records the identity fallback. */\nexport function traceConversion(\n clientX: number,\n clientY: number,\n canvas: HTMLElement | null,\n view: View | null | undefined,\n world: { x: number; y: number },\n): void {\n if (!COORD_DEV) return;\n if (!canvas || !view) {\n recordCoordTrace({ ts: Date.now(), clientX, clientY, rect: null, view: null, world, fallback: true });\n return;\n }\n const rect = canvas.getBoundingClientRect();\n recordCoordTrace({\n ts: Date.now(), clientX, clientY,\n rect: { left: rect.left, top: rect.top, width: rect.width, height: rect.height },\n view: { x: view.x, y: view.y, scaleX: view.scale.x, scaleY: view.scale.y },\n world, fallback: false,\n });\n}\n"],"mappings":";;AAqBA,IAAaA,IAAoB,KAEpBC,IAAgC,CAAC,GAEjCC,IAAqBC;AAE9BD,KAAa,OAAO,SAAW,QACjC,OAAiE,qBAAqBD;AAGxF,SAASG,EAAiB,GAA8B;CACtD,AAAKF,MACLD,EAAW,KAAKI,CAAK,GACjBJ,EAAW,SAASD,KAAmBC,EAAW,MAAM;AAC9D;AAIA,SAAgBK,EACd,GACA,GACA,GACA,GACA,GACM;CACN,IAAI,CAACJ,GAAW;CAChB,IAAI,CAACK,KAAU,CAACC,GAAM;EACpB,EAAiB;GAAE,IAAI,KAAK,IAAI;GAAG;GAAS;GAAS,MAAM;GAAM,MAAM;GAAM;GAAO,UAAU;EAAK,CAAC;EACpG;CACF;CACA,IAAMC,IAAOF,EAAO,sBAAsB;CAC1C,EAAiB;EACf,IAAI,KAAK,IAAI;EAAG;EAAS;EACzB,MAAM;GAAE,MAAME,EAAK;GAAM,KAAKA,EAAK;GAAK,OAAOA,EAAK;GAAO,QAAQA,EAAK;EAAO;EAC/E,MAAM;GAAE,GAAGD,EAAK;GAAG,GAAGA,EAAK;GAAG,QAAQA,EAAK,MAAM;GAAG,QAAQA,EAAK,MAAM;EAAE;EACzE;EAAO,UAAU;CACnB,CAAC;AACH"}
@@ -1,7 +1,7 @@
1
- import { listMarkers as e, markerGeneration as t } from "../../core/strokeMarkers.js";
2
- import { KIT_SHAPE_KINDS as n } from "../../core/shapeKinds.js";
3
- import { inferredNodeRouting as r } from "./defaultNodeRouting.js";
4
- import { dashForStrokeStyle as i, strokeDashStyleOf as a } from "@weasel-js/paint";
1
+ import { KIT_SHAPE_KINDS as e } from "../../core/shapeKinds.js";
2
+ import { inferredNodeRouting as t } from "./defaultNodeRouting.js";
3
+ import { dashForStrokeStyle as n, strokeDashStyleOf as r } from "@weasel-js/paint";
4
+ import { listMarkers as i, markerGeneration as a } from "@weasel-js/stroke";
5
5
  import { resolveAlign as o } from "@weasel-js/text";
6
6
  import { ANGLE_RADIANS as s } from "@weasel-js/quantity";
7
7
  import { prefUnit as c } from "@weasel-js/prefs";
@@ -15,8 +15,8 @@ function u(e) {
15
15
  if (typeof t == "number" || typeof t == "object" && t && typeof t.px == "number") return t;
16
16
  }
17
17
  var d = {
18
- read: (e, t) => t === void 0 ? void 0 : a(Array.isArray(e) ? e : void 0, u(t)),
19
- write: (e, t) => e === "dashed" || e === "dotted" ? i(e, u(t)) : e === "solid" ? void 0 : t?.dash
18
+ read: (e, t) => t === void 0 ? void 0 : r(Array.isArray(e) ? e : void 0, u(t)),
19
+ write: (e, t) => e === "dashed" || e === "dotted" ? n(e, u(t)) : e === "solid" ? void 0 : t?.dash
20
20
  }, f = {
21
21
  read: (e) => typeof e == "string" ? e : e && typeof e == "object" && "key" in e ? String(e.key) : "",
22
22
  write: (e) => e === "" ? void 0 : e
@@ -32,13 +32,13 @@ var d = {
32
32
  write: (e) => e
33
33
  }, h;
34
34
  function g() {
35
- let n = t();
36
- return h?.generation !== n && (h = {
37
- generation: n,
35
+ let e = a();
36
+ return h?.generation !== e && (h = {
37
+ generation: e,
38
38
  options: [{
39
39
  value: "",
40
40
  label: "None"
41
- }, ...e().map((e) => ({
41
+ }, ...i().map((e) => ({
42
42
  value: e.id,
43
43
  label: e.id
44
44
  }))]
@@ -56,7 +56,28 @@ function _(e) {
56
56
  }
57
57
  };
58
58
  }
59
- function v(e = {}) {
59
+ var v = {
60
+ kind: "object",
61
+ name: "Fill",
62
+ description: "Fill paint.",
63
+ default: { paint: {
64
+ kind: "solid",
65
+ color: "#000000ff"
66
+ } },
67
+ block: !0,
68
+ children: { paint: {
69
+ kind: "paint",
70
+ name: "Fill",
71
+ description: "Fill paint.",
72
+ default: {
73
+ kind: "solid",
74
+ color: "#000000ff"
75
+ },
76
+ alpha: !0,
77
+ block: !0
78
+ } }
79
+ };
80
+ function y(e = {}) {
60
81
  return {
61
82
  name: "Properties",
62
83
  members: {
@@ -122,24 +143,14 @@ function v(e = {}) {
122
143
  appearance: {
123
144
  name: "",
124
145
  members: {
125
- "data.fill": {
126
- kind: "paint",
127
- name: "Fill",
128
- description: "Fill paint.",
129
- default: {
130
- fill: "solid",
131
- color: "#000000ff"
132
- },
133
- alpha: !0,
134
- block: !0
135
- },
146
+ "data.fill": v,
136
147
  "data.stroke": {
137
148
  kind: "object",
138
149
  name: "Stroke",
139
150
  description: "Stroke paint and line geometry.",
140
151
  default: {
141
152
  paint: {
142
- fill: "solid",
153
+ kind: "solid",
143
154
  color: "#000000ff"
144
155
  },
145
156
  width: 1
@@ -164,7 +175,7 @@ function v(e = {}) {
164
175
  name: "Paint",
165
176
  description: "Stroke paint.",
166
177
  default: {
167
- fill: "solid",
178
+ kind: "solid",
168
179
  color: "#000000ff"
169
180
  },
170
181
  alpha: !0,
@@ -590,14 +601,14 @@ function v(e = {}) {
590
601
  }
591
602
  };
592
603
  }
593
- var y = n.map((e) => ({
604
+ var b = e.map((e) => ({
594
605
  name: e,
595
- schema: v({ text: e === "text" })
596
- })), b = r.map((e) => ({
606
+ schema: y({ text: e === "text" })
607
+ })), x = t.map((e) => ({
597
608
  name: e.name,
598
- schema: v({ text: e.name === "text" })
609
+ schema: y({ text: e.name === "text" })
599
610
  }));
600
611
  //#endregion
601
- export { y as defaultNodeProperties, b as inferredNodeProperties, l as rotationDegreesUnit };
612
+ export { b as defaultNodeProperties, x as inferredNodeProperties, l as rotationDegreesUnit };
602
613
 
603
614
  //# sourceMappingURL=defaultNodeProperties.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaultNodeProperties.js","names":["rotationDegreesUnit","prefUnit","ANGLE_RADIANS","strokeWidthOf","w","stroke","strokeDashEncoding","strokeDashStyleOf","dash","style","dashForStrokeStyle","markerEncoding","ref","value","italicEncoding","stored","on","alignEncoding","direction","resolveAlign","edge","markerOptionsCache","markerOptions","generation","markerGeneration","listMarkers","m","markerLeaf","leaf","shapeSchema","opts","defaultNodeProperties","KIT_SHAPE_KINDS","name","inferredNodeProperties","inferredNodeRouting"],"sources":["../../../src/canvas/SceneCanvas/defaultNodeProperties.ts"],"sourcesContent":["import { prefUnit, type PrefBooleanEncoding, type PrefEnum, type PrefEnumEncoding, type PrefNumberUnit, type PrefSection } from '@weasel-js/prefs';\nimport { inferredNodeRouting } from './defaultNodeRouting';\nimport { KIT_SHAPE_KINDS } from 'core/shapeKinds';\nimport { listMarkers, markerGeneration } from 'core/strokeMarkers';\nimport { dashForStrokeStyle, strokeDashStyleOf } from '@weasel-js/paint';\nimport { resolveAlign, type TextAlign } from '@weasel-js/text';\nimport type { NodePropertiesEntry } from 'core/scene/NodeProperties';\nimport { ANGLE_RADIANS } from '@weasel-js/quantity';\n\n/** Radians-stored / degrees-shown conversion for `pose.rotation` leaves.\n * Display rounds to 0.1° so a canonical radian value doesn't render as\n * a 15-digit float. */\nexport const rotationDegreesUnit: PrefNumberUnit = prefUnit(ANGLE_RADIANS, 'deg', {\n precision: 1,\n suffix: '°',\n});\n\n/** `Stroke.width` off a partly-typed stroke object, or `undefined`. */\nfunction strokeWidthOf(stroke: Record<string, unknown> | undefined): number | { px: number } | undefined {\n const w = stroke?.width;\n if (typeof w === 'number') return w;\n if (typeof w === 'object' && w !== null && typeof (w as { px?: unknown }).px === 'number') {\n return w as { px: number };\n }\n return undefined;\n}\n\n/** `Stroke.dash` — a stored array of lengths — read and written as a named\n * style. The presets are multiples of the sibling `width`, which is why the\n * encoding is handed the whole stroke rather than the field. */\nconst strokeDashEncoding: PrefEnumEncoding = {\n read: (dash, stroke) =>\n stroke === undefined\n ? undefined\n : strokeDashStyleOf(Array.isArray(dash) ? (dash as number[]) : undefined, strokeWidthOf(stroke)),\n write: (style, stroke) =>\n style === 'dashed' || style === 'dotted'\n ? dashForStrokeStyle(style, strokeWidthOf(stroke))\n // `solid` is stored as no dash at all. `custom` is reportable, not\n // authorable: it names an imported array, and the array it names is the\n // one already stored.\n : style === 'solid'\n ? undefined\n : stroke?.dash,\n};\n\n/** `Stroke.markerStart` / `markerMid` / `markerEnd` — a `MarkerRef` — read and\n * written as a bare key, with the empty string standing for no marker. */\nconst markerEncoding: PrefEnumEncoding = {\n read: (ref) => {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return '';\n },\n write: (value) => (value === '' ? undefined : value),\n};\n\n/** `TextStyle.fontStyle` as an Italic flag. Off removes the field rather than\n * storing `'normal'`, which is what an absent one already means. */\nconst italicEncoding: PrefBooleanEncoding = {\n read: (stored) => stored === 'italic',\n write: (on) => (on ? 'italic' : undefined),\n};\n\n/** `TextStyle.align` read as the edge that paints, or as `justify`. The model\n * also holds the reading-order pair `start` / `end`, which the segments would\n * otherwise leave unlit; they read through `direction`, and a click writes the\n * edge. */\nconst alignEncoding: PrefEnumEncoding = {\n read: (stored, style) => {\n if (stored === undefined || stored === 'justify') return stored;\n const direction = style?.direction === 'rtl' ? 'rtl' : 'ltr';\n return resolveAlign(stored as TextAlign, direction);\n },\n write: (edge) => edge,\n};\n\ntype MarkerOptions = PrefEnum['options'];\nlet markerOptionsCache: { generation: number; options: MarkerOptions } | undefined;\n\n/** A `select` rather than a `toggle`: nine options will not fit a segmented\n * strip. One array per state of the registry, so a reader comparing\n * references sees a change only when the set changed. */\nfunction markerOptions(): MarkerOptions {\n const generation = markerGeneration();\n if (markerOptionsCache?.generation !== generation) {\n markerOptionsCache = {\n generation,\n options: [\n { value: '', label: 'None' },\n ...listMarkers().map((m) => ({ value: m.id, label: m.id })),\n ],\n };\n }\n return markerOptionsCache.options;\n}\n\n// An accessor: these schemas are built at module load, before a consumer can\n// have registered a marker, so the list is read from the registry when asked.\nfunction markerLeaf(leaf: Omit<PrefEnum, 'kind' | 'options' | 'default' | 'control' | 'encoding' | 'clearable'>): PrefEnum {\n return {\n kind: 'enum', default: '', control: 'select', encoding: markerEncoding, ...leaf,\n get options() { return markerOptions(); },\n };\n}\n\n/** Build the standard shape schema — Layout (pose box + rotation) +\n * Appearance (fill / stroke), optionally a Text group. Matches the kit's\n * builtin-shape data template (`{ path, fill, stroke?, text? }`,\n * `useBuiltinShapeTools`). */\nfunction shapeSchema(opts: { text?: boolean } = {}): PrefSection {\n return {\n name: 'Properties',\n members: {\n layout: {\n name: 'Layout',\n members: {\n 'pose.x': { kind: 'number', name: 'X', description: 'Left edge, world units.', default: 0, pair: { with: 'pose.y', label: 'Position' } },\n 'pose.y': { kind: 'number', name: 'Y', description: 'Top edge, world units.', default: 0 },\n 'pose.width': { kind: 'number', name: 'W', description: 'Width, world units.', default: 0, min: 0, pair: { with: 'pose.height', label: 'Size' } },\n 'pose.height': { kind: 'number', name: 'H', description: 'Height, world units.', default: 0, min: 0 },\n 'pose.rotation': { kind: 'number', name: 'Rotation', description: 'Rotation about the box center.', default: 0, step: 1, unit: rotationDegreesUnit, absentIsDefault: true },\n },\n },\n // What the node *is* outranks how it is painted: a text node's copy is\n // the first thing an editor reaches for.\n ...(opts.text\n ? {\n content: {\n name: 'Content',\n members: {\n // `block`: the content is the section, so a 64px label column\n // reading \"Text\" inside a section reading \"Text\" is one word\n // twice and a narrower field for the sake of it.\n 'data.text': { kind: 'string', name: 'Text', description: 'Text content.', absentIsDefault: true, default: '', block: true },\n },\n },\n }\n : {}),\n appearance: {\n // Headless: `Fill` and `Stroke` head their own blocks, and an\n // `Appearance` rule over them names neither of the two paints a\n // reader is looking at.\n name: '',\n members: {\n // A `paint` leaf, not a `color` one: `data.fill` is the tagged\n // `FillStyle` union, so a color control pointed at it would read\n // `undefined` off a gradient and write a bare string over it.\n // `block` for the same reason every stroke field is: the kind bar\n // and the per-kind editor want the width a 64px label column takes.\n 'data.fill': { kind: 'paint', name: 'Fill', description: 'Fill paint.', default: { fill: 'solid', color: '#000000ff' }, alpha: true, block: true },\n // An object leaf: `data.stroke` is a whole `Stroke`, and its fields\n // belong to one value. Sibling leaves addressing into it would each\n // write one field of a value they can only half see.\n 'data.stroke': {\n kind: 'object',\n name: 'Stroke',\n description: 'Stroke paint and line geometry.',\n default: { paint: { fill: 'solid', color: '#000000ff' }, width: 1 },\n block: true,\n children: {\n // Every row is `block`: under a heading already reading STROKE,\n // a 64px label column spells the section name again and takes\n // the width the controls need. Each field leads with its own\n // glyph instead.\n // Unpaired: the paint field is a whole paint editor — a kind bar\n // over a per-kind body — and cannot share a row with a slider.\n width: { kind: 'number', name: 'Width', description: 'Stroke width, world units.', absentIsDefault: true, default: 1, min: 0, max: 20, step: 0.5, control: 'slider', icon: 'strokeWidth', block: true },\n paint: { kind: 'paint', name: 'Paint', description: 'Stroke paint.', default: { fill: 'solid', color: '#000000ff' }, alpha: true, block: true },\n // Three options each: a segmented control shows every one at\n // once where a select shows the current one and hides the rest\n // behind a click.\n cap: { kind: 'enum', name: 'Cap', description: 'How an open end is drawn.', absentIsDefault: true, default: 'butt', control: 'toggle', block: true, pair: { with: ['data.stroke.join', 'data.stroke.align'], label: 'Line' }, options: [{ value: 'butt', label: 'Butt', icon: 'capButt' }, { value: 'round', label: 'Round', icon: 'capRound' }, { value: 'square', label: 'Square', icon: 'capSquare' }] },\n join: { kind: 'enum', name: 'Join', description: 'How a corner is drawn.', absentIsDefault: true, default: 'miter', control: 'toggle', block: true, options: [{ value: 'miter', label: 'Miter', icon: 'joinMiter' }, { value: 'round', label: 'Round', icon: 'joinRound' }, { value: 'bevel', label: 'Bevel', icon: 'joinBevel' }] },\n align: { kind: 'enum', name: 'Align', description: 'Where the ribbon sits relative to the edge.', absentIsDefault: true, default: 'center', control: 'toggle', block: true, options: [{ value: 'inner', label: 'Inner', icon: 'alignInner' }, { value: 'center', label: 'Center', icon: 'alignCenter' }, { value: 'outer', label: 'Outer', icon: 'alignOuter' }] },\n // Its own row: three bars already fill the one above, and the\n // dash pattern is a property of the line rather than of how the\n // ribbon meets the geometry.\n dash: { kind: 'enum', name: 'Style', description: 'Solid, dashed or dotted. Dash lengths are multiples of the stroke width, so a style holds as the width changes.', default: 'solid', control: 'toggle', block: true, encoding: strokeDashEncoding, options: [{ value: 'solid', label: 'Solid', icon: 'dashSolid' }, { value: 'dashed', label: 'Dashed', icon: 'dashDashed' }, { value: 'dotted', label: 'Dotted', icon: 'dashDotted' }, { value: 'custom', label: 'Custom', icon: 'dashCustom', disabled: true }] },\n markerStart: markerLeaf({ name: 'Start', description: 'Marker at the first vertex of each open subpath.', block: true, pair: { with: ['data.stroke.markerMid', 'data.stroke.markerEnd'], label: 'Markers' } }),\n markerMid: markerLeaf({ name: 'Mid', description: 'Marker at every interior authored vertex.', block: true }),\n markerEnd: markerLeaf({ name: 'End', description: 'Marker at the last vertex of each open subpath.', block: true }),\n },\n },\n },\n },\n ...(opts.text\n ? {\n text: {\n // Headless: `Character` and `Paragraph` carry the labels, and a\n // `Typography` heading over them names nothing a reader can't\n // already see.\n name: '',\n members: {\n // One object leaf, not a row of siblings addressing into it:\n // `data.style` is a `TextStyle`, and its character and\n // paragraph fields are one value that reads as two lists.\n // The groups head those lists and contribute nothing to the\n // path — a field inside one is still a field of the style.\n 'data.style': {\n kind: 'object',\n name: 'Style',\n description: 'Typography for the whole node. Its color is the node\\'s own `data.fill`, in Appearance.',\n default: {},\n absentIsDefault: true,\n block: true,\n children: {\n character: {\n name: 'Character',\n members: {\n fontFamily: { kind: 'font-family', name: 'Font', description: 'Registered font family.', absentIsDefault: true, default: 'sans-serif' },\n fontSize: { kind: 'number', name: 'Size', description: 'Font size, world units.', absentIsDefault: true, default: 16, min: 1, step: 1, pair: { with: 'data.style.fontWeight', label: 'Size / weight' } },\n fontWeight: { kind: 'font-weight', name: 'Weight', description: 'Font weight, from the faces the family has.', absentIsDefault: true, default: 400 },\n // One row of segments, the strip every text editor\n // draws: the slant, the three rules, then the two\n // scripts. Italic is a flag here although the field\n // is `fontStyle`, whose only other value is upright.\n fontStyle: { kind: 'boolean', name: 'Italic', description: 'Set the text in its italic face.', default: false, control: 'toggle', icon: 'italic', short: ['I'], pair: { with: ['data.style.underline', 'data.style.strikethrough', 'data.style.overline', 'data.style.script'], label: 'Style' }, encoding: italicEncoding },\n underline: { kind: 'boolean', name: 'Underline', description: 'Underline the text.', absentIsDefault: true, default: false, control: 'toggle', icon: 'underline', short: ['U'] },\n strikethrough: { kind: 'boolean', name: 'Strikethrough', description: 'Strike through the text.', absentIsDefault: true, default: false, control: 'toggle', icon: 'strikethrough', short: ['S'] },\n overline: { kind: 'boolean', name: 'Overline', description: 'Rule the text above its ascent.', absentIsDefault: true, default: false, control: 'toggle', icon: 'overline', short: ['O'] },\n script: { kind: 'enum', name: 'Script', description: 'Set the text smaller and raised or lowered, on the line it would otherwise hold.', default: undefined, control: 'toggle', clearable: true, options: [{ value: 'super', label: 'Superscript', icon: 'superscript' }, { value: 'sub', label: 'Subscript', icon: 'subscript' }] },\n letterSpacing: { kind: 'number', name: 'Tracking', description: 'Extra advance per glyph, world units.', absentIsDefault: true, default: 0, step: 0.1 },\n textTransform: { kind: 'enum', name: 'Case', description: 'Draw the text in capitals, lowercase or title case. The text itself is unchanged.', absentIsDefault: true, default: 'none', control: 'toggle', options: [{ value: 'none', label: 'None', short: ['–'] }, { value: 'uppercase', label: 'Uppercase', short: ['AA'] }, { value: 'lowercase', label: 'Lowercase', short: ['aa'] }, { value: 'capitalize', label: 'Capitalize', short: ['Aa'] }] },\n fontVariantCaps: { kind: 'enum', name: 'Small caps', description: 'Draw lowercase letters as smaller capitals. The text itself is unchanged.', absentIsDefault: true, default: 'normal', control: 'toggle', options: [{ value: 'normal', label: 'Normal', short: ['–'] }, { value: 'small-caps', label: 'Small caps', short: ['Sc'] }] },\n },\n },\n paragraph: {\n name: 'Paragraph',\n members: {\n lineHeight: { kind: 'number', name: 'Leading', description: 'Line height as a multiple of font size.', absentIsDefault: true, default: 1.2, min: 0.5, step: 0.1 },\n wrap: { kind: 'boolean', name: 'Wrap', description: 'Break lines between words at the box width.', absentIsDefault: true, default: false, control: 'switch' },\n tabSize: { kind: 'number', name: 'Tab size', description: 'Distance between tab stops, in spaces.', absentIsDefault: true, default: 8, min: 1, step: 1 },\n direction: { kind: 'enum', name: 'Direction', description: 'Reading direction. Auto takes each paragraph\\'s from its first strong character.', absentIsDefault: true, default: 'auto', control: 'toggle', options: [{ value: 'auto', label: 'Auto', short: ['Auto'] }, { value: 'ltr', label: 'Left to right', short: ['LTR'] }, { value: 'rtl', label: 'Right to left', short: ['RTL'] }] },\n // Last, so the box's vertical alignment — a field of\n // the node rather than of its style — follows it.\n align: { kind: 'enum', name: 'Align', description: 'Horizontal alignment.', absentIsDefault: true, default: 'left', control: 'toggle', encoding: alignEncoding, options: [{ value: 'left', label: 'Left', icon: 'textAlignLeft' }, { value: 'center', label: 'Center', icon: 'textAlignCenter' }, { value: 'right', label: 'Right', icon: 'textAlignRight' }, { value: 'justify', label: 'Justify', icon: 'textAlignJustify' }] },\n },\n },\n },\n },\n 'data.verticalAlign': { kind: 'enum', name: 'Vertical', description: 'Where the lines sit in the box\\'s height.', absentIsDefault: true, default: 'top', control: 'toggle', options: [{ value: 'top', label: 'Top', icon: 'textAlignTop' }, { value: 'center', label: 'Middle', icon: 'textAlignMiddle' }, { value: 'bottom', label: 'Bottom', icon: 'textAlignBottom' }] },\n },\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Default properties-trait entries covering the kit's built-in shape\n * kinds (`KIT_SHAPE_KINDS`) — the sibling of `defaultNodeRouting`. Every\n * kind gets the standard box schema; `text` adds a Text group. In\n * lockstep with `KIT_SHAPE_KINDS` by construction (derived via `.map`).\n */\nexport const defaultNodeProperties: readonly NodePropertiesEntry[] =\n KIT_SHAPE_KINDS.map((name) => ({\n name,\n schema: shapeSchema({ text: name === 'text' }),\n }));\n\n/**\n * Properties-trait entries for the *inferred* routing kinds\n * (`inferredNodeRouting`: `text` / `path` / `image`) — the vocabulary\n * consumers produce when they don't tag `data.kind` (e.g. WeaselDraw).\n * In lockstep with `inferredNodeRouting` by construction.\n */\nexport const inferredNodeProperties: readonly NodePropertiesEntry[] =\n inferredNodeRouting.map((e) => ({\n name: e.name,\n schema: shapeSchema({ text: e.name === 'text' }),\n }));\n"],"mappings":"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"}
1
+ {"version":3,"file":"defaultNodeProperties.js","names":["rotationDegreesUnit","prefUnit","ANGLE_RADIANS","strokeWidthOf","w","stroke","strokeDashEncoding","strokeDashStyleOf","dash","style","dashForStrokeStyle","markerEncoding","ref","value","italicEncoding","stored","on","alignEncoding","direction","resolveAlign","edge","markerOptionsCache","markerOptions","generation","markerGeneration","listMarkers","m","markerLeaf","leaf","FILL_LEAF","shapeSchema","opts","defaultNodeProperties","KIT_SHAPE_KINDS","name","inferredNodeProperties","inferredNodeRouting"],"sources":["../../../src/canvas/SceneCanvas/defaultNodeProperties.ts"],"sourcesContent":["import { prefUnit, type PrefBooleanEncoding, type PrefEnum, type PrefEnumEncoding, type PrefLeaf, type PrefNumberUnit, type PrefSection } from '@weasel-js/prefs';\nimport { inferredNodeRouting } from './defaultNodeRouting';\nimport { KIT_SHAPE_KINDS } from 'core/shapeKinds';\nimport { listMarkers, markerGeneration } from '@weasel-js/stroke';\nimport { dashForStrokeStyle, strokeDashStyleOf } from '@weasel-js/paint';\nimport { resolveAlign, type TextAlign } from '@weasel-js/text';\nimport type { NodePropertiesEntry } from 'core/scene/NodeProperties';\nimport { ANGLE_RADIANS } from '@weasel-js/quantity';\n\n/** Radians-stored / degrees-shown conversion for `pose.rotation` leaves.\n * Display rounds to 0.1° so a canonical radian value doesn't render as\n * a 15-digit float. */\nexport const rotationDegreesUnit: PrefNumberUnit = prefUnit(ANGLE_RADIANS, 'deg', {\n precision: 1,\n suffix: '°',\n});\n\n/** `Stroke.width` off a partly-typed stroke object, or `undefined`. */\nfunction strokeWidthOf(stroke: Record<string, unknown> | undefined): number | { px: number } | undefined {\n const w = stroke?.width;\n if (typeof w === 'number') return w;\n if (typeof w === 'object' && w !== null && typeof (w as { px?: unknown }).px === 'number') {\n return w as { px: number };\n }\n return undefined;\n}\n\n/** `Stroke.dash` — a stored array of lengths — read and written as a named\n * style. The presets are multiples of the sibling `width`, which is why the\n * encoding is handed the whole stroke rather than the field. */\nconst strokeDashEncoding: PrefEnumEncoding = {\n read: (dash, stroke) =>\n stroke === undefined\n ? undefined\n : strokeDashStyleOf(Array.isArray(dash) ? (dash as number[]) : undefined, strokeWidthOf(stroke)),\n write: (style, stroke) =>\n style === 'dashed' || style === 'dotted'\n ? dashForStrokeStyle(style, strokeWidthOf(stroke))\n // `solid` is stored as no dash at all. `custom` is reportable, not\n // authorable: it names an imported array, and the array it names is the\n // one already stored.\n : style === 'solid'\n ? undefined\n : stroke?.dash,\n};\n\n/** `Stroke.markerStart` / `markerMid` / `markerEnd` — a `MarkerRef` — read and\n * written as a bare key, with the empty string standing for no marker. */\nconst markerEncoding: PrefEnumEncoding = {\n read: (ref) => {\n if (typeof ref === 'string') return ref;\n if (ref && typeof ref === 'object' && 'key' in ref) return String((ref as { key: string }).key);\n return '';\n },\n write: (value) => (value === '' ? undefined : value),\n};\n\n/** `TextStyle.fontStyle` as an Italic flag. Off removes the field rather than\n * storing `'normal'`, which is what an absent one already means. */\nconst italicEncoding: PrefBooleanEncoding = {\n read: (stored) => stored === 'italic',\n write: (on) => (on ? 'italic' : undefined),\n};\n\n/** `TextStyle.align` read as the edge that paints, or as `justify`. The model\n * also holds the reading-order pair `start` / `end`, which the segments would\n * otherwise leave unlit; they read through `direction`, and a click writes the\n * edge. */\nconst alignEncoding: PrefEnumEncoding = {\n read: (stored, style) => {\n if (stored === undefined || stored === 'justify') return stored;\n const direction = style?.direction === 'rtl' ? 'rtl' : 'ltr';\n return resolveAlign(stored as TextAlign, direction);\n },\n write: (edge) => edge,\n};\n\ntype MarkerOptions = PrefEnum['options'];\nlet markerOptionsCache: { generation: number; options: MarkerOptions } | undefined;\n\n/** A `select` rather than a `toggle`: nine options will not fit a segmented\n * strip. One array per state of the registry, so a reader comparing\n * references sees a change only when the set changed. */\nfunction markerOptions(): MarkerOptions {\n const generation = markerGeneration();\n if (markerOptionsCache?.generation !== generation) {\n markerOptionsCache = {\n generation,\n options: [\n { value: '', label: 'None' },\n ...listMarkers().map((m) => ({ value: m.id, label: m.id })),\n ],\n };\n }\n return markerOptionsCache.options;\n}\n\n// An accessor: these schemas are built at module load, before a consumer can\n// have registered a marker, so the list is read from the registry when asked.\nfunction markerLeaf(leaf: Omit<PrefEnum, 'kind' | 'options' | 'default' | 'control' | 'encoding' | 'clearable'>): PrefEnum {\n return {\n kind: 'enum', default: '', control: 'select', encoding: markerEncoding, ...leaf,\n get options() { return markerOptions(); },\n };\n}\n\n/** `data.fill` is a whole `Fill`, so it is an object leaf, as the stroke is.\n * Its field is a `paint` leaf, not a `color` one, because a color control\n * would read `undefined` off a gradient and write a bare string over it.\n * `block` for the same reason every stroke field is: the kind bar and the\n * per-kind editor want the width a 64px label column takes. */\nconst FILL_LEAF: PrefLeaf = {\n kind: 'object',\n name: 'Fill',\n description: 'Fill paint.',\n default: { paint: { kind: 'solid', color: '#000000ff' } },\n block: true,\n children: {\n paint: { kind: 'paint', name: 'Fill', description: 'Fill paint.', default: { kind: 'solid', color: '#000000ff' }, alpha: true, block: true },\n },\n};\n\n/** Build the standard shape schema — Layout (pose box + rotation) +\n * Appearance (fill / stroke), optionally a Text group. Matches the kit's\n * builtin-shape data template (`{ path, fill, stroke?, text? }`,\n * `useBuiltinShapeTools`). */\nfunction shapeSchema(opts: { text?: boolean } = {}): PrefSection {\n return {\n name: 'Properties',\n members: {\n layout: {\n name: 'Layout',\n members: {\n 'pose.x': { kind: 'number', name: 'X', description: 'Left edge, world units.', default: 0, pair: { with: 'pose.y', label: 'Position' } },\n 'pose.y': { kind: 'number', name: 'Y', description: 'Top edge, world units.', default: 0 },\n 'pose.width': { kind: 'number', name: 'W', description: 'Width, world units.', default: 0, min: 0, pair: { with: 'pose.height', label: 'Size' } },\n 'pose.height': { kind: 'number', name: 'H', description: 'Height, world units.', default: 0, min: 0 },\n 'pose.rotation': { kind: 'number', name: 'Rotation', description: 'Rotation about the box center.', default: 0, step: 1, unit: rotationDegreesUnit, absentIsDefault: true },\n },\n },\n // What the node *is* outranks how it is painted: a text node's copy is\n // the first thing an editor reaches for.\n ...(opts.text\n ? {\n content: {\n name: 'Content',\n members: {\n // `block`: the content is the section, so a 64px label column\n // reading \"Text\" inside a section reading \"Text\" is one word\n // twice and a narrower field for the sake of it.\n 'data.text': { kind: 'string', name: 'Text', description: 'Text content.', absentIsDefault: true, default: '', block: true },\n },\n },\n }\n : {}),\n appearance: {\n // Headless: `Fill` and `Stroke` head their own blocks, and an\n // `Appearance` rule over them names neither of the two paints a\n // reader is looking at.\n name: '',\n members: {\n 'data.fill': FILL_LEAF,\n // An object leaf: `data.stroke` is a whole `Stroke`, and its fields\n // belong to one value. Sibling leaves addressing into it would each\n // write one field of a value they can only half see.\n 'data.stroke': {\n kind: 'object',\n name: 'Stroke',\n description: 'Stroke paint and line geometry.',\n default: { paint: { kind: 'solid', color: '#000000ff' }, width: 1 },\n block: true,\n children: {\n // Every row is `block`: under a heading already reading STROKE,\n // a 64px label column spells the section name again and takes\n // the width the controls need. Each field leads with its own\n // glyph instead.\n // Unpaired: the paint field is a whole paint editor — a kind bar\n // over a per-kind body — and cannot share a row with a slider.\n width: { kind: 'number', name: 'Width', description: 'Stroke width, world units.', absentIsDefault: true, default: 1, min: 0, max: 20, step: 0.5, control: 'slider', icon: 'strokeWidth', block: true },\n paint: { kind: 'paint', name: 'Paint', description: 'Stroke paint.', default: { kind: 'solid', color: '#000000ff' }, alpha: true, block: true },\n // Three options each: a segmented control shows every one at\n // once where a select shows the current one and hides the rest\n // behind a click.\n cap: { kind: 'enum', name: 'Cap', description: 'How an open end is drawn.', absentIsDefault: true, default: 'butt', control: 'toggle', block: true, pair: { with: ['data.stroke.join', 'data.stroke.align'], label: 'Line' }, options: [{ value: 'butt', label: 'Butt', icon: 'capButt' }, { value: 'round', label: 'Round', icon: 'capRound' }, { value: 'square', label: 'Square', icon: 'capSquare' }] },\n join: { kind: 'enum', name: 'Join', description: 'How a corner is drawn.', absentIsDefault: true, default: 'miter', control: 'toggle', block: true, options: [{ value: 'miter', label: 'Miter', icon: 'joinMiter' }, { value: 'round', label: 'Round', icon: 'joinRound' }, { value: 'bevel', label: 'Bevel', icon: 'joinBevel' }] },\n align: { kind: 'enum', name: 'Align', description: 'Where the ribbon sits relative to the edge.', absentIsDefault: true, default: 'center', control: 'toggle', block: true, options: [{ value: 'inner', label: 'Inner', icon: 'alignInner' }, { value: 'center', label: 'Center', icon: 'alignCenter' }, { value: 'outer', label: 'Outer', icon: 'alignOuter' }] },\n // Its own row: three bars already fill the one above, and the\n // dash pattern is a property of the line rather than of how the\n // ribbon meets the geometry.\n dash: { kind: 'enum', name: 'Style', description: 'Solid, dashed or dotted. Dash lengths are multiples of the stroke width, so a style holds as the width changes.', default: 'solid', control: 'toggle', block: true, encoding: strokeDashEncoding, options: [{ value: 'solid', label: 'Solid', icon: 'dashSolid' }, { value: 'dashed', label: 'Dashed', icon: 'dashDashed' }, { value: 'dotted', label: 'Dotted', icon: 'dashDotted' }, { value: 'custom', label: 'Custom', icon: 'dashCustom', disabled: true }] },\n markerStart: markerLeaf({ name: 'Start', description: 'Marker at the first vertex of each open subpath.', block: true, pair: { with: ['data.stroke.markerMid', 'data.stroke.markerEnd'], label: 'Markers' } }),\n markerMid: markerLeaf({ name: 'Mid', description: 'Marker at every interior authored vertex.', block: true }),\n markerEnd: markerLeaf({ name: 'End', description: 'Marker at the last vertex of each open subpath.', block: true }),\n },\n },\n },\n },\n ...(opts.text\n ? {\n text: {\n // Headless: `Character` and `Paragraph` carry the labels, and a\n // `Typography` heading over them names nothing a reader can't\n // already see.\n name: '',\n members: {\n // One object leaf, not a row of siblings addressing into it:\n // `data.style` is a `TextStyle`, and its character and\n // paragraph fields are one value that reads as two lists.\n // The groups head those lists and contribute nothing to the\n // path — a field inside one is still a field of the style.\n 'data.style': {\n kind: 'object',\n name: 'Style',\n description: 'Typography for the whole node. Its color is the node\\'s own `data.fill`, in Appearance.',\n default: {},\n absentIsDefault: true,\n block: true,\n children: {\n character: {\n name: 'Character',\n members: {\n fontFamily: { kind: 'font-family', name: 'Font', description: 'Registered font family.', absentIsDefault: true, default: 'sans-serif' },\n fontSize: { kind: 'number', name: 'Size', description: 'Font size, world units.', absentIsDefault: true, default: 16, min: 1, step: 1, pair: { with: 'data.style.fontWeight', label: 'Size / weight' } },\n fontWeight: { kind: 'font-weight', name: 'Weight', description: 'Font weight, from the faces the family has.', absentIsDefault: true, default: 400 },\n // One row of segments, the strip every text editor\n // draws: the slant, the three rules, then the two\n // scripts. Italic is a flag here although the field\n // is `fontStyle`, whose only other value is upright.\n fontStyle: { kind: 'boolean', name: 'Italic', description: 'Set the text in its italic face.', default: false, control: 'toggle', icon: 'italic', short: ['I'], pair: { with: ['data.style.underline', 'data.style.strikethrough', 'data.style.overline', 'data.style.script'], label: 'Style' }, encoding: italicEncoding },\n underline: { kind: 'boolean', name: 'Underline', description: 'Underline the text.', absentIsDefault: true, default: false, control: 'toggle', icon: 'underline', short: ['U'] },\n strikethrough: { kind: 'boolean', name: 'Strikethrough', description: 'Strike through the text.', absentIsDefault: true, default: false, control: 'toggle', icon: 'strikethrough', short: ['S'] },\n overline: { kind: 'boolean', name: 'Overline', description: 'Rule the text above its ascent.', absentIsDefault: true, default: false, control: 'toggle', icon: 'overline', short: ['O'] },\n script: { kind: 'enum', name: 'Script', description: 'Set the text smaller and raised or lowered, on the line it would otherwise hold.', default: undefined, control: 'toggle', clearable: true, options: [{ value: 'super', label: 'Superscript', icon: 'superscript' }, { value: 'sub', label: 'Subscript', icon: 'subscript' }] },\n letterSpacing: { kind: 'number', name: 'Tracking', description: 'Extra advance per glyph, world units.', absentIsDefault: true, default: 0, step: 0.1 },\n textTransform: { kind: 'enum', name: 'Case', description: 'Draw the text in capitals, lowercase or title case. The text itself is unchanged.', absentIsDefault: true, default: 'none', control: 'toggle', options: [{ value: 'none', label: 'None', short: ['–'] }, { value: 'uppercase', label: 'Uppercase', short: ['AA'] }, { value: 'lowercase', label: 'Lowercase', short: ['aa'] }, { value: 'capitalize', label: 'Capitalize', short: ['Aa'] }] },\n fontVariantCaps: { kind: 'enum', name: 'Small caps', description: 'Draw lowercase letters as smaller capitals. The text itself is unchanged.', absentIsDefault: true, default: 'normal', control: 'toggle', options: [{ value: 'normal', label: 'Normal', short: ['–'] }, { value: 'small-caps', label: 'Small caps', short: ['Sc'] }] },\n },\n },\n paragraph: {\n name: 'Paragraph',\n members: {\n lineHeight: { kind: 'number', name: 'Leading', description: 'Line height as a multiple of font size.', absentIsDefault: true, default: 1.2, min: 0.5, step: 0.1 },\n wrap: { kind: 'boolean', name: 'Wrap', description: 'Break lines between words at the box width.', absentIsDefault: true, default: false, control: 'switch' },\n tabSize: { kind: 'number', name: 'Tab size', description: 'Distance between tab stops, in spaces.', absentIsDefault: true, default: 8, min: 1, step: 1 },\n direction: { kind: 'enum', name: 'Direction', description: 'Reading direction. Auto takes each paragraph\\'s from its first strong character.', absentIsDefault: true, default: 'auto', control: 'toggle', options: [{ value: 'auto', label: 'Auto', short: ['Auto'] }, { value: 'ltr', label: 'Left to right', short: ['LTR'] }, { value: 'rtl', label: 'Right to left', short: ['RTL'] }] },\n // Last, so the box's vertical alignment — a field of\n // the node rather than of its style — follows it.\n align: { kind: 'enum', name: 'Align', description: 'Horizontal alignment.', absentIsDefault: true, default: 'left', control: 'toggle', encoding: alignEncoding, options: [{ value: 'left', label: 'Left', icon: 'textAlignLeft' }, { value: 'center', label: 'Center', icon: 'textAlignCenter' }, { value: 'right', label: 'Right', icon: 'textAlignRight' }, { value: 'justify', label: 'Justify', icon: 'textAlignJustify' }] },\n },\n },\n },\n },\n 'data.verticalAlign': { kind: 'enum', name: 'Vertical', description: 'Where the lines sit in the box\\'s height.', absentIsDefault: true, default: 'top', control: 'toggle', options: [{ value: 'top', label: 'Top', icon: 'textAlignTop' }, { value: 'center', label: 'Middle', icon: 'textAlignMiddle' }, { value: 'bottom', label: 'Bottom', icon: 'textAlignBottom' }] },\n },\n },\n }\n : {}),\n },\n };\n}\n\n/**\n * Default properties-trait entries covering the kit's built-in shape\n * kinds (`KIT_SHAPE_KINDS`) — the sibling of `defaultNodeRouting`. Every\n * kind gets the standard box schema; `text` adds a Text group. In\n * lockstep with `KIT_SHAPE_KINDS` by construction (derived via `.map`).\n */\nexport const defaultNodeProperties: readonly NodePropertiesEntry[] =\n KIT_SHAPE_KINDS.map((name) => ({\n name,\n schema: shapeSchema({ text: name === 'text' }),\n }));\n\n/**\n * Properties-trait entries for the *inferred* routing kinds\n * (`inferredNodeRouting`: `text` / `path` / `image`) — the vocabulary\n * consumers produce when they don't tag `data.kind` (e.g. WeaselDraw).\n * In lockstep with `inferredNodeRouting` by construction.\n */\nexport const inferredNodeProperties: readonly NodePropertiesEntry[] =\n inferredNodeRouting.map((e) => ({\n name: e.name,\n schema: shapeSchema({ text: e.name === 'text' }),\n }));\n"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { KIT_SHAPE_KINDS as e } from "../../core/shapeKinds.js";
2
- import { isTextData as t } from "../../features/text/isTextData.js";
2
+ import { isTextData as t } from "@weasel-js/text";
3
3
  //#region src/canvas/SceneCanvas/defaultNodeRouting.ts
4
4
  function n(e) {
5
5
  return typeof e == "object" && !!e;
@@ -1 +1 @@
1
- {"version":3,"file":"defaultNodeRouting.js","names":["isObj","d","defaultNodeRouting","KIT_SHAPE_KINDS","data","name","inferredNodeRouting","isTextData"],"sources":["../../../src/canvas/SceneCanvas/defaultNodeRouting.ts"],"sourcesContent":["import { KIT_SHAPE_KINDS } from 'core/shapeKinds';\nimport type { NodeRoutingEntry } from 'core/scene/NodeRouting';\nimport { isTextData } from 'features/text/isTextData';\n\nfunction isObj(d: unknown): d is Record<string, unknown> {\n return typeof d === 'object' && d !== null;\n}\n\n/**\n * Default routing-trait classifiers covering the kit's built-in shape\n * tools (`KIT_SHAPE_KINDS`). Each entry matches `data.kind === '<name>'`\n * — the convention demos use when they explicitly tag scene data with a\n * routing-kind string. The routing trait's default values happen to\n * mirror the shape trait's by name; the two traits remain independent\n * — a consumer can register routing kinds that have no matching shape\n * painter (e.g. `'group'`, `'sticky-note'`).\n *\n * Lives in the canvas layer (next to the builtin shape tools it mirrors)\n * rather than `core/scene`: the generic routing machinery (`NodeRouting`)\n * is core, but this default *population* depends on the canvas-layer\n * `KIT_SHAPE_KINDS`, so `core` must not own it.\n *\n * Consumers using the kit's standard data shape spread\n * `defaultNodeRouting` into their `<SceneCanvas routing={...}>` prop;\n * consumers whose data carries no `kind` field but follows the kit's\n * common shapes (`{ path }`, `{ text }`, `{ image }`) should prefer\n * `inferredNodeRouting` below, which SceneCanvas applies automatically\n * when `routing` is unset.\n *\n * In lockstep with `KIT_SHAPE_KINDS` by construction (derived via `.map`).\n */\nexport const defaultNodeRouting: readonly NodeRoutingEntry[] = KIT_SHAPE_KINDS.map(\n (name) => ({\n name,\n matches: (data) =>\n isObj(data) &&\n (data as { kind?: unknown }).kind === name,\n }),\n);\n\n/**\n * Shape-inferred routing-trait classifiers used when a consumer doesn't\n * pass `routing` to `<SceneCanvas>`. Produces semantic kinds based on\n * data-shape hints rather than an explicit `data.kind` tag:\n *\n * - `'text'` when `data.text` is a string (`text-edit` mode entry)\n * - `'path'` when `data.path` is present (`path-edit` mode entry)\n * - `'image'` when `data.image` is present\n *\n * Order matters: `'text'` beats `'path'` so an SVG-imported text node\n * carrying a fallback `path` routes to text-edit. Consumers wanting\n * different precedence pass their own `routing` array.\n *\n * Without this default the kind classifier is undefined when\n * `routing` is unset and every hit comes back as `kind: 'unknown'`,\n * silently breaking `Hit.kind`-based routing (e.g. modality's\n * `dispatchDoubleClickEntry`).\n */\nexport const inferredNodeRouting: readonly NodeRoutingEntry[] = [\n { name: 'text', matches: isTextData },\n { name: 'path', matches: (d) => isObj(d) && d.path != null },\n { name: 'image', matches: (d) => isObj(d) && d.image != null },\n];\n"],"mappings":";;;AAIA,SAASA,EAAM,GAA0C;CACvD,OAAO,OAAOC,KAAM,cAAYA;AAClC;AAyBA,IAAaC,IAAkDC,EAAgB,KAC5E,OAAU;CACT;CACA,UAAU,MACRH,EAAMI,CAAI,KACTA,EAA4B,SAASC;AAC1C,EACF,GAoBaC,IAAmD;CAC9D;EAAE,MAAM;EAAQ,SAASC;CAAW;CACpC;EAAE,MAAM;EAAQ,UAAU,MAAMP,EAAMC,CAAC,KAAKA,EAAE,QAAQ;CAAK;CAC3D;EAAE,MAAM;EAAS,UAAU,MAAMD,EAAMC,CAAC,KAAKA,EAAE,SAAS;CAAK;AAC/D"}
1
+ {"version":3,"file":"defaultNodeRouting.js","names":["isObj","d","defaultNodeRouting","KIT_SHAPE_KINDS","data","name","inferredNodeRouting","isTextData"],"sources":["../../../src/canvas/SceneCanvas/defaultNodeRouting.ts"],"sourcesContent":["import { KIT_SHAPE_KINDS } from 'core/shapeKinds';\nimport type { NodeRoutingEntry } from 'core/scene/NodeRouting';\nimport { isTextData } from '@weasel-js/text';\n\nfunction isObj(d: unknown): d is Record<string, unknown> {\n return typeof d === 'object' && d !== null;\n}\n\n/**\n * Routing classifiers for the kit's built-in shape kinds\n * (`KIT_SHAPE_KINDS`): each entry matches `data.kind === '<name>'`. Routing\n * kinds and shape kinds are independent — a consumer can register routing\n * kinds that have no matching shape painter (e.g. `'group'`).\n *\n * Spread it into `<SceneCanvas routing={...}>` when scene data carries a\n * `kind` tag. Data with no `kind` that follows the kit's common shapes\n * (`{ path }`, `{ text }`, `{ image }`) wants `inferredNodeRouting`, which\n * SceneCanvas applies when `routing` is unset.\n */\nexport const defaultNodeRouting: readonly NodeRoutingEntry[] = KIT_SHAPE_KINDS.map(\n (name) => ({\n name,\n matches: (data) =>\n isObj(data) &&\n (data as { kind?: unknown }).kind === name,\n }),\n);\n\n/**\n * Routing classifiers used when a consumer doesn't pass `routing` to\n * `<SceneCanvas>`, keyed on the data's shape rather than a `data.kind` tag.\n *\n * Order matters: `'text'` beats `'path'` so an SVG-imported text node\n * carrying a fallback `path` routes to text-edit.\n */\nexport const inferredNodeRouting: readonly NodeRoutingEntry[] = [\n { name: 'text', matches: isTextData },\n { name: 'path', matches: (d) => isObj(d) && d.path != null },\n { name: 'image', matches: (d) => isObj(d) && d.image != null },\n];\n"],"mappings":";;;AAIA,SAASA,EAAM,GAA0C;CACvD,OAAO,OAAOC,KAAM,cAAYA;AAClC;AAaA,IAAaC,IAAkDC,EAAgB,KAC5E,OAAU;CACT;CACA,UAAU,MACRH,EAAMI,CAAI,KACTA,EAA4B,SAASC;AAC1C,EACF,GASaC,IAAmD;CAC9D;EAAE,MAAM;EAAQ,SAASC;CAAW;CACpC;EAAE,MAAM;EAAQ,UAAU,MAAMP,EAAMC,CAAC,KAAKA,EAAE,QAAQ;CAAK;CAC3D;EAAE,MAAM;EAAS,UAAU,MAAMD,EAAMC,CAAC,KAAKA,EAAE,SAAS;CAAK;AAC/D"}
@@ -1 +1 @@
1
- {"version":3,"file":"dispatcherGestureBounds.js","names":["dispatcherGestureIds","out","dispatcher","handle","ids","id","dispatcherInsertBounds","ov","b","insertPreviewExtent","NO_OP_UNSUBSCRIBE","createGestureSource","getDispatcher","fn","createDispatcherPreviewSources","p"],"sources":["../../../src/canvas/SceneCanvas/dispatcherGestureBounds.ts"],"sourcesContent":["/**\n * The dispatcher side of `<Canvas>`'s {@link GestureSource} seam.\n *\n * `<Canvas>` owns the `CanvasHelpers` gesture surface (`getGestureBounds`,\n * `subscribeGestures`, `getGestureVersion`) but knows nothing about the\n * gesture dispatcher — like `previewIdsExtra` / `previewPoseExtra`, the\n * dispatcher's contribution is wired in from `<SceneCanvas>`. This module is\n * the whole of that contribution:\n *\n * - {@link dispatcherGestureIds} — every id any in-flight handle is\n * previewing, so Canvas can resolve each one's preview bounds;\n * - {@link dispatcherInsertBounds} — the AABBs of gestures that have no\n * scene id at all (a drag-to-insert, pre-commit);\n * - {@link createGestureSource} — those two plus the dispatcher's change\n * signal, its in-flight preview surfaces and its published overlays,\n * bundled into the object `<Canvas>` takes.\n *\n * `useDispatcherOverlayLayer` paints the same `insertPreview` overlays this\n * reads, and both size them through `insertPreviewExtent`, so the reported\n * bounds and the drawn preview can't disagree.\n */\nimport type { Dispatcher } from '@weasel-js/routing';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { GestureSource } from '../gestureBounds';\nimport type { OngoingOverlay } from '@weasel-js/routing';\nimport { insertPreviewExtent } from '../insertPreviewExtent';\n\n/**\n * Ids every in-flight handle is previewing.\n *\n * Deliberately *not* `previewIdsExtra`: that one honors\n * `previewHidesSource: false` because its job is deciding whose committed\n * paint to suppress. A clone ghost hides nothing yet still proposes content\n * at the drag target, so gesture bounds must count it.\n */\nexport function dispatcherGestureIds(dispatcher: Dispatcher | null | undefined): string[] {\n const out: string[] = [];\n if (!dispatcher) return out;\n for (const handle of dispatcher.getInFlightHandles()) {\n const ids = handle.previewIds?.();\n if (!ids) continue;\n for (const id of ids) out.push(id);\n }\n return out;\n}\n\n/**\n * World-space AABBs of in-flight gestures with no scene node yet — the\n * `insertPreview` overlay variant, sized by {@link insertPreviewExtent}.\n *\n * Only `insertPreview`. `marquee` and `lasso` are in-flight gestures with\n * geometry too, but they *select* rather than *propose content*: a consumer\n * sizing itself to the gesture (lbx-editor's live auto-length) must not grow\n * because the user swept a selection rectangle. A `polyline` — a slice's cut\n * line, a connector being routed — proposes no content either.\n */\nexport function dispatcherInsertBounds(dispatcher: Dispatcher | null | undefined): Bounds[] {\n const out: Bounds[] = [];\n if (!dispatcher) return out;\n for (const handle of dispatcher.getInFlightHandles()) {\n const ov = handle.overlay?.();\n if (!ov || ov.kind !== 'insertPreview') continue;\n const b = insertPreviewExtent(ov).bounds;\n // A zero-area extent is the pointerdown frame before the first move.\n // Mirrors `useDispatcherOverlayLayer`'s skip, pencil exception included:\n // a pencil gesture can be meaningful at near-zero AABB (closed loop /\n // sub-threshold), so it reports its point rather than nothing.\n if (b.width === 0 && b.height === 0 && ov.shape !== 'pencil') continue;\n out.push({ x: b.x, y: b.y, width: b.width, height: b.height });\n }\n return out;\n}\n\nconst NO_OP_UNSUBSCRIBE = (): void => {};\n\n/**\n * Bundle a dispatcher into the {@link GestureSource} `<Canvas>` consumes.\n *\n * Reads the dispatcher through a getter rather than closing over it, so the\n * source can be built once and keep pointing at the live dispatcher across\n * re-renders. A `null` dispatcher yields the empty answers — no ids, no\n * bounds, a no-op subscription, version 0.\n */\nexport function createGestureSource(\n getDispatcher: () => Dispatcher | null | undefined,\n): GestureSource {\n return {\n ids: () => dispatcherGestureIds(getDispatcher()),\n bounds: () => dispatcherInsertBounds(getDispatcher()),\n subscribe: (fn) => getDispatcher()?.subscribe(fn) ?? NO_OP_UNSUBSCRIBE,\n getVersion: () => getDispatcher()?.getVersion() ?? 0,\n previewSources: () => [...(getDispatcher()?.getInFlightHandles() ?? [])],\n overlays: () => {\n const out: OngoingOverlay[] = [];\n for (const handle of getDispatcher()?.getInFlightHandles() ?? []) {\n const ov = handle.overlay?.();\n if (ov) out.push(ov);\n }\n return out;\n },\n };\n}\n\n/**\n * The dispatcher's contribution to a view's overlay-aware lookups: which ids\n * an in-flight handle hides behind a ghost, and the pose it proposes for one.\n *\n * Separate from {@link createGestureSource} only because `<Canvas>` takes\n * these as two loose props rather than a bundle.\n */\nexport function createDispatcherPreviewSources(\n getDispatcher: () => Dispatcher | null | undefined,\n): {\n previewIdsExtra: () => string[];\n previewPoseExtra: (id: string) => unknown;\n} {\n return {\n // Handles that set `previewHidesSource: false` (clone, etc.) opt out —\n // their ghost still paints, but the source stays at its committed home.\n previewIdsExtra: () => {\n const out: string[] = [];\n for (const handle of getDispatcher()?.getInFlightHandles() ?? []) {\n if (handle.previewHidesSource === false) continue;\n const ids = handle.previewIds?.();\n if (!ids) continue;\n for (const id of ids) out.push(id);\n }\n return out;\n },\n previewPoseExtra: (id: string) => {\n for (const handle of getDispatcher()?.getInFlightHandles() ?? []) {\n const p = handle.previewPose?.(id);\n if (p != null) return p;\n }\n return null;\n },\n };\n}\n"],"mappings":";;AAmCA,SAAgBA,EAAqB,GAAqD;CACxF,IAAMC,IAAgB,CAAC;CACvB,IAAI,CAACC,GAAY,OAAOD;CACxB,KAAK,IAAME,KAAUD,EAAW,mBAAmB,GAAG;EACpD,IAAME,IAAMD,EAAO,aAAa;EAChC,IAAKC,GACL,KAAK,IAAMC,KAAMD,GAAK,EAAI,KAAKC,CAAE;CACnC;CACA,OAAOJ;AACT;AAYA,SAAgBK,EAAuB,GAAqD;CAC1F,IAAML,IAAgB,CAAC;CACvB,IAAI,CAACC,GAAY,OAAOD;CACxB,KAAK,IAAME,KAAUD,EAAW,mBAAmB,GAAG;EACpD,IAAMK,IAAKJ,EAAO,UAAU;EAC5B,IAAI,CAACI,KAAMA,EAAG,SAAS,iBAAiB;EACxC,IAAMC,IAAIC,EAAoBF,CAAE,CAAC,CAAC;EAKlC,CAAIC,EAAE,UAAU,KAAKA,EAAE,WAAW,KAAKD,EAAG,UAAU,aACpDN,EAAI,KAAK;GAAE,GAAGO,EAAE;GAAG,GAAGA,EAAE;GAAG,OAAOA,EAAE;GAAO,QAAQA,EAAE;EAAO,CAAC;CAC/D;CACA,OAAOP;AACT;AAEA,IAAMS,UAAgC,CAAC;AAUvC,SAAgBC,EACd,GACe;CACf,OAAO;EACL,WAAWX,EAAqBY,EAAc,CAAC;EAC/C,cAAcN,EAAuBM,EAAc,CAAC;EACpD,YAAY,MAAOA,EAAc,CAAC,EAAE,UAAUC,CAAE,KAAKH;EACrD,kBAAkBE,EAAc,CAAC,EAAE,WAAW,KAAK;EACnD,sBAAsB,CAAC,GAAIA,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,CAAE;EACvE,gBAAgB;GACd,IAAMX,IAAwB,CAAC;GAC/B,KAAK,IAAME,KAAUS,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,GAAG;IAChE,IAAML,IAAKJ,EAAO,UAAU;IAC5B,AAAII,KAAIN,EAAI,KAAKM,CAAE;GACrB;GACA,OAAON;EACT;CACF;AACF;AASA,SAAgBa,EACd,GAIA;CACA,OAAO;EAGL,uBAAuB;GACrB,IAAMb,IAAgB,CAAC;GACvB,KAAK,IAAME,KAAUS,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,GAAG;IAChE,IAAIT,EAAO,uBAAuB,IAAO;IACzC,IAAMC,IAAMD,EAAO,aAAa;IAChC,IAAKC,GACL,KAAK,IAAMC,KAAMD,GAAK,EAAI,KAAKC,CAAE;GACnC;GACA,OAAOJ;EACT;EACA,mBAAmB,MAAe;GAChC,KAAK,IAAME,KAAUS,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,GAAG;IAChE,IAAMG,IAAIZ,EAAO,cAAcE,CAAE;IACjC,IAAIU,KAAK,MAAM,OAAOA;GACxB;GACA,OAAO;EACT;CACF;AACF"}
1
+ {"version":3,"file":"dispatcherGestureBounds.js","names":["dispatcherGestureIds","out","dispatcher","handle","ids","id","dispatcherInsertBounds","ov","b","insertPreviewExtent","NO_OP_UNSUBSCRIBE","createGestureSource","getDispatcher","fn","createDispatcherPreviewSources","p"],"sources":["../../../src/canvas/SceneCanvas/dispatcherGestureBounds.ts"],"sourcesContent":["/**\n * The dispatcher side of `<Canvas>`'s {@link GestureSource} seam: `<Canvas>`\n * knows nothing about the gesture dispatcher, so `<SceneCanvas>` wires its\n * contribution in from here.\n *\n * `useDispatcherOverlayLayer` paints the same `insertPreview` overlays this\n * reads, and both size them through `insertPreviewExtent`, so the reported\n * bounds and the drawn preview can't disagree.\n */\nimport type { Dispatcher } from '@weasel-js/routing';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { GestureSource } from '../gestureBounds';\nimport type { OngoingOverlay } from '@weasel-js/routing';\nimport { insertPreviewExtent } from '../insertPreviewExtent';\n\n/**\n * Ids every in-flight handle is previewing.\n *\n * Deliberately *not* `previewIdsExtra`: that one honors\n * `previewHidesSource: false` because its job is deciding whose committed\n * paint to suppress. A clone ghost hides nothing yet still proposes content\n * at the drag target, so gesture bounds must count it.\n */\nexport function dispatcherGestureIds(dispatcher: Dispatcher | null | undefined): string[] {\n const out: string[] = [];\n if (!dispatcher) return out;\n for (const handle of dispatcher.getInFlightHandles()) {\n const ids = handle.previewIds?.();\n if (!ids) continue;\n for (const id of ids) out.push(id);\n }\n return out;\n}\n\n/**\n * World-space AABBs of in-flight gestures with no scene node yet — the\n * `insertPreview` overlay variant, sized by {@link insertPreviewExtent}.\n *\n * Only `insertPreview`. `marquee`, `lasso`, and `polyline` are in-flight\n * gestures with geometry too, but they do not *propose content*: a consumer\n * sizing itself to the gesture must not grow because the user swept a\n * selection rectangle.\n */\nexport function dispatcherInsertBounds(dispatcher: Dispatcher | null | undefined): Bounds[] {\n const out: Bounds[] = [];\n if (!dispatcher) return out;\n for (const handle of dispatcher.getInFlightHandles()) {\n const ov = handle.overlay?.();\n if (!ov || ov.kind !== 'insertPreview') continue;\n const b = insertPreviewExtent(ov).bounds;\n // A zero-area extent is the pointerdown frame before the first move. A\n // pencil gesture can be meaningful at near-zero AABB, so it reports its\n // point rather than nothing.\n if (b.width === 0 && b.height === 0 && ov.shape !== 'pencil') continue;\n out.push({ x: b.x, y: b.y, width: b.width, height: b.height });\n }\n return out;\n}\n\nconst NO_OP_UNSUBSCRIBE = (): void => {};\n\n/**\n * Bundle a dispatcher into the {@link GestureSource} `<Canvas>` consumes.\n * The getter lets the source be built once and keep pointing at the live\n * dispatcher across re-renders. A `null` dispatcher yields the empty answers.\n */\nexport function createGestureSource(\n getDispatcher: () => Dispatcher | null | undefined,\n): GestureSource {\n return {\n ids: () => dispatcherGestureIds(getDispatcher()),\n bounds: () => dispatcherInsertBounds(getDispatcher()),\n subscribe: (fn) => getDispatcher()?.subscribe(fn) ?? NO_OP_UNSUBSCRIBE,\n getVersion: () => getDispatcher()?.getVersion() ?? 0,\n previewSources: () => [...(getDispatcher()?.getInFlightHandles() ?? [])],\n overlays: () => {\n const out: OngoingOverlay[] = [];\n for (const handle of getDispatcher()?.getInFlightHandles() ?? []) {\n const ov = handle.overlay?.();\n if (ov) out.push(ov);\n }\n return out;\n },\n };\n}\n\n/**\n * The dispatcher's contribution to a view's overlay-aware lookups: which ids\n * an in-flight handle hides behind a ghost, and the pose it proposes for one.\n */\nexport function createDispatcherPreviewSources(\n getDispatcher: () => Dispatcher | null | undefined,\n): {\n previewIdsExtra: () => string[];\n previewPoseExtra: (id: string) => unknown;\n} {\n return {\n // Handles that set `previewHidesSource: false` (clone, etc.) opt out —\n // their ghost still paints, but the source stays at its committed home.\n previewIdsExtra: () => {\n const out: string[] = [];\n for (const handle of getDispatcher()?.getInFlightHandles() ?? []) {\n if (handle.previewHidesSource === false) continue;\n const ids = handle.previewIds?.();\n if (!ids) continue;\n for (const id of ids) out.push(id);\n }\n return out;\n },\n previewPoseExtra: (id: string) => {\n for (const handle of getDispatcher()?.getInFlightHandles() ?? []) {\n const p = handle.previewPose?.(id);\n if (p != null) return p;\n }\n return null;\n },\n };\n}\n"],"mappings":";;AAuBA,SAAgBA,EAAqB,GAAqD;CACxF,IAAMC,IAAgB,CAAC;CACvB,IAAI,CAACC,GAAY,OAAOD;CACxB,KAAK,IAAME,KAAUD,EAAW,mBAAmB,GAAG;EACpD,IAAME,IAAMD,EAAO,aAAa;EAChC,IAAKC,GACL,KAAK,IAAMC,KAAMD,GAAK,EAAI,KAAKC,CAAE;CACnC;CACA,OAAOJ;AACT;AAWA,SAAgBK,EAAuB,GAAqD;CAC1F,IAAML,IAAgB,CAAC;CACvB,IAAI,CAACC,GAAY,OAAOD;CACxB,KAAK,IAAME,KAAUD,EAAW,mBAAmB,GAAG;EACpD,IAAMK,IAAKJ,EAAO,UAAU;EAC5B,IAAI,CAACI,KAAMA,EAAG,SAAS,iBAAiB;EACxC,IAAMC,IAAIC,EAAoBF,CAAE,CAAC,CAAC;EAIlC,CAAIC,EAAE,UAAU,KAAKA,EAAE,WAAW,KAAKD,EAAG,UAAU,aACpDN,EAAI,KAAK;GAAE,GAAGO,EAAE;GAAG,GAAGA,EAAE;GAAG,OAAOA,EAAE;GAAO,QAAQA,EAAE;EAAO,CAAC;CAC/D;CACA,OAAOP;AACT;AAEA,IAAMS,UAAgC,CAAC;AAOvC,SAAgBC,EACd,GACe;CACf,OAAO;EACL,WAAWX,EAAqBY,EAAc,CAAC;EAC/C,cAAcN,EAAuBM,EAAc,CAAC;EACpD,YAAY,MAAOA,EAAc,CAAC,EAAE,UAAUC,CAAE,KAAKH;EACrD,kBAAkBE,EAAc,CAAC,EAAE,WAAW,KAAK;EACnD,sBAAsB,CAAC,GAAIA,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,CAAE;EACvE,gBAAgB;GACd,IAAMX,IAAwB,CAAC;GAC/B,KAAK,IAAME,KAAUS,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,GAAG;IAChE,IAAML,IAAKJ,EAAO,UAAU;IAC5B,AAAII,KAAIN,EAAI,KAAKM,CAAE;GACrB;GACA,OAAON;EACT;CACF;AACF;AAMA,SAAgBa,EACd,GAIA;CACA,OAAO;EAGL,uBAAuB;GACrB,IAAMb,IAAgB,CAAC;GACvB,KAAK,IAAME,KAAUS,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,GAAG;IAChE,IAAIT,EAAO,uBAAuB,IAAO;IACzC,IAAMC,IAAMD,EAAO,aAAa;IAChC,IAAKC,GACL,KAAK,IAAMC,KAAMD,GAAK,EAAI,KAAKC,CAAE;GACnC;GACA,OAAOJ;EACT;EACA,mBAAmB,MAAe;GAChC,KAAK,IAAME,KAAUS,EAAc,CAAC,EAAE,mBAAmB,KAAK,CAAC,GAAG;IAChE,IAAMG,IAAIZ,EAAO,cAAcE,CAAE;IACjC,IAAIU,KAAK,MAAM,OAAOA;GACxB;GACA,OAAO;EACT;CACF;AACF"}