@weasel-js/core 1.9.4 → 1.10.1

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 (1191) hide show
  1. package/CHANGELOG.md +918 -0
  2. package/README.md +38 -3
  3. package/dist/WeaselProvider.js +5 -7
  4. package/dist/WeaselProvider.js.map +1 -1
  5. package/dist/affordances/composeAffordanceLayer.js +92 -84
  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 +71 -101
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  11. package/dist/affordances/pathAnchors.js +50 -28
  12. package/dist/affordances/pathAnchors.js.map +1 -1
  13. package/dist/affordances/rotateCursor.js +12 -0
  14. package/dist/affordances/rotateCursor.js.map +1 -0
  15. package/dist/affordances/rotationHandle.js +44 -46
  16. package/dist/affordances/rotationHandle.js.map +1 -1
  17. package/dist/animation/behaviors/coast.js +21 -0
  18. package/dist/animation/behaviors/coast.js.map +1 -0
  19. package/dist/animation/behaviors/coastByWrite.js +107 -0
  20. package/dist/animation/behaviors/coastByWrite.js.map +1 -0
  21. package/dist/animation/behaviors/coastOnTargets.js +94 -0
  22. package/dist/animation/behaviors/coastOnTargets.js.map +1 -0
  23. package/dist/animation/behaviors/momentum.js +48 -136
  24. package/dist/animation/behaviors/momentum.js.map +1 -1
  25. package/dist/animation/clipTargets.js +12 -0
  26. package/dist/animation/clipTargets.js.map +1 -0
  27. package/dist/animation/index.js +15 -20
  28. package/dist/animation/poseHelpers.js +112 -33
  29. package/dist/animation/poseHelpers.js.map +1 -1
  30. package/dist/animation/poseTarget.js +115 -0
  31. package/dist/animation/poseTarget.js.map +1 -0
  32. package/dist/animation/reflow.js +113 -83
  33. package/dist/animation/reflow.js.map +1 -1
  34. package/dist/animation/rewind.js +66 -0
  35. package/dist/animation/rewind.js.map +1 -0
  36. package/dist/animation/rig/bindRig.js +85 -53
  37. package/dist/animation/rig/bindRig.js.map +1 -1
  38. package/dist/animation/rig/rigNode.js +99 -0
  39. package/dist/animation/rig/rigNode.js.map +1 -0
  40. package/dist/animation/rig/rigSeat.js +59 -0
  41. package/dist/animation/rig/rigSeat.js.map +1 -0
  42. package/dist/animation/rig/skinBinding.js +64 -0
  43. package/dist/animation/rig/skinBinding.js.map +1 -0
  44. package/dist/animation/rig/useRig.js +31 -16
  45. package/dist/animation/rig/useRig.js.map +1 -1
  46. package/dist/animation/wrappers/animateLifecycle.js +8 -7
  47. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  48. package/dist/animation/wrappers/animateOnSetPose.js +31 -31
  49. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  50. package/dist/animation/wrappers/instantPose.js.map +1 -1
  51. package/dist/animation/writtenPoseTarget.js +33 -0
  52. package/dist/animation/writtenPoseTarget.js.map +1 -0
  53. package/dist/autoPoseDescriptor-DHg5KqaJ.d.ts +27 -0
  54. package/dist/barrel/canvas.js +32 -0
  55. package/dist/barrel/chrome.js +10 -10
  56. package/dist/barrel/input.js +16 -17
  57. package/dist/barrel/interactions.js +34 -37
  58. package/dist/barrel/paint.js +11 -18
  59. package/dist/barrel/paths.js +13 -19
  60. package/dist/barrel/renderer.js +14 -20
  61. package/dist/barrel/routing.js +54 -47
  62. package/dist/barrel/scene.js +37 -0
  63. package/dist/barrel/text.js +9 -18
  64. package/dist/barrel/viewport.js +44 -51
  65. package/dist/canvas/Canvas.js +270 -475
  66. package/dist/canvas/Canvas.js.map +1 -1
  67. package/dist/canvas/CanvasView.js +168 -190
  68. package/dist/canvas/CanvasView.js.map +1 -1
  69. package/dist/canvas/CursorCoordsHud.js +24 -25
  70. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  71. package/dist/canvas/DrawCanvas.js +39 -56
  72. package/dist/canvas/DrawCanvas.js.map +1 -1
  73. package/dist/canvas/ModalityHud.js.map +1 -1
  74. package/dist/canvas/NodeShape.js +28 -29
  75. package/dist/canvas/NodeShape.js.map +1 -1
  76. package/dist/canvas/PickHud.js.map +1 -1
  77. package/dist/canvas/SceneCanvas/DevHuds.js +40 -0
  78. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -0
  79. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +66 -107
  80. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -1
  81. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +33 -36
  82. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  83. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +38 -50
  84. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
  85. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +3 -3
  86. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -1
  87. package/dist/canvas/SceneCanvas/coordTrace.js +37 -1
  88. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -1
  89. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +319 -270
  90. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +1 -1
  92. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -1
  94. package/dist/canvas/SceneCanvas/features.js +71 -62
  95. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  96. package/dist/canvas/SceneCanvas/insertPreviewCommands.js +97 -0
  97. package/dist/canvas/SceneCanvas/insertPreviewCommands.js.map +1 -0
  98. package/dist/canvas/SceneCanvas/isDev.js.map +1 -1
  99. package/dist/canvas/SceneCanvas/poseGeometry.js +33 -37
  100. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  101. package/dist/canvas/SceneCanvas/props.js +15 -14
  102. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/scenePointQuery.js +50 -0
  104. package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -0
  105. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +52 -0
  106. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -0
  107. package/dist/canvas/SceneCanvas/toolRegistry.js +23 -0
  108. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -0
  109. package/dist/canvas/SceneCanvas/useActionTunings.js +17 -0
  110. package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -0
  111. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +6 -1
  112. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -1
  113. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  114. package/dist/canvas/SceneCanvas/useBuiltinTools.js +21 -0
  115. package/dist/canvas/SceneCanvas/useBuiltinTools.js.map +1 -0
  116. package/dist/canvas/SceneCanvas/useCanvasCamera.js +46 -0
  117. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -0
  118. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +20 -0
  119. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -0
  120. package/dist/canvas/SceneCanvas/useCanvasSelection.js +16 -0
  121. package/dist/canvas/SceneCanvas/useCanvasSelection.js.map +1 -0
  122. package/dist/canvas/SceneCanvas/useCanvasTools.js +67 -0
  123. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -0
  124. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +49 -113
  125. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  126. package/dist/canvas/SceneCanvas/useHeldModifiers.js +20 -0
  127. package/dist/canvas/SceneCanvas/useHeldModifiers.js.map +1 -0
  128. package/dist/canvas/SceneCanvas/useNodeAtPoint.js +26 -0
  129. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -0
  130. package/dist/canvas/SceneCanvas/useNodeKinds.js +26 -0
  131. package/dist/canvas/SceneCanvas/useNodeKinds.js.map +1 -0
  132. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +51 -41
  133. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  134. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js +47 -0
  135. package/dist/canvas/SceneCanvas/useSceneCanvasHandle.js.map +1 -0
  136. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +66 -0
  137. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -0
  138. package/dist/canvas/SceneCanvas/useSceneChrome.js +59 -0
  139. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -0
  140. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +23 -0
  141. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -0
  142. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +65 -101
  143. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  144. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js +37 -0
  145. package/dist/canvas/SceneCanvas/useSceneSlotLayers.js.map +1 -0
  146. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +38 -0
  147. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -0
  148. package/dist/canvas/SceneCanvas/useViewLayerGate.js +20 -0
  149. package/dist/canvas/SceneCanvas/useViewLayerGate.js.map +1 -0
  150. package/dist/canvas/SceneCanvas/useViewportActions.js +9 -1
  151. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  152. package/dist/canvas/SceneCanvas/worldPointAt.js +8 -0
  153. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -0
  154. package/dist/canvas/SceneCanvas.js +301 -708
  155. package/dist/canvas/SceneCanvas.js.map +1 -1
  156. package/dist/canvas/SceneViewCanvas.js +41 -47
  157. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  158. package/dist/canvas/SurfaceCanvas.js +40 -0
  159. package/dist/canvas/SurfaceCanvas.js.map +1 -0
  160. package/dist/canvas/adapterDerivedPath.js +26 -0
  161. package/dist/canvas/adapterDerivedPath.js.map +1 -0
  162. package/dist/canvas/adapterPickSource.js +34 -0
  163. package/dist/canvas/adapterPickSource.js.map +1 -0
  164. package/dist/canvas/affordanceAt.js +12 -2
  165. package/dist/canvas/affordanceAt.js.map +1 -1
  166. package/dist/canvas/buildSceneLayer.js +81 -61
  167. package/dist/canvas/buildSceneLayer.js.map +1 -1
  168. package/dist/canvas/buildSceneTree.js +56 -34
  169. package/dist/canvas/buildSceneTree.js.map +1 -1
  170. package/dist/canvas/canvasRenderer.js +40 -44
  171. package/dist/canvas/canvasRenderer.js.map +1 -1
  172. package/dist/canvas/colorOverrides.js.map +1 -1
  173. package/dist/canvas/copiesAbove.js +27 -0
  174. package/dist/canvas/copiesAbove.js.map +1 -0
  175. package/dist/canvas/defaultDrawOne.js +25 -24
  176. package/dist/canvas/defaultDrawOne.js.map +1 -1
  177. package/dist/canvas/deps/areaSelect.js +4 -4
  178. package/dist/canvas/deps/areaSelect.js.map +1 -1
  179. package/dist/canvas/deps/debug.js.map +1 -1
  180. package/dist/canvas/deps/editAnchors.js +47 -71
  181. package/dist/canvas/deps/editAnchors.js.map +1 -1
  182. package/dist/canvas/deps/geometryProjection.js.map +1 -1
  183. package/dist/canvas/deps/hitTestArea.js +45 -25
  184. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  185. package/dist/canvas/deps/insert.js +149 -104
  186. package/dist/canvas/deps/insert.js.map +1 -1
  187. package/dist/canvas/deps/lassoSelect.js +5 -5
  188. package/dist/canvas/deps/lassoSelect.js.map +1 -1
  189. package/dist/canvas/deps/layout.js +9 -15
  190. package/dist/canvas/deps/layout.js.map +1 -1
  191. package/dist/canvas/deps/poseDescriptor.js +1 -1
  192. package/dist/canvas/deps/poseDescriptor.js.map +1 -1
  193. package/dist/canvas/deps/resizePolicy.js.map +1 -1
  194. package/dist/canvas/deps/slice.js +44 -45
  195. package/dist/canvas/deps/slice.js.map +1 -1
  196. package/dist/canvas/deps/textEdit.js +8 -8
  197. package/dist/canvas/deps/textEdit.js.map +1 -1
  198. package/dist/canvas/deps/view.js.map +1 -1
  199. package/dist/canvas/derivedPath.js +69 -43
  200. package/dist/canvas/derivedPath.js.map +1 -1
  201. package/dist/canvas/drawEnvelope.js +8 -4
  202. package/dist/canvas/drawEnvelope.js.map +1 -1
  203. package/dist/canvas/getNodeAtPoint.js +2 -6
  204. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  205. package/dist/canvas/hud.module.js.map +1 -1
  206. package/dist/canvas/insertPreviewExtent.js +33 -31
  207. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  208. package/dist/canvas/layerOrder.js.map +1 -1
  209. package/dist/canvas/layerSlots.js +6 -1
  210. package/dist/canvas/layerSlots.js.map +1 -1
  211. package/dist/canvas/nodeShapes/derivedPainter.js +12 -12
  212. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -1
  213. package/dist/canvas/nodeShapes/imagePainter.js +10 -10
  214. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -1
  215. package/dist/canvas/nodeShapes/memo.js.map +1 -1
  216. package/dist/canvas/nodeShapes/nodePaint.js +34 -23
  217. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -1
  218. package/dist/canvas/nodeShapes/pathPainter.js +23 -22
  219. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -1
  220. package/dist/canvas/nodeShapes/poseBox.js +6 -6
  221. package/dist/canvas/nodeShapes/poseBox.js.map +1 -1
  222. package/dist/canvas/nodeShapes/rectFallbackPainter.js +8 -8
  223. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -1
  224. package/dist/canvas/nodeShapes/shapePainter.js +16 -16
  225. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -1
  226. package/dist/canvas/nodeShapes/textPainter.js +1 -1
  227. package/dist/canvas/nodeShapes/textPainter.js.map +1 -1
  228. package/dist/canvas/overChildren.js +29 -0
  229. package/dist/canvas/overChildren.js.map +1 -0
  230. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  231. package/dist/canvas/paintCull.js +6 -8
  232. package/dist/canvas/paintCull.js.map +1 -1
  233. package/dist/{features/cursor → canvas}/paintedCursorLayer.js +2 -2
  234. package/dist/canvas/paintedCursorLayer.js.map +1 -0
  235. package/dist/canvas/pickReach.js +23 -0
  236. package/dist/canvas/pickReach.js.map +1 -0
  237. package/dist/canvas/pickWalk.js +43 -70
  238. package/dist/canvas/pickWalk.js.map +1 -1
  239. package/dist/canvas/planeClips.js +18 -19
  240. package/dist/canvas/planeClips.js.map +1 -1
  241. package/dist/canvas/poseCascade.js +41 -0
  242. package/dist/canvas/poseCascade.js.map +1 -0
  243. package/dist/canvas/poseRotation.js +1 -3
  244. package/dist/canvas/poseRotation.js.map +1 -1
  245. package/dist/canvas/rasterReadback.js +22 -0
  246. package/dist/canvas/rasterReadback.js.map +1 -0
  247. package/dist/canvas/renderDebugSnapshot.js +12 -12
  248. package/dist/canvas/renderDebugSnapshot.js.map +1 -1
  249. package/dist/canvas/renderNeeds.js +3 -3
  250. package/dist/canvas/renderNeeds.js.map +1 -1
  251. package/dist/canvas/renderSceneToPixels.js +64 -83
  252. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  253. package/dist/canvas/sceneAdapter.js +59 -144
  254. package/dist/canvas/sceneAdapter.js.map +1 -1
  255. package/dist/canvas/sceneClipboard.js +1 -1
  256. package/dist/canvas/sceneClipboard.js.map +1 -1
  257. package/dist/canvas/sceneLayerPaint.js +4 -4
  258. package/dist/canvas/sceneLayerPaint.js.map +1 -1
  259. package/dist/canvas/sceneSlotWiring.js +10 -9
  260. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  261. package/dist/canvas/sceneViewRender.js +37 -42
  262. package/dist/canvas/sceneViewRender.js.map +1 -1
  263. package/dist/canvas/slopsDebugLayer.js +4 -4
  264. package/dist/canvas/slopsDebugLayer.js.map +1 -1
  265. package/dist/canvas/useCanvasRenderer.js +23 -11
  266. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  267. package/dist/canvas/useCanvasSurface.js +31 -0
  268. package/dist/canvas/useCanvasSurface.js.map +1 -0
  269. package/dist/canvas/useCanvasView.js +51 -44
  270. package/dist/canvas/useCanvasView.js.map +1 -1
  271. package/dist/canvas/useFrameLoop.js +11 -12
  272. package/dist/canvas/useFrameLoop.js.map +1 -1
  273. package/dist/canvas/useHostAnchor.js +35 -33
  274. package/dist/canvas/useHostAnchor.js.map +1 -1
  275. package/dist/canvas/useLateContentRedraw.js +8 -8
  276. package/dist/canvas/useLateContentRedraw.js.map +1 -1
  277. package/dist/canvas/useSceneAdapter.js +22 -0
  278. package/dist/canvas/useSceneAdapter.js.map +1 -0
  279. package/dist/canvas/useSceneLayerList.js +4 -14
  280. package/dist/canvas/useSceneLayerList.js.map +1 -1
  281. package/dist/canvas/useSurfaceInput.js +39 -0
  282. package/dist/canvas/useSurfaceInput.js.map +1 -0
  283. package/dist/canvas/useToolCursor.js +29 -0
  284. package/dist/canvas/useToolCursor.js.map +1 -0
  285. package/dist/canvas/useViewHelpers.js +46 -85
  286. package/dist/canvas/useViewHelpers.js.map +1 -1
  287. package/dist/canvas/viewInputs.js.map +1 -1
  288. package/dist/canvas/viewRegistry.js +40 -34
  289. package/dist/canvas/viewRegistry.js.map +1 -1
  290. package/dist/canvas/watchElementMove.js +43 -0
  291. package/dist/canvas/watchElementMove.js.map +1 -0
  292. package/dist/canvas/wrapNodeOutput.js +7 -2
  293. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  294. package/dist/clipboard.d.ts +7 -14
  295. package/dist/{types-B4iJRHC3.d.ts → clone-C0eADtS0.d.ts} +129 -84
  296. package/dist/clone.d.ts +4 -8
  297. package/dist/clone.js +0 -2
  298. package/dist/core/device/targets.js.map +1 -1
  299. package/dist/core/device/useDeviceProfile.js +13 -13
  300. package/dist/core/device/useDeviceProfile.js.map +1 -1
  301. package/dist/{interactions/actions/resize → core/geometry}/autoPoseDescriptor.js +8 -7
  302. package/dist/core/geometry/autoPoseDescriptor.js.map +1 -0
  303. package/dist/core/geometry/pathPoseDescriptor.js +88 -0
  304. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -0
  305. package/dist/core/geometry/poseDescriptor.js +102 -29
  306. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  307. package/dist/core/geometry/regionHit.js +35 -37
  308. package/dist/core/geometry/regionHit.js.map +1 -1
  309. package/dist/core/geometry/targetFrame.js +94 -0
  310. package/dist/core/geometry/targetFrame.js.map +1 -0
  311. package/dist/core/geometry/unionBounds.js +4 -5
  312. package/dist/core/geometry/unionBounds.js.map +1 -1
  313. package/dist/core/layers/backgroundFill.js +31 -0
  314. package/dist/core/layers/backgroundFill.js.map +1 -0
  315. package/dist/{features/groups → core/layers}/children.js +2 -4
  316. package/dist/core/layers/children.js.map +1 -0
  317. package/dist/{features/focus → core/layers}/gateLayer.js +2 -2
  318. package/dist/core/layers/gateLayer.js.map +1 -0
  319. package/dist/core/layers/layerGroup.js +40 -0
  320. package/dist/core/layers/layerGroup.js.map +1 -0
  321. package/dist/core/layers/render.js +50 -76
  322. package/dist/core/layers/render.js.map +1 -1
  323. package/dist/core/ops/create.js +2 -2
  324. package/dist/core/ops/create.js.map +1 -1
  325. package/dist/core/ops/createHistory.js +9 -9
  326. package/dist/core/ops/createHistory.js.map +1 -1
  327. package/dist/core/ops/delete.js +19 -23
  328. package/dist/core/ops/delete.js.map +1 -1
  329. package/dist/core/ops/reorder/index.js +3 -7
  330. package/dist/core/ops/reorder/index.js.map +1 -1
  331. package/dist/core/ops/reorder/setChildOrder.js +2 -4
  332. package/dist/core/ops/reorder/setChildOrder.js.map +1 -1
  333. package/dist/core/ops/reparent.js +0 -1
  334. package/dist/core/ops/reparent.js.map +1 -1
  335. package/dist/core/ops/slot.js +3 -6
  336. package/dist/core/ops/slot.js.map +1 -1
  337. package/dist/core/pages/fitViewToPage.js +15 -0
  338. package/dist/core/pages/fitViewToPage.js.map +1 -0
  339. package/dist/core/pages/pages.js +65 -0
  340. package/dist/core/pages/pages.js.map +1 -0
  341. package/dist/core/pages/pagesLayer.js +27 -0
  342. package/dist/core/pages/pagesLayer.js.map +1 -0
  343. package/dist/core/paint/meshKind.js +16 -0
  344. package/dist/core/paint/meshKind.js.map +1 -0
  345. package/dist/{features/meshPaint/lazyKind.js → core/paint/meshKindLazy.js} +104 -93
  346. package/dist/core/paint/meshKindLazy.js.map +1 -0
  347. package/dist/core/paint/paintKindEntry.js +8 -0
  348. package/dist/core/paint/paintKindEntry.js.map +1 -0
  349. package/dist/core/paint/paintKinds.js +144 -0
  350. package/dist/core/paint/paintKinds.js.map +1 -0
  351. package/dist/core/paint/registerMesh.js +7 -0
  352. package/dist/core/paint/registerMesh.js.map +1 -0
  353. package/dist/core/scene/NodeProperties.js.map +1 -1
  354. package/dist/core/scene/NodeRouting.js.map +1 -1
  355. package/dist/core/scene/arrivalWindow.js +65 -64
  356. package/dist/core/scene/arrivalWindow.js.map +1 -1
  357. package/dist/core/scene/boundOps.js +40 -0
  358. package/dist/core/scene/boundOps.js.map +1 -0
  359. package/dist/core/scene/composeFrame.js +9 -6
  360. package/dist/core/scene/composeFrame.js.map +1 -1
  361. package/dist/core/scene/composePose.js +105 -0
  362. package/dist/core/scene/composePose.js.map +1 -0
  363. package/dist/core/scene/depMemo.js +31 -6
  364. package/dist/core/scene/depMemo.js.map +1 -1
  365. package/dist/core/scene/derivedPath.js +19 -20
  366. package/dist/core/scene/derivedPath.js.map +1 -1
  367. package/dist/core/scene/editMode.js +26 -0
  368. package/dist/core/scene/editMode.js.map +1 -0
  369. package/dist/core/scene/effectivePose.js +42 -39
  370. package/dist/core/scene/effectivePose.js.map +1 -1
  371. package/dist/core/scene/fieldEdits.js +98 -0
  372. package/dist/core/scene/fieldEdits.js.map +1 -0
  373. package/dist/core/scene/historyFacade.js +122 -70
  374. package/dist/core/scene/historyFacade.js.map +1 -1
  375. package/dist/core/scene/historyForm.js +6 -0
  376. package/dist/core/scene/historyForm.js.map +1 -0
  377. package/dist/core/scene/kitOps.js +83 -71
  378. package/dist/core/scene/kitOps.js.map +1 -1
  379. package/dist/core/scene/kitRegistry.js.map +1 -1
  380. package/dist/core/scene/layerStack.js +105 -12
  381. package/dist/core/scene/layerStack.js.map +1 -1
  382. package/dist/core/scene/layoutPass.js +58 -59
  383. package/dist/core/scene/layoutPass.js.map +1 -1
  384. package/dist/{features/groups → core/scene}/nestedHit.js +3 -3
  385. package/dist/core/scene/nestedHit.js.map +1 -0
  386. package/dist/core/scene/nodeFnFields.js +16 -9
  387. package/dist/core/scene/nodeFnFields.js.map +1 -1
  388. package/dist/core/scene/nodeMemo.js.map +1 -1
  389. package/dist/core/scene/nodeStore.js +72 -71
  390. package/dist/core/scene/nodeStore.js.map +1 -1
  391. package/dist/core/scene/notifier.js +37 -0
  392. package/dist/core/scene/notifier.js.map +1 -0
  393. package/dist/core/scene/opTable.js +50 -0
  394. package/dist/core/scene/opTable.js.map +1 -0
  395. package/dist/core/scene/outerOps.js +67 -0
  396. package/dist/core/scene/outerOps.js.map +1 -0
  397. package/dist/core/scene/poseHold.js +39 -0
  398. package/dist/core/scene/poseHold.js.map +1 -0
  399. package/dist/core/scene/poseOverrides.js +44 -36
  400. package/dist/core/scene/poseOverrides.js.map +1 -1
  401. package/dist/core/scene/poseSnapshot.js.map +1 -1
  402. package/dist/core/scene/reconcileSpecs.js +4 -3
  403. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  404. package/dist/core/scene/recorder.js +86 -0
  405. package/dist/core/scene/recorder.js.map +1 -0
  406. package/dist/core/scene/renderOrder.js.map +1 -1
  407. package/dist/core/scene/scene.js +81 -690
  408. package/dist/core/scene/scene.js.map +1 -1
  409. package/dist/core/scene/sceneEdits.js +58 -0
  410. package/dist/core/scene/sceneEdits.js.map +1 -0
  411. package/dist/core/scene/sceneMutators.js +49 -0
  412. package/dist/core/scene/sceneMutators.js.map +1 -0
  413. package/dist/core/scene/scenePoseAdapter.js +16 -0
  414. package/dist/core/scene/scenePoseAdapter.js.map +1 -0
  415. package/dist/core/scene/sceneRecording.js +91 -0
  416. package/dist/core/scene/sceneRecording.js.map +1 -0
  417. package/dist/core/scene/sceneSelection.js +28 -0
  418. package/dist/core/scene/sceneSelection.js.map +1 -0
  419. package/dist/core/scene/sceneState.js +49 -0
  420. package/dist/core/scene/sceneState.js.map +1 -0
  421. package/dist/core/scene/serialization.js +8 -5
  422. package/dist/core/scene/serialization.js.map +1 -1
  423. package/dist/core/scene/staleReplay.js +51 -0
  424. package/dist/core/scene/staleReplay.js.map +1 -0
  425. package/dist/core/scene/statedFields.js +9 -0
  426. package/dist/core/scene/statedFields.js.map +1 -0
  427. package/dist/core/scene/treeEdits.js +127 -0
  428. package/dist/core/scene/treeEdits.js.map +1 -0
  429. package/dist/core/scene/treeReads.js +26 -0
  430. package/dist/core/scene/treeReads.js.map +1 -0
  431. package/dist/core/scene/types.js.map +1 -1
  432. package/dist/{features/groups → core/scene}/unionOfChildren.js +3 -3
  433. package/dist/core/scene/unionOfChildren.js.map +1 -0
  434. package/dist/core/scene/unitScopes.js +13 -0
  435. package/dist/core/scene/unitScopes.js.map +1 -0
  436. package/dist/core/scene/useScene.js.map +1 -1
  437. package/dist/core/selection/readOnlySelection.js +32 -0
  438. package/dist/core/selection/readOnlySelection.js.map +1 -0
  439. package/dist/core/selection/usePublishSceneSelection.js +26 -0
  440. package/dist/core/selection/usePublishSceneSelection.js.map +1 -0
  441. package/dist/core/selection/useSelection.js +34 -25
  442. package/dist/core/selection/useSelection.js.map +1 -1
  443. package/dist/core/shapeKinds.js.map +1 -1
  444. package/dist/core/stylus/stylus.js.map +1 -1
  445. package/dist/core/stylus/usePointerStylus.js.map +1 -1
  446. package/dist/core/usePaintKinds.js +1 -1
  447. package/dist/core/usePaintKinds.js.map +1 -1
  448. package/dist/core/viewport/clientToWorld.js.map +1 -1
  449. package/dist/core/viewport/fitViewToBounds.js.map +1 -1
  450. package/dist/core/viewport/parallax.js.map +1 -1
  451. package/dist/core/viewport/screenSlop.js +11 -11
  452. package/dist/core/viewport/screenSlop.js.map +1 -1
  453. package/dist/core/viewport/useCanvasSize.js.map +1 -1
  454. package/dist/core/viewport/useDecayLoop.js +31 -33
  455. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  456. package/dist/core/viewport/useNodeOverlayFrame.js +84 -0
  457. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -0
  458. package/dist/core/viewport/useViewAnimation.js +113 -53
  459. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  460. package/dist/core/viewport/view.js +14 -11
  461. package/dist/core/viewport/view.js.map +1 -1
  462. package/dist/core/viewport/wheelHandler.js.map +1 -1
  463. package/dist/core/viewport/zoomAt.js +11 -2
  464. package/dist/core/viewport/zoomAt.js.map +1 -1
  465. package/dist/{cornerHandles-CtCb8a3G.d.ts → cornerHandles-BSKbyuvQ.d.ts} +11 -24
  466. package/dist/debug/createDebugOverlayLayer.js +100 -100
  467. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  468. package/dist/debug/createDebugSink.js.map +1 -1
  469. package/dist/debug/frameStats.js.map +1 -1
  470. package/dist/debug/useDebugSink.js +52 -0
  471. package/dist/debug/useDebugSink.js.map +1 -0
  472. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -1
  473. package/dist/features/chrome-caps/conditions.js.map +1 -1
  474. package/dist/features/chrome-caps/defaults.js.map +1 -1
  475. package/dist/features/chrome-caps/resolve.js.map +1 -1
  476. package/dist/features/chrome-caps/useChromeCaps.js +54 -0
  477. package/dist/features/chrome-caps/useChromeCaps.js.map +1 -0
  478. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  479. package/dist/features/ingestion/contentHandlers.js +25 -19
  480. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  481. package/dist/features/ingestion/imageHandler.js +21 -24
  482. package/dist/features/ingestion/imageHandler.js.map +1 -1
  483. package/dist/features/ingestion/openFilePicker.js.map +1 -1
  484. package/dist/features/ingestion/placement.js +16 -0
  485. package/dist/features/ingestion/placement.js.map +1 -0
  486. package/dist/features/ingestion/svgHandler.js +5 -0
  487. package/dist/features/ingestion/svgHandler.js.map +1 -1
  488. package/dist/features/ingestion/textHandler.js +28 -0
  489. package/dist/features/ingestion/textHandler.js.map +1 -0
  490. package/dist/features/ingestion/useCanvasIngestion.js +48 -0
  491. package/dist/features/ingestion/useCanvasIngestion.js.map +1 -0
  492. package/dist/features/ingestion/weaselJsonHandler.js +5 -0
  493. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  494. package/dist/features/longPress/longPressFeedback.js.map +1 -1
  495. package/dist/features/modes/modeLayers.js +7 -7
  496. package/dist/features/modes/modeLayers.js.map +1 -1
  497. package/dist/features/paths/editablePath.js +63 -0
  498. package/dist/features/paths/editablePath.js.map +1 -0
  499. package/dist/features/paths/index.js +9 -16
  500. package/dist/features/paths/pathEditState.js +41 -0
  501. package/dist/features/paths/pathEditState.js.map +1 -0
  502. package/dist/features/paths/pathEditingOverlayLayer.js +36 -38
  503. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -1
  504. package/dist/features/paths/pathLayer.js +3 -2
  505. package/dist/features/paths/pathLayer.js.map +1 -1
  506. package/dist/features/paths/penPreviewLayer.js +86 -88
  507. package/dist/features/paths/penPreviewLayer.js.map +1 -1
  508. package/dist/features/paths/shapeGenerator.js +89 -0
  509. package/dist/features/paths/shapeGenerator.js.map +1 -0
  510. package/dist/features/paths/usePathEdit.js +34 -0
  511. package/dist/features/paths/usePathEdit.js.map +1 -0
  512. package/dist/features/poseRun/usePoseRun.js +44 -57
  513. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  514. package/dist/features/selection/overlay.js +170 -178
  515. package/dist/features/selection/overlay.js.map +1 -1
  516. package/dist/features/text/index.js +6 -0
  517. package/dist/features/text/textLayer.js +1 -1
  518. package/dist/features/text/textLayer.js.map +1 -1
  519. package/dist/features/text/useSceneTextEdit.js +119 -88
  520. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  521. package/dist/features/viewports/viewResolver.js +28 -24
  522. package/dist/features/viewports/viewResolver.js.map +1 -1
  523. package/dist/features/viewports/viewportLayer.js +25 -36
  524. package/dist/features/viewports/viewportLayer.js.map +1 -1
  525. package/dist/icons/SliceIcon.js +24 -0
  526. package/dist/icons/SliceIcon.js.map +1 -0
  527. package/dist/index.d.ts +5200 -8777
  528. package/dist/index.js +284 -320
  529. package/dist/input/keyState.js +14 -14
  530. package/dist/interactions/actions/actionShortcuts.js.map +1 -1
  531. package/dist/interactions/actions/{defaults/align.js → align/action.js} +15 -16
  532. package/dist/interactions/actions/align/action.js.map +1 -0
  533. package/dist/interactions/actions/align/align.js +24 -24
  534. package/dist/interactions/actions/align/align.js.map +1 -1
  535. package/dist/interactions/actions/booleans/action.js +65 -0
  536. package/dist/interactions/actions/booleans/action.js.map +1 -0
  537. package/dist/interactions/actions/booleans/booleans.js +74 -83
  538. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  539. package/dist/interactions/actions/booleans/operands.js +40 -0
  540. package/dist/interactions/actions/booleans/operands.js.map +1 -0
  541. package/dist/interactions/actions/booleans/pieces.js +45 -0
  542. package/dist/interactions/actions/booleans/pieces.js.map +1 -0
  543. package/dist/interactions/actions/booleans/placement.js +24 -0
  544. package/dist/interactions/actions/booleans/placement.js.map +1 -0
  545. package/dist/interactions/actions/booleans/useBooleans.js +11 -9
  546. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -1
  547. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -1
  548. package/dist/interactions/actions/{defaults/clipboard.js → clipboard/action.js} +19 -19
  549. package/dist/interactions/actions/clipboard/action.js.map +1 -0
  550. package/dist/interactions/actions/clipboard/clipboardOps.js +15 -15
  551. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  552. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  553. package/dist/interactions/actions/clone/action.js +103 -0
  554. package/dist/interactions/actions/clone/action.js.map +1 -0
  555. package/dist/interactions/actions/clone/behaviors.js +52 -0
  556. package/dist/interactions/actions/clone/behaviors.js.map +1 -0
  557. package/dist/interactions/actions/defaultCommitAdapter.js +10 -37
  558. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  559. package/dist/interactions/actions/defaults/anchorEditing.js +69 -74
  560. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  561. package/dist/interactions/actions/defaults/anchorHandles.js +42 -0
  562. package/dist/interactions/actions/defaults/anchorHandles.js.map +1 -0
  563. package/dist/interactions/actions/defaults/anchorJoin.js +92 -0
  564. package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -0
  565. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  566. package/dist/interactions/actions/defaults/bendSegment.js +46 -0
  567. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -0
  568. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -1
  569. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -1
  570. package/dist/interactions/actions/defaults/copySubtree.js +1 -1
  571. package/dist/interactions/actions/defaults/copySubtree.js.map +1 -1
  572. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -1
  573. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  574. package/dist/interactions/actions/defaults/duplicate.js +36 -21
  575. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  576. package/dist/interactions/actions/defaults/enterPathEdit.js +19 -7
  577. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  578. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  579. package/dist/interactions/actions/defaults/group.js +35 -40
  580. package/dist/interactions/actions/defaults/group.js.map +1 -1
  581. package/dist/interactions/actions/defaults/icons/anchorIcons.js +75 -0
  582. package/dist/interactions/actions/defaults/icons/anchorIcons.js.map +1 -0
  583. package/dist/interactions/actions/defaults/icons/booleanIcons.js +24 -1
  584. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -1
  585. package/dist/interactions/actions/defaults/icons/editIcons.js +35 -8
  586. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -1
  587. package/dist/interactions/actions/defaults/icons/outlineIcons.js +39 -1
  588. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -1
  589. package/dist/interactions/actions/defaults/ingest.js +19 -15
  590. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  591. package/dist/interactions/actions/defaults/insertPathAnchor.js +18 -34
  592. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  593. package/dist/interactions/actions/defaults/nudge.js +43 -39
  594. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  595. package/dist/interactions/actions/defaults/pinchZoom.js +29 -29
  596. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  597. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -1
  598. package/dist/interactions/actions/defaults/segmentUnder.js +22 -0
  599. package/dist/interactions/actions/defaults/segmentUnder.js.map +1 -0
  600. package/dist/interactions/actions/defaults/setFill.js +9 -3
  601. package/dist/interactions/actions/defaults/setFill.js.map +1 -1
  602. package/dist/interactions/actions/defaults/setFillOpacity.js +4 -1
  603. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -1
  604. package/dist/interactions/actions/defaults/setStroke.js.map +1 -1
  605. package/dist/interactions/actions/defaults/sliceOps.js +20 -22
  606. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -1
  607. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -1
  608. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -1
  609. package/dist/interactions/actions/defaults/viewportDragPan.js +1 -1
  610. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  611. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -1
  612. package/dist/interactions/actions/defaults/viewportZoom.js +82 -79
  613. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  614. package/dist/interactions/actions/{defaults/distribute.js → distribute/action.js} +18 -19
  615. package/dist/interactions/actions/distribute/action.js.map +1 -0
  616. package/dist/interactions/actions/distribute/distribute.js +15 -15
  617. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  618. package/dist/interactions/actions/edit-anchors/action.js +101 -0
  619. package/dist/interactions/actions/edit-anchors/action.js.map +1 -0
  620. package/dist/interactions/actions/edit-anchors/geometry.js +2 -4
  621. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  622. package/dist/interactions/actions/edit-anchors/preview.js +26 -0
  623. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -0
  624. package/dist/interactions/actions/edit-anchors/symmetry.js +11 -0
  625. package/dist/interactions/actions/edit-anchors/symmetry.js.map +1 -0
  626. package/dist/interactions/actions/flip/action.js +124 -0
  627. package/dist/interactions/actions/flip/action.js.map +1 -0
  628. package/dist/interactions/actions/flip/helpers.js +1 -1
  629. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  630. package/dist/interactions/actions/geometryProjection.js.map +1 -1
  631. package/dist/interactions/actions/gestureFrames.js +18 -0
  632. package/dist/interactions/actions/gestureFrames.js.map +1 -0
  633. package/dist/interactions/actions/gestureLifecycle.js +47 -20
  634. package/dist/interactions/actions/gestureLifecycle.js.map +1 -1
  635. package/dist/interactions/actions/insert/action.js +79 -0
  636. package/dist/interactions/actions/insert/action.js.map +1 -0
  637. package/dist/interactions/actions/insert/commit.js +28 -0
  638. package/dist/interactions/actions/insert/commit.js.map +1 -0
  639. package/dist/interactions/actions/insert/extras.js +65 -0
  640. package/dist/interactions/actions/insert/extras.js.map +1 -0
  641. package/dist/interactions/actions/insert/frame.js +55 -0
  642. package/dist/interactions/actions/insert/frame.js.map +1 -0
  643. package/dist/interactions/actions/insert/geometry.js +35 -0
  644. package/dist/interactions/actions/insert/geometry.js.map +1 -0
  645. package/dist/interactions/actions/insert/repositionAction.js +31 -0
  646. package/dist/interactions/actions/insert/repositionAction.js.map +1 -0
  647. package/dist/interactions/actions/insert/rotateAction.js +21 -0
  648. package/dist/interactions/actions/insert/rotateAction.js.map +1 -0
  649. package/dist/interactions/actions/insert/session.js +59 -0
  650. package/dist/interactions/actions/insert/session.js.map +1 -0
  651. package/dist/interactions/actions/insert/shape.js +34 -0
  652. package/dist/interactions/actions/insert/shape.js.map +1 -0
  653. package/dist/interactions/actions/lasso-select/action.js +143 -0
  654. package/dist/interactions/actions/lasso-select/action.js.map +1 -0
  655. package/dist/interactions/actions/move/action.js +91 -0
  656. package/dist/interactions/actions/move/action.js.map +1 -0
  657. package/dist/interactions/actions/move/behaviors/layoutDrop.js +51 -0
  658. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -0
  659. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +15 -0
  660. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -0
  661. package/dist/interactions/actions/move/behaviors/snapToContainer.js +35 -28
  662. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  663. package/dist/interactions/actions/move/capture.js +108 -0
  664. package/dist/interactions/actions/move/capture.js.map +1 -0
  665. package/dist/interactions/actions/move/commit/index.js +41 -0
  666. package/dist/interactions/actions/move/commit/index.js.map +1 -0
  667. package/dist/interactions/actions/move/commit/layoutDrop.js +44 -0
  668. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -0
  669. package/dist/interactions/actions/move/commit/layoutRelease.js +100 -0
  670. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -0
  671. package/dist/interactions/actions/move/commit/rebase.js +18 -0
  672. package/dist/interactions/actions/move/commit/rebase.js.map +1 -0
  673. package/dist/interactions/actions/move/commit/reparent.js +65 -0
  674. package/dist/interactions/actions/move/commit/reparent.js.map +1 -0
  675. package/dist/interactions/actions/move/delta.js +51 -0
  676. package/dist/interactions/actions/move/delta.js.map +1 -0
  677. package/dist/interactions/actions/move/frame.js +47 -0
  678. package/dist/interactions/actions/move/frame.js.map +1 -0
  679. package/dist/interactions/actions/move/gestureAdapter.js +15 -40
  680. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  681. package/dist/interactions/actions/move/landedDescendants.js +8 -8
  682. package/dist/interactions/actions/move/layout/container.js +94 -0
  683. package/dist/interactions/actions/move/layout/container.js.map +1 -0
  684. package/dist/interactions/actions/move/layout/dragged.js +58 -0
  685. package/dist/interactions/actions/move/layout/dragged.js.map +1 -0
  686. package/dist/interactions/actions/move/layout/dropPass.js +122 -0
  687. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -0
  688. package/dist/interactions/actions/move/layout/exits.js +38 -0
  689. package/dist/interactions/actions/move/layout/exits.js.map +1 -0
  690. package/dist/interactions/actions/move/layout/glide.js +48 -0
  691. package/dist/interactions/actions/move/layout/glide.js.map +1 -0
  692. package/dist/interactions/actions/move/session.js +63 -0
  693. package/dist/interactions/actions/move/session.js.map +1 -0
  694. package/dist/interactions/actions/move/translate.js +61 -0
  695. package/dist/interactions/actions/move/translate.js.map +1 -0
  696. package/dist/interactions/actions/outlines/createOutlines.js +17 -64
  697. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  698. package/dist/interactions/actions/outlines/createOutlinesAction.js +51 -0
  699. package/dist/interactions/actions/outlines/createOutlinesAction.js.map +1 -0
  700. package/dist/interactions/actions/outlines/outlineStroke.js +72 -0
  701. package/dist/interactions/actions/outlines/outlineStroke.js.map +1 -0
  702. package/dist/interactions/actions/outlines/outlineStrokeAction.js +37 -0
  703. package/dist/interactions/actions/outlines/outlineStrokeAction.js.map +1 -0
  704. package/dist/interactions/actions/outlines/replaceWithPaths.js +54 -0
  705. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -0
  706. package/dist/interactions/actions/outlines/strokeRegion.js +27 -0
  707. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -0
  708. package/dist/interactions/actions/pathCommands/cutJoin.js +102 -0
  709. package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -0
  710. package/dist/interactions/actions/pathCommands/livePathEdit.js +64 -0
  711. package/dist/interactions/actions/pathCommands/livePathEdit.js.map +1 -0
  712. package/dist/interactions/actions/pathCommands/pathNodes.js +99 -0
  713. package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -0
  714. package/dist/interactions/actions/pathCommands/simplifyOffset.js +42 -0
  715. package/dist/interactions/actions/pathCommands/simplifyOffset.js.map +1 -0
  716. package/dist/interactions/actions/planeInput.js.map +1 -1
  717. package/dist/interactions/actions/pointerState.js +12 -0
  718. package/dist/interactions/actions/pointerState.js.map +1 -0
  719. package/dist/interactions/actions/poseDescriptorDep.js +1 -1
  720. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  721. package/dist/interactions/actions/poseFrame.js +26 -26
  722. package/dist/interactions/actions/poseFrame.js.map +1 -1
  723. package/dist/interactions/actions/resize/action.js +66 -0
  724. package/dist/interactions/actions/resize/action.js.map +1 -0
  725. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -1
  726. package/dist/interactions/actions/resize/boxFrame.js +16 -0
  727. package/dist/interactions/actions/resize/boxFrame.js.map +1 -0
  728. package/dist/interactions/actions/resize/capture.js +85 -0
  729. package/dist/interactions/actions/resize/capture.js.map +1 -0
  730. package/dist/interactions/actions/resize/commit.js +69 -0
  731. package/dist/interactions/actions/resize/commit.js.map +1 -0
  732. package/dist/interactions/actions/resize/frame.js +88 -0
  733. package/dist/interactions/actions/resize/frame.js.map +1 -0
  734. package/dist/interactions/actions/resize/pointSnap.js +111 -0
  735. package/dist/interactions/actions/resize/pointSnap.js.map +1 -0
  736. package/dist/interactions/actions/resize/replay.js +47 -0
  737. package/dist/interactions/actions/resize/replay.js.map +1 -0
  738. package/dist/interactions/actions/resize/ruleBounds.js +9 -0
  739. package/dist/interactions/actions/resize/ruleBounds.js.map +1 -0
  740. package/dist/interactions/actions/resize/session.js +63 -0
  741. package/dist/interactions/actions/resize/session.js.map +1 -0
  742. package/dist/interactions/actions/resolveOverlays.js +2 -1
  743. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  744. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  745. package/dist/interactions/actions/rotate/action.js +71 -0
  746. package/dist/interactions/actions/rotate/action.js.map +1 -0
  747. package/dist/interactions/actions/rotate/behaviors/index.js +7 -0
  748. package/dist/interactions/actions/rotate/behaviors/index.js.map +1 -0
  749. package/dist/interactions/actions/rotate/behaviors/snapRotation.js +12 -0
  750. package/dist/interactions/actions/rotate/behaviors/snapRotation.js.map +1 -0
  751. package/dist/interactions/actions/rotate/commit.js +40 -0
  752. package/dist/interactions/actions/rotate/commit.js.map +1 -0
  753. package/dist/interactions/actions/rotate/frame.js +65 -0
  754. package/dist/interactions/actions/rotate/frame.js.map +1 -0
  755. package/dist/interactions/actions/rotate/handle.js +12 -12
  756. package/dist/interactions/actions/rotate/handle.js.map +1 -1
  757. package/dist/interactions/actions/rotate/replay.js +22 -0
  758. package/dist/interactions/actions/rotate/replay.js.map +1 -0
  759. package/dist/interactions/actions/rotate/session.js +102 -0
  760. package/dist/interactions/actions/rotate/session.js.map +1 -0
  761. package/dist/interactions/actions/spatialReference.js.map +1 -1
  762. package/dist/interactions/actions/transform-again/action.js +63 -0
  763. package/dist/interactions/actions/transform-again/action.js.map +1 -0
  764. package/dist/interactions/actions/transform-again/memory.js +35 -0
  765. package/dist/interactions/actions/transform-again/memory.js.map +1 -0
  766. package/dist/interactions/actions/useStandardActions.js +84 -61
  767. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  768. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +61 -42
  769. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  770. package/dist/interactions/gestures/shared/originProjection.js +1 -1
  771. package/dist/interactions/gestures/shared/originProjection.js.map +1 -1
  772. package/dist/interactions/gestures/shared/screenTolerance.js +8 -2
  773. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -1
  774. package/dist/interactions/gestures/shared/snap.js.map +1 -1
  775. package/dist/math-CYUjoyyU.d.ts +33 -0
  776. package/dist/math.d.ts +5 -2
  777. package/dist/math.js +6 -6
  778. package/dist/mesh.d.ts +4 -268
  779. package/dist/mesh.js +3 -7
  780. package/dist/move.d.ts +6 -4
  781. package/dist/{originProjection-gHnOup4e.d.ts → originProjection-CoNVpITV.d.ts} +1 -1
  782. package/dist/patterns-builtin.d.ts +1 -118
  783. package/dist/patterns-builtin.js +2 -3
  784. package/dist/poseDescriptor-Bqk-11Rl.d.ts +73 -0
  785. package/dist/renderer.d.ts +1 -92
  786. package/dist/renderer.js +2 -19
  787. package/dist/resize.d.ts +11 -22
  788. package/dist/resize.js +1 -1
  789. package/dist/style.css +1 -1
  790. package/dist/test-hook/install.js.map +1 -1
  791. package/dist/test-hook/useTestHook.js +22 -0
  792. package/dist/test-hook/useTestHook.js.map +1 -0
  793. package/dist/test-seams-D0pyV3pR.d.ts +149 -0
  794. package/dist/test-seams.d.ts +4 -4
  795. package/dist/test-seams.js +2 -2
  796. package/dist/tools/builtin/bone/boneActions.js +130 -0
  797. package/dist/tools/builtin/bone/boneActions.js.map +1 -0
  798. package/dist/tools/builtin/bone/boneOverlay.js +58 -0
  799. package/dist/tools/builtin/bone/boneOverlay.js.map +1 -0
  800. package/dist/tools/builtin/bone/placedRig.js +24 -0
  801. package/dist/tools/builtin/bone/placedRig.js.map +1 -0
  802. package/dist/tools/builtin/bone/rigEditState.js +21 -0
  803. package/dist/tools/builtin/bone/rigEditState.js.map +1 -0
  804. package/dist/tools/builtin/bone/useBoneTool.js +98 -0
  805. package/dist/tools/builtin/bone/useBoneTool.js.map +1 -0
  806. package/dist/tools/builtin/ellipse/useEllipseTool.js +16 -15
  807. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  808. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  809. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  810. package/dist/tools/builtin/image/useImageTool.js.map +1 -1
  811. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  812. package/dist/tools/builtin/line/useLineTool.js +16 -15
  813. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  814. package/dist/tools/builtin/pen/usePenTool.js +162 -164
  815. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  816. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  817. package/dist/tools/builtin/pickTopMostHit.js +11 -14
  818. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  819. package/dist/tools/builtin/polygon/usePolygonTool.js +17 -15
  820. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  821. package/dist/tools/builtin/rect/useRectTool.js +15 -14
  822. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  823. package/dist/tools/builtin/select/adapterPointQuery.js +40 -0
  824. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -0
  825. package/dist/tools/builtin/select/selectionContributions.js +5 -5
  826. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  827. package/dist/tools/builtin/select/useSelectTool.js +44 -71
  828. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  829. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -1
  830. package/dist/tools/builtin/slice/useSliceTool.js +69 -72
  831. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  832. package/dist/tools/builtin/star/useStarTool.js +18 -16
  833. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  834. package/dist/tools/builtin/text/useTextTool.js +10 -2
  835. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  836. package/dist/tools/builtin/weight/useWeightTool.js +77 -0
  837. package/dist/tools/builtin/weight/useWeightTool.js.map +1 -0
  838. package/dist/tools/builtin/weight/weightActions.js +112 -0
  839. package/dist/tools/builtin/weight/weightActions.js.map +1 -0
  840. package/dist/tools/builtin/weight/weightOverlay.js +61 -0
  841. package/dist/tools/builtin/weight/weightOverlay.js.map +1 -0
  842. package/dist/tools/overlayBinding.js.map +1 -1
  843. package/dist/tools/useKeybindings.js +20 -14
  844. package/dist/tools/useKeybindings.js.map +1 -1
  845. package/dist/{types-k-5Oqh-U.d.ts → types-DBbbCy0i.d.ts} +103 -176
  846. package/dist/util/paint.js +1 -1
  847. package/dist/util/paint.js.map +1 -1
  848. package/dist/version.js +1 -1
  849. package/package.json +26 -21
  850. package/dist/animation/colorHelpers.js +0 -135
  851. package/dist/animation/colorHelpers.js.map +0 -1
  852. package/dist/animation/colorRegistry.js +0 -37
  853. package/dist/animation/colorRegistry.js.map +0 -1
  854. package/dist/animation/engine/axes.js +0 -36
  855. package/dist/animation/engine/axes.js.map +0 -1
  856. package/dist/animation/engine/codec.js +0 -170
  857. package/dist/animation/engine/codec.js.map +0 -1
  858. package/dist/animation/engine/integrator.js +0 -12
  859. package/dist/animation/engine/integrator.js.map +0 -1
  860. package/dist/animation/loop.js +0 -60
  861. package/dist/animation/loop.js.map +0 -1
  862. package/dist/animation/observe.js +0 -23
  863. package/dist/animation/observe.js.map +0 -1
  864. package/dist/animation/rig/blendPoses.js +0 -43
  865. package/dist/animation/rig/blendPoses.js.map +0 -1
  866. package/dist/animation/rig/mirrorPose.js +0 -19
  867. package/dist/animation/rig/mirrorPose.js.map +0 -1
  868. package/dist/animation/rig/resolveSkeleton.js +0 -33
  869. package/dist/animation/rig/resolveSkeleton.js.map +0 -1
  870. package/dist/animation/rig/solveIk.js +0 -103
  871. package/dist/animation/rig/solveIk.js.map +0 -1
  872. package/dist/animation/rig/types.js +0 -12
  873. package/dist/animation/rig/types.js.map +0 -1
  874. package/dist/animation/slew.js +0 -27
  875. package/dist/animation/slew.js.map +0 -1
  876. package/dist/animation/stagger.js +0 -146
  877. package/dist/animation/stagger.js.map +0 -1
  878. package/dist/animation/timeline/booking.js +0 -114
  879. package/dist/animation/timeline/booking.js.map +0 -1
  880. package/dist/animation/timeline/createTimeline.js +0 -125
  881. package/dist/animation/timeline/createTimeline.js.map +0 -1
  882. package/dist/animation/timeline/sampleTrack.js +0 -79
  883. package/dist/animation/timeline/sampleTrack.js.map +0 -1
  884. package/dist/animation/useAnimator.js +0 -388
  885. package/dist/animation/useAnimator.js.map +0 -1
  886. package/dist/autoPoseDescriptor-Ct7yqivU.d.ts +0 -108
  887. package/dist/builtins-DPcdghtB.d.ts +0 -1223
  888. package/dist/canvas/MinimapCanvas.js +0 -140
  889. package/dist/canvas/MinimapCanvas.js.map +0 -1
  890. package/dist/canvas/deps/poseComposition.js +0 -11
  891. package/dist/canvas/deps/poseComposition.js.map +0 -1
  892. package/dist/canvas/minimapMath.js +0 -82
  893. package/dist/canvas/minimapMath.js.map +0 -1
  894. package/dist/canvas/toolPreview.js +0 -39
  895. package/dist/canvas/toolPreview.js.map +0 -1
  896. package/dist/core/adapters/arrayAdapter.js +0 -94
  897. package/dist/core/adapters/arrayAdapter.js.map +0 -1
  898. package/dist/core/adapters/useArrayAdapter.js +0 -13
  899. package/dist/core/adapters/useArrayAdapter.js.map +0 -1
  900. package/dist/core/fillInPoseFrame.js +0 -102
  901. package/dist/core/fillInPoseFrame.js.map +0 -1
  902. package/dist/core/geometry/poseFrame.js +0 -44
  903. package/dist/core/geometry/poseFrame.js.map +0 -1
  904. package/dist/core/geometry/poseRotation.js +0 -58
  905. package/dist/core/geometry/poseRotation.js.map +0 -1
  906. package/dist/core/gradient.js +0 -136
  907. package/dist/core/gradient.js.map +0 -1
  908. package/dist/core/markerInset.js +0 -24
  909. package/dist/core/markerInset.js.map +0 -1
  910. package/dist/core/mixed.js +0 -6
  911. package/dist/core/mixed.js.map +0 -1
  912. package/dist/core/paintKinds.js +0 -156
  913. package/dist/core/paintKinds.js.map +0 -1
  914. package/dist/core/scene/pickability.js +0 -6
  915. package/dist/core/scene/pickability.js.map +0 -1
  916. package/dist/core/strokeMarkerShapes.js +0 -139
  917. package/dist/core/strokeMarkerShapes.js.map +0 -1
  918. package/dist/core/strokeMarkers.js +0 -28
  919. package/dist/core/strokeMarkers.js.map +0 -1
  920. package/dist/core/viewport/meanScale.js +0 -8
  921. package/dist/core/viewport/meanScale.js.map +0 -1
  922. package/dist/core/viewport/pxExtent.js +0 -42
  923. package/dist/core/viewport/pxExtent.js.map +0 -1
  924. package/dist/features/cursor/paintedCursorLayer.js.map +0 -1
  925. package/dist/features/focus/gateLayer.js.map +0 -1
  926. package/dist/features/focus/useCanvasFocus.js +0 -29
  927. package/dist/features/focus/useCanvasFocus.js.map +0 -1
  928. package/dist/features/groups/children.js.map +0 -1
  929. package/dist/features/groups/composePose.js +0 -67
  930. package/dist/features/groups/composePose.js.map +0 -1
  931. package/dist/features/groups/nestedHit.js.map +0 -1
  932. package/dist/features/groups/unionOfChildren.js.map +0 -1
  933. package/dist/features/images/imageCache.js +0 -104
  934. package/dist/features/images/imageCache.js.map +0 -1
  935. package/dist/features/ingestion/index.js +0 -8
  936. package/dist/features/meshPaint/bake.js +0 -79
  937. package/dist/features/meshPaint/bake.js.map +0 -1
  938. package/dist/features/meshPaint/bakeCache.js +0 -59
  939. package/dist/features/meshPaint/bakeCache.js.map +0 -1
  940. package/dist/features/meshPaint/handles.js +0 -86
  941. package/dist/features/meshPaint/handles.js.map +0 -1
  942. package/dist/features/meshPaint/lazyKind.js.map +0 -1
  943. package/dist/features/meshPaint/meshPaint.js +0 -239
  944. package/dist/features/meshPaint/meshPaint.js.map +0 -1
  945. package/dist/features/meshPaint/meshShader.js +0 -6
  946. package/dist/features/meshPaint/meshShader.js.map +0 -1
  947. package/dist/features/meshPaint/register.js +0 -7
  948. package/dist/features/meshPaint/register.js.map +0 -1
  949. package/dist/features/meshPaint/surface.js +0 -110
  950. package/dist/features/meshPaint/surface.js.map +0 -1
  951. package/dist/features/minimap/actions.js +0 -53
  952. package/dist/features/minimap/actions.js.map +0 -1
  953. package/dist/features/minimap/createMinimapContribution.js +0 -96
  954. package/dist/features/minimap/createMinimapContribution.js.map +0 -1
  955. package/dist/features/minimap/layers.js +0 -85
  956. package/dist/features/minimap/layers.js.map +0 -1
  957. package/dist/features/overlays/useNodeOverlayFrame.js +0 -103
  958. package/dist/features/overlays/useNodeOverlayFrame.js.map +0 -1
  959. package/dist/features/parallax/createParallaxLayer.js +0 -26
  960. package/dist/features/parallax/createParallaxLayer.js.map +0 -1
  961. package/dist/features/parallax/createParallaxPlane.js +0 -22
  962. package/dist/features/parallax/createParallaxPlane.js.map +0 -1
  963. package/dist/features/paths/anchorEdits.js +0 -167
  964. package/dist/features/paths/anchorEdits.js.map +0 -1
  965. package/dist/features/paths/anchors.js +0 -159
  966. package/dist/features/paths/anchors.js.map +0 -1
  967. package/dist/features/paths/booleans.js +0 -2
  968. package/dist/features/paths/markerCommands.js +0 -149
  969. package/dist/features/paths/markerCommands.js.map +0 -1
  970. package/dist/features/paths/markerSites.js +0 -59
  971. package/dist/features/paths/markerSites.js.map +0 -1
  972. package/dist/features/paths/markers.js +0 -95
  973. package/dist/features/paths/markers.js.map +0 -1
  974. package/dist/features/paths/nearestAnchor.js +0 -36
  975. package/dist/features/paths/nearestAnchor.js.map +0 -1
  976. package/dist/features/paths/pathInWorld.js +0 -41
  977. package/dist/features/paths/pathInWorld.js.map +0 -1
  978. package/dist/features/paths/poseDescriptor.js +0 -39
  979. package/dist/features/paths/poseDescriptor.js.map +0 -1
  980. package/dist/features/paths/strokeToPath.js +0 -40
  981. package/dist/features/paths/strokeToPath.js.map +0 -1
  982. package/dist/features/paths/tessellate/dash.js +0 -52
  983. package/dist/features/paths/tessellate/dash.js.map +0 -1
  984. package/dist/features/paths/tessellate/insets.js +0 -32
  985. package/dist/features/paths/tessellate/insets.js.map +0 -1
  986. package/dist/features/paths/tessellate/metric.js +0 -72
  987. package/dist/features/paths/tessellate/metric.js.map +0 -1
  988. package/dist/features/paths/tessellate/stroke.js +0 -170
  989. package/dist/features/paths/tessellate/stroke.js.map +0 -1
  990. package/dist/features/paths/tessellate/vertexWidths.js +0 -32
  991. package/dist/features/paths/tessellate/vertexWidths.js.map +0 -1
  992. package/dist/features/patterns/commandPaint.js +0 -18
  993. package/dist/features/patterns/commandPaint.js.map +0 -1
  994. package/dist/features/patterns/index.js +0 -11
  995. package/dist/features/patterns/index.js.map +0 -1
  996. package/dist/features/patterns/patterns-builtin.js +0 -38
  997. package/dist/features/patterns/patterns-builtin.js.map +0 -1
  998. package/dist/features/patterns/rasterizeTile.js +0 -17
  999. package/dist/features/patterns/rasterizeTile.js.map +0 -1
  1000. package/dist/features/patterns/resolveSpec.js +0 -65
  1001. package/dist/features/patterns/resolveSpec.js.map +0 -1
  1002. package/dist/features/patterns/tileGeometry.js +0 -158
  1003. package/dist/features/patterns/tileGeometry.js.map +0 -1
  1004. package/dist/features/pointer/PointerContext.js +0 -45
  1005. package/dist/features/pointer/PointerContext.js.map +0 -1
  1006. package/dist/features/selection/SelectionContext.js +0 -51
  1007. package/dist/features/selection/SelectionContext.js.map +0 -1
  1008. package/dist/features/simulation/createSimulation.js +0 -61
  1009. package/dist/features/simulation/createSimulation.js.map +0 -1
  1010. package/dist/features/simulation/types.js +0 -6
  1011. package/dist/features/simulation/types.js.map +0 -1
  1012. package/dist/features/simulation/useSimulation.js +0 -74
  1013. package/dist/features/simulation/useSimulation.js.map +0 -1
  1014. package/dist/features/text/domOffsets.js +0 -82
  1015. package/dist/features/text/domOffsets.js.map +0 -1
  1016. package/dist/features/text/domRuns.js +0 -230
  1017. package/dist/features/text/domRuns.js.map +0 -1
  1018. package/dist/features/text/fitTextPose.js +0 -38
  1019. package/dist/features/text/fitTextPose.js.map +0 -1
  1020. package/dist/features/text/hitTest.js +0 -48
  1021. package/dist/features/text/hitTest.js.map +0 -1
  1022. package/dist/features/text/isTextData.js +0 -8
  1023. package/dist/features/text/isTextData.js.map +0 -1
  1024. package/dist/features/text/overlayDirection.js +0 -15
  1025. package/dist/features/text/overlayDirection.js.map +0 -1
  1026. package/dist/features/text/renderLabel.js +0 -14
  1027. package/dist/features/text/renderLabel.js.map +0 -1
  1028. package/dist/features/text/runs/effectiveRangeStyle.js +0 -66
  1029. package/dist/features/text/runs/effectiveRangeStyle.js.map +0 -1
  1030. package/dist/features/text/runs/flagRange.js +0 -53
  1031. package/dist/features/text/runs/flagRange.js.map +0 -1
  1032. package/dist/features/text/runs/rangeStyle.js +0 -133
  1033. package/dist/features/text/runs/rangeStyle.js.map +0 -1
  1034. package/dist/features/text/textCommand.js +0 -60
  1035. package/dist/features/text/textCommand.js.map +0 -1
  1036. package/dist/features/text/textToPath.js +0 -181
  1037. package/dist/features/text/textToPath.js.map +0 -1
  1038. package/dist/features/text/useTextEdit.js +0 -491
  1039. package/dist/features/text/useTextEdit.js.map +0 -1
  1040. package/dist/features/tiling/createTiledLayer.js +0 -65
  1041. package/dist/features/tiling/createTiledLayer.js.map +0 -1
  1042. package/dist/features/tiling/tiledProject.js +0 -14
  1043. package/dist/features/tiling/tiledProject.js.map +0 -1
  1044. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +0 -26
  1045. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +0 -1
  1046. package/dist/interactions/actions/defaults/align.js.map +0 -1
  1047. package/dist/interactions/actions/defaults/booleans.js +0 -52
  1048. package/dist/interactions/actions/defaults/booleans.js.map +0 -1
  1049. package/dist/interactions/actions/defaults/clipboard.js.map +0 -1
  1050. package/dist/interactions/actions/defaults/clone.js +0 -91
  1051. package/dist/interactions/actions/defaults/clone.js.map +0 -1
  1052. package/dist/interactions/actions/defaults/createOutlines.js +0 -47
  1053. package/dist/interactions/actions/defaults/createOutlines.js.map +0 -1
  1054. package/dist/interactions/actions/defaults/distribute.js.map +0 -1
  1055. package/dist/interactions/actions/defaults/editAnchors.js +0 -100
  1056. package/dist/interactions/actions/defaults/editAnchors.js.map +0 -1
  1057. package/dist/interactions/actions/defaults/flip.js +0 -125
  1058. package/dist/interactions/actions/defaults/flip.js.map +0 -1
  1059. package/dist/interactions/actions/defaults/insert.js +0 -287
  1060. package/dist/interactions/actions/defaults/insert.js.map +0 -1
  1061. package/dist/interactions/actions/defaults/lassoSelect.js +0 -153
  1062. package/dist/interactions/actions/defaults/lassoSelect.js.map +0 -1
  1063. package/dist/interactions/actions/defaults/move.js +0 -778
  1064. package/dist/interactions/actions/defaults/move.js.map +0 -1
  1065. package/dist/interactions/actions/defaults/resize.js +0 -341
  1066. package/dist/interactions/actions/defaults/resize.js.map +0 -1
  1067. package/dist/interactions/actions/defaults/rotate.js +0 -185
  1068. package/dist/interactions/actions/defaults/rotate.js.map +0 -1
  1069. package/dist/interactions/actions/previewOverrides.js +0 -25
  1070. package/dist/interactions/actions/previewOverrides.js.map +0 -1
  1071. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +0 -1
  1072. package/dist/layout/arrivals.js +0 -36
  1073. package/dist/layout/arrivals.js.map +0 -1
  1074. package/dist/math-J-ACHyEg.d.ts +0 -159
  1075. package/dist/registerProgram-T9S_PfAX.d.ts +0 -208
  1076. package/dist/renderer/DrawCommand.js +0 -6
  1077. package/dist/renderer/DrawCommand.js.map +0 -1
  1078. package/dist/renderer/WeaselRenderer.js +0 -333
  1079. package/dist/renderer/WeaselRenderer.js.map +0 -1
  1080. package/dist/renderer/batchClip.js +0 -46
  1081. package/dist/renderer/batchClip.js.map +0 -1
  1082. package/dist/renderer/cache/GLImageCache.js +0 -74
  1083. package/dist/renderer/cache/GLImageCache.js.map +0 -1
  1084. package/dist/renderer/cache/GLMeshCache.js +0 -102
  1085. package/dist/renderer/cache/GLMeshCache.js.map +0 -1
  1086. package/dist/renderer/cache/GLTextureCache.js +0 -68
  1087. package/dist/renderer/cache/GLTextureCache.js.map +0 -1
  1088. package/dist/renderer/cache/GradientRampAtlas.js +0 -82
  1089. package/dist/renderer/cache/GradientRampAtlas.js.map +0 -1
  1090. package/dist/renderer/cache/cache.js +0 -13
  1091. package/dist/renderer/cache/cache.js.map +0 -1
  1092. package/dist/renderer/cache/markerCommandCache.js +0 -63
  1093. package/dist/renderer/cache/markerCommandCache.js.map +0 -1
  1094. package/dist/renderer/cache/outlineMeshCache.js +0 -15
  1095. package/dist/renderer/cache/outlineMeshCache.js.map +0 -1
  1096. package/dist/renderer/cache/outlineStrokeMeshCache.js +0 -36
  1097. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +0 -1
  1098. package/dist/renderer/cache/strokeMeshCache.js +0 -55
  1099. package/dist/renderer/cache/strokeMeshCache.js.map +0 -1
  1100. package/dist/renderer/cullDrawCommands.js +0 -90
  1101. package/dist/renderer/cullDrawCommands.js.map +0 -1
  1102. package/dist/renderer/draw/batch.js +0 -133
  1103. package/dist/renderer/draw/batch.js.map +0 -1
  1104. package/dist/renderer/draw/clip.js +0 -89
  1105. package/dist/renderer/draw/clip.js.map +0 -1
  1106. package/dist/renderer/draw/customShader.js +0 -230
  1107. package/dist/renderer/draw/customShader.js.map +0 -1
  1108. package/dist/renderer/draw/drawTriangles.js +0 -8
  1109. package/dist/renderer/draw/drawTriangles.js.map +0 -1
  1110. package/dist/renderer/draw/effects.js +0 -28
  1111. package/dist/renderer/draw/effects.js.map +0 -1
  1112. package/dist/renderer/draw/flushBatch.js +0 -35
  1113. package/dist/renderer/draw/flushBatch.js.map +0 -1
  1114. package/dist/renderer/draw/gradient.js +0 -90
  1115. package/dist/renderer/draw/gradient.js.map +0 -1
  1116. package/dist/renderer/draw/image.js +0 -38
  1117. package/dist/renderer/draw/image.js.map +0 -1
  1118. package/dist/renderer/draw/mesh.js +0 -16
  1119. package/dist/renderer/draw/mesh.js.map +0 -1
  1120. package/dist/renderer/draw/paintBind.js +0 -70
  1121. package/dist/renderer/draw/paintBind.js.map +0 -1
  1122. package/dist/renderer/draw/pathPaint.js +0 -142
  1123. package/dist/renderer/draw/pathPaint.js.map +0 -1
  1124. package/dist/renderer/draw/scratchPass.js +0 -83
  1125. package/dist/renderer/draw/scratchPass.js.map +0 -1
  1126. package/dist/renderer/draw/stencil.js +0 -28
  1127. package/dist/renderer/draw/stencil.js.map +0 -1
  1128. package/dist/renderer/draw/text.js +0 -167
  1129. package/dist/renderer/draw/text.js.map +0 -1
  1130. package/dist/renderer/draw/uniforms.js +0 -77
  1131. package/dist/renderer/draw/uniforms.js.map +0 -1
  1132. package/dist/renderer/draw.js +0 -79
  1133. package/dist/renderer/draw.js.map +0 -1
  1134. package/dist/renderer/drawBatch.js +0 -198
  1135. package/dist/renderer/drawBatch.js.map +0 -1
  1136. package/dist/renderer/effects/EffectTargets.js +0 -48
  1137. package/dist/renderer/effects/EffectTargets.js.map +0 -1
  1138. package/dist/renderer/effects/builtins.js +0 -31
  1139. package/dist/renderer/effects/builtins.js.map +0 -1
  1140. package/dist/renderer/effects/composite.js +0 -11
  1141. package/dist/renderer/effects/composite.js.map +0 -1
  1142. package/dist/renderer/effects/effectPrelude.js +0 -10
  1143. package/dist/renderer/effects/effectPrelude.js.map +0 -1
  1144. package/dist/renderer/effects/types.js +0 -10
  1145. package/dist/renderer/effects/types.js.map +0 -1
  1146. package/dist/renderer/glyphOutlineMesh.js +0 -67
  1147. package/dist/renderer/glyphOutlineMesh.js.map +0 -1
  1148. package/dist/renderer/index.js +0 -20
  1149. package/dist/renderer/math/color.js +0 -321
  1150. package/dist/renderer/math/color.js.map +0 -1
  1151. package/dist/renderer/math/mat3.js +0 -80
  1152. package/dist/renderer/math/mat3.js.map +0 -1
  1153. package/dist/renderer/math/patternSpace.js +0 -22
  1154. package/dist/renderer/math/patternSpace.js.map +0 -1
  1155. package/dist/renderer/math/viewToMat3.js +0 -19
  1156. package/dist/renderer/math/viewToMat3.js.map +0 -1
  1157. package/dist/renderer/paintResources.js +0 -18
  1158. package/dist/renderer/paintResources.js.map +0 -1
  1159. package/dist/renderer/paintScratch.js +0 -37
  1160. package/dist/renderer/paintScratch.js.map +0 -1
  1161. package/dist/renderer/shaders/ShaderProgram.js +0 -74
  1162. package/dist/renderer/shaders/ShaderProgram.js.map +0 -1
  1163. package/dist/renderer/shaders/batchFill.js +0 -119
  1164. package/dist/renderer/shaders/batchFill.js.map +0 -1
  1165. package/dist/renderer/shaders/customPrelude.js +0 -34
  1166. package/dist/renderer/shaders/customPrelude.js.map +0 -1
  1167. package/dist/renderer/shaders/extractUniformNames.js +0 -184
  1168. package/dist/renderer/shaders/extractUniformNames.js.map +0 -1
  1169. package/dist/renderer/shaders/glyphPaint.js +0 -61
  1170. package/dist/renderer/shaders/glyphPaint.js.map +0 -1
  1171. package/dist/renderer/shaders/gradFill.js +0 -31
  1172. package/dist/renderer/shaders/gradFill.js.map +0 -1
  1173. package/dist/renderer/shaders/pathFill.js +0 -14
  1174. package/dist/renderer/shaders/pathFill.js.map +0 -1
  1175. package/dist/renderer/shaders/patternFill.js +0 -25
  1176. package/dist/renderer/shaders/patternFill.js.map +0 -1
  1177. package/dist/renderer/shaders/registerProgram.js +0 -18
  1178. package/dist/renderer/shaders/registerProgram.js.map +0 -1
  1179. package/dist/renderer/spriteSheet.js +0 -14
  1180. package/dist/renderer/spriteSheet.js.map +0 -1
  1181. package/dist/renderer/state/GroupState.js +0 -77
  1182. package/dist/renderer/state/GroupState.js.map +0 -1
  1183. package/dist/renderer/strokeLengths.js +0 -50
  1184. package/dist/renderer/strokeLengths.js.map +0 -1
  1185. package/dist/renderer/syntheticItalic.js +0 -6
  1186. package/dist/renderer/syntheticItalic.js.map +0 -1
  1187. package/dist/renderer/textures/registerTexture.js +0 -34
  1188. package/dist/renderer/textures/registerTexture.js.map +0 -1
  1189. package/dist/scheduling/useVisibleRaf.js +0 -69
  1190. package/dist/scheduling/useVisibleRaf.js.map +0 -1
  1191. package/dist/test-seams-DM2B87-g.d.ts +0 -356
@@ -1 +1 @@
1
- {"version":3,"file":"pathLayer.js","names":["PLACEHOLDER_FILL","PLACEHOLDER_STROKE","createPathLayer","opts","children","nodes","getNodes","idx","node","isHidden","path","getPath","fillFromHook","getFill","strokeFromHook","getStroke","baseVColors","getVertexColors","baseStrokeVColors","getStrokeVertexColors","strokeVWidths","getStrokeVertexWidths","nodeId","tMs","colorOverrides","now","vColors","strokeVColors","anchorCount","countPathAnchors","expectedLen","useVColors","useStrokeVColors","fill","useStrokeVWidths","baseStroke","stroke"],"sources":["../../../src/features/paths/pathLayer.ts"],"sourcesContent":["/**\n * `RenderLayer` that fills/strokes `Path` instances. Mirrors the shape of\n * `createTextLayer`: caller hands over a `getNodes()` enumerator and a\n * `getPath(node)` lookup; the layer iterates and renders. CommandFill and\n * stroke are looked up per node so consumers can keep the path geometry\n * separate from the visual style record (the typical scene-graph layout).\n */\n\nimport { type DrawCommand } from '../../renderer';\nimport { type CommandFill, type CommandStroke } from '@weasel-js/paint';\nimport type { RenderLayer } from 'core/layers/render';\nimport type { Path } from '@weasel-js/geom';\nimport { countPathAnchors } from './anchors';\nimport type { ColorOverrideRegistry } from '../../animation/colorRegistry';\n\nconst PLACEHOLDER_FILL: CommandFill = { color: '#ffffff' };\nconst PLACEHOLDER_STROKE: CommandStroke = { paint: { color: '#ffffff' }, width: 1 };\n\n\n/** Options for `createPathLayer`. */\nexport interface CreatePathLayerOpts<T> {\n id?: string;\n label?: string;\n getNodes: () => readonly T[];\n getPath: (node: T) => Path;\n /** Per-node fill paint. Return `null`/`undefined` to skip filling. */\n getFill?: (node: T) => CommandFill | null | undefined;\n /** Per-node stroke. Return `null`/`undefined` to skip stroking. */\n getStroke?: (node: T) => CommandStroke | null | undefined;\n /** Optional per-node hide hook (e.g., suppress while editing). */\n isHidden?: (node: T) => boolean;\n /**\n * Per-node fill vertex-color array, flat RGBA-per-path-anchor, in\n * 0..1 floats (same color space as `PathDrawCommand.vertexColors`).\n * Length must be `4 × countPathAnchors(getPath(node))`. When set and\n * `getFill` returns null/undefined, a white placeholder fill is\n * synthesized so the renderer's per-vertex shader path activates.\n */\n getVertexColors?: (node: T) => number[] | null | undefined;\n /**\n * Per-node stroke vertex-color array, flat RGBA-per-path-anchor, in\n * 0..1 floats (same color space as `Stroke.vertexColors`).\n * Length must be `4 × countPathAnchors(getPath(node))`. When set and\n * `getStroke` returns null/undefined, a white 1px placeholder stroke\n * is synthesized.\n */\n getStrokeVertexColors?: (node: T) => number[] | null | undefined;\n /**\n * Per-node stroke vertex-width array (one width per anchor).\n * Length must be `countPathAnchors(getPath(node))`. The tessellator\n * interpolates half-widths along each segment for tapered strokes.\n * When set and `getStroke` returns null/undefined, a 1px placeholder\n * stroke is synthesized so the per-anchor widths take effect.\n */\n getStrokeVertexWidths?: (node: T) => number[] | null | undefined;\n /**\n * Optional color override registry, typically `animator.colorOverrides`.\n * When set, the renderer consults it before falling back to\n * `getVertexColors` / `getStrokeVertexColors`. Function-form overrides\n * receive the base color array and the current animation timestamp.\n */\n colorOverrides?: ColorOverrideRegistry;\n /** Clock used to timestamp function-form color overrides. Defaults to\n * `performance.now`. Override in tests. */\n now?: () => number;\n}\n\n/** Build a `RenderLayer` that fills/strokes `Path` instances enumerated from a node list. */\nexport function createPathLayer<T>(opts: CreatePathLayerOpts<T>): RenderLayer<unknown> {\n const {\n id = 'paths', label = 'Paths',\n getNodes, getPath, getFill, getStroke, isHidden,\n getVertexColors, getStrokeVertexColors, getStrokeVertexWidths,\n colorOverrides,\n now = (): number => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n } = opts;\n const warned = new Set<string>();\n const isDev = typeof import.meta !== 'undefined'\n && (import.meta as unknown as { env?: { DEV?: boolean } }).env\n && (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV;\n\n return {\n id,\n label,\n draw: () => {\n const children: DrawCommand[] = [];\n const nodes = getNodes();\n for (let idx = 0; idx < nodes.length; idx++) {\n const node = nodes[idx];\n if (isHidden?.(node)) continue;\n const path = getPath(node);\n const fillFromHook = getFill?.(node);\n const strokeFromHook = getStroke?.(node);\n const baseVColors = getVertexColors?.(node);\n const baseStrokeVColors = getStrokeVertexColors?.(node);\n const strokeVWidths = getStrokeVertexWidths?.(node);\n\n const nodeId = (node as { id?: string }).id ?? String(idx);\n const tMs = colorOverrides ? now() : 0;\n\n const vColors = colorOverrides\n ? colorOverrides.resolve(nodeId, 'fill', baseVColors ?? undefined, tMs)\n : baseVColors;\n const strokeVColors = colorOverrides\n ? colorOverrides.resolve(nodeId, 'stroke', baseStrokeVColors ?? undefined, tMs)\n : baseStrokeVColors;\n\n const nodeKey = nodeId;\n const anchorCount = countPathAnchors(path);\n const expectedLen = 4 * anchorCount;\n\n let useVColors: readonly number[] | null = null;\n if (vColors != null) {\n if (vColors.length === expectedLen) {\n useVColors = vColors;\n } else if (isDev) {\n const key = `${id}:${nodeKey}:fill`;\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(\n `[createPathLayer ${id}] node ${nodeKey}: fill vertexColors length ${vColors.length}, expected ${expectedLen}; dropping`,\n );\n }\n }\n }\n\n let useStrokeVColors: readonly number[] | null = null;\n if (strokeVColors != null) {\n if (strokeVColors.length === expectedLen) {\n useStrokeVColors = strokeVColors;\n } else if (isDev) {\n const key = `${id}:${nodeKey}:stroke`;\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(\n `[createPathLayer ${id}] node ${nodeKey}: stroke vertexColors length ${strokeVColors.length}, expected ${expectedLen}; dropping`,\n );\n }\n }\n }\n\n // Synthesize placeholder only when colors validate (useVColors != null),\n // not on any raw hook return. Mismatched-length arrays drop both the\n // colors and placeholder so the dev signal (console warning) isn't duplicated.\n const fill: CommandFill | undefined =\n fillFromHook != null ? fillFromHook\n : (useVColors != null ? PLACEHOLDER_FILL : undefined);\n\n let useStrokeVWidths: number[] | null = null;\n if (strokeVWidths != null) {\n if (strokeVWidths.length === anchorCount) {\n useStrokeVWidths = strokeVWidths;\n } else if (isDev) {\n const key = `${id}:${nodeKey}:strokeWidths`;\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(\n `[createPathLayer ${id}] node ${nodeKey}: stroke vertexWidths length ${strokeVWidths.length}, expected ${anchorCount}; dropping`,\n );\n }\n }\n }\n\n const baseStroke: CommandStroke | undefined =\n strokeFromHook != null ? strokeFromHook\n : (useStrokeVColors != null || useStrokeVWidths != null ? PLACEHOLDER_STROKE : undefined);\n\n const stroke: CommandStroke | undefined =\n baseStroke != null\n ? {\n ...baseStroke,\n ...(useStrokeVColors != null ? { vertexColors: useStrokeVColors as number[] } : {}),\n ...(useStrokeVWidths != null ? { vertexWidths: useStrokeVWidths } : {}),\n }\n : baseStroke;\n\n if (fill == null && stroke == null) continue;\n\n children.push({\n kind: 'path',\n path,\n ...(fill != null ? { fill } : {}),\n ...(stroke != null ? { stroke } : {}),\n ...(useVColors != null ? { vertexColors: useVColors as number[] } : {}),\n });\n }\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n"],"mappings":";;;AAeA,IAAMA,IAAgC,EAAE,OAAO,UAAU,GACnDC,IAAoC;CAAE,OAAO,EAAE,OAAO,UAAU;CAAG,OAAO;AAAE;AAoDlF,SAAgBC,EAAmB,GAAoD;CACrF,IAAM,EACJ,QAAK,SAAS,WAAQ,SACtB,aAAU,YAAS,YAAS,cAAW,aACvC,oBAAiB,0BAAuB,0BACxC,mBACA,eAAqB,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI,MACrFC;CAMJ,OAAO;EACL;EACA;EACA,YAAY;GACV,IAAMC,IAA0B,CAAC,GAC3BC,IAAQC,EAAS;GACvB,KAAK,IAAIC,IAAM,GAAGA,IAAMF,EAAM,QAAQ,KAAO;IAC3C,IAAMG,IAAOH,EAAME;IACnB,IAAIE,IAAWD,CAAI,GAAG;IACtB,IAAME,IAAOC,EAAQH,CAAI,GACnBI,IAAeC,IAAUL,CAAI,GAC7BM,IAAiBC,IAAYP,CAAI,GACjCQ,IAAcC,IAAkBT,CAAI,GACpCU,IAAoBC,IAAwBX,CAAI,GAChDY,IAAgBC,IAAwBb,CAAI,GAE5Cc,IAAUd,EAAyB,MAAM,OAAOD,CAAG,GACnDgB,IAAMC,IAAiBC,EAAI,IAAI,GAE/BC,IAAUF,IACZA,EAAe,QAAQF,GAAQ,QAAQN,KAAe,KAAA,GAAWO,CAAG,IACpEP,GACEW,IAAgBH,IAClBA,EAAe,QAAQF,GAAQ,UAAUJ,KAAqB,KAAA,GAAWK,CAAG,IAC5EL,GAGEU,IAAcC,EAAiBnB,CAAI,GACnCoB,IAAc,IAAIF,GAEpBG,IAAuC;IAC3C,AAAIL,KAAW,QACTA,EAAQ,WAAWI,MACrB,IAAaJ;IAYjB,IAAIM,IAA6C;IACjD,AAAIL,KAAiB,QACfA,EAAc,WAAWG,MAC3B,IAAmBH;IAevB,IAAMM,IACJrB,MACGmB,KAAc,OAA0B,KAAA,IAAnB/B,IAEtBkC,IAAoC;IACxC,AAAId,KAAiB,QACfA,EAAc,WAAWQ,MAC3B,IAAmBR;IAYvB,IAAMe,IACJrB,MACGkB,KAAoB,QAAQE,KAAoB,OAAOjC,IAAqB,KAAA,IAE3EmC,IACJD,KAAc,OAMVA,IALA;KACE,GAAGA;KACH,GAAIH,KAAoB,OAAwD,CAAC,IAAlD,EAAE,cAAcA,EAA6B;KAC5E,GAAIE,KAAoB,OAA4C,CAAC,IAAtC,EAAE,cAAcA,EAAiB;IAClE;IAGN,CAAID,KAAQ,QAAQG,KAAU,SAE9BhC,EAAS,KAAK;KACZ,MAAM;KACN;KACA,GAAI6B,KAAQ,OAAkB,CAAC,IAAZ,EAAE,QAAK;KAC1B,GAAIG,KAAU,OAAoB,CAAC,IAAd,EAAE,UAAO;KAC9B,GAAIL,KAAc,OAAkD,CAAC,IAA5C,EAAE,cAAcA,EAAuB;IAClE,CAAC;GACH;GAEA,OAAO3B;EACT;CACF;AACF"}
1
+ {"version":3,"file":"pathLayer.js","names":["PLACEHOLDER_FILL","PLACEHOLDER_STROKE","createPathLayer","opts","children","nodes","getNodes","idx","node","isHidden","path","getPath","fillFromHook","getFill","strokeFromHook","getStroke","baseVColors","getVertexColors","baseStrokeVColors","getStrokeVertexColors","strokeVWidths","getStrokeVertexWidths","nodeId","tMs","colorOverrides","now","vColors","strokeVColors","anchorCount","countPathAnchors","expectedLen","useVColors","useStrokeVColors","fill","useStrokeVWidths","baseStroke","stroke"],"sources":["../../../src/features/paths/pathLayer.ts"],"sourcesContent":["/**\n * `RenderLayer` that fills/strokes `Path` instances. Mirrors the shape of\n * `createTextLayer`: caller hands over a `getNodes()` enumerator and a\n * `getPath(node)` lookup; the layer iterates and renders. Fill and\n * stroke are looked up per node so consumers can keep the path geometry\n * separate from the visual style record (the typical scene-graph layout).\n */\n\nimport { type DrawCommand } from '@weasel-js/renderer';\nimport { type CommandStroke, type CommandFill } from '@weasel-js/paint';\nimport type { RenderLayer } from 'core/layers/render';\nimport { type Path, countPathAnchors } from '@weasel-js/geom';\nimport type { ColorOverrideRegistry } from '@weasel-js/animator';\n\nconst PLACEHOLDER_FILL: CommandFill = { paint: { color: '#ffffff' } };\nconst PLACEHOLDER_STROKE: CommandStroke = { paint: { color: '#ffffff' }, width: 1 };\n\n\n/** Options for `createPathLayer`. */\nexport interface CreatePathLayerOpts<T> {\n id?: string;\n label?: string;\n getNodes: () => readonly T[];\n getPath: (node: T) => Path;\n /** Per-node fill. Return `null`/`undefined` to skip filling. */\n getFill?: (node: T) => CommandFill | null | undefined;\n /** Per-node stroke. Return `null`/`undefined` to skip stroking. */\n getStroke?: (node: T) => CommandStroke | null | undefined;\n /** Optional per-node hide hook (e.g., suppress while editing). */\n isHidden?: (node: T) => boolean;\n /**\n * Per-node fill vertex-color array, flat RGBA-per-path-anchor, in\n * 0..1 floats (same color space as `PathDrawCommand.vertexColors`).\n * Length must be `4 × countPathAnchors(getPath(node))`. When set and\n * `getFill` returns null/undefined, a white placeholder fill is\n * synthesized so the renderer's per-vertex shader path activates.\n */\n getVertexColors?: (node: T) => number[] | null | undefined;\n /**\n * Per-node stroke vertex-color array, flat RGBA-per-path-anchor, in\n * 0..1 floats (same color space as `Stroke.vertexColors`).\n * Length must be `4 × countPathAnchors(getPath(node))`. When set and\n * `getStroke` returns null/undefined, a white 1px placeholder stroke\n * is synthesized.\n */\n getStrokeVertexColors?: (node: T) => number[] | null | undefined;\n /**\n * Per-node stroke vertex-width array (one width per anchor).\n * Length must be `countPathAnchors(getPath(node))`. The tessellator\n * interpolates half-widths along each segment for tapered strokes.\n * When set and `getStroke` returns null/undefined, a 1px placeholder\n * stroke is synthesized so the per-anchor widths take effect.\n */\n getStrokeVertexWidths?: (node: T) => number[] | null | undefined;\n /**\n * Optional color override registry, typically `animator.colorOverrides`.\n * When set, the renderer consults it before falling back to\n * `getVertexColors` / `getStrokeVertexColors`. Function-form overrides\n * receive the base color array and the current animation timestamp.\n */\n colorOverrides?: ColorOverrideRegistry;\n /** Clock used to timestamp function-form color overrides. Defaults to\n * `performance.now`. Override in tests. */\n now?: () => number;\n}\n\n/** Build a `RenderLayer` that fills/strokes `Path` instances enumerated from a node list. */\nexport function createPathLayer<T>(opts: CreatePathLayerOpts<T>): RenderLayer<unknown> {\n const {\n id = 'paths', label = 'Paths',\n getNodes, getPath, getFill, getStroke, isHidden,\n getVertexColors, getStrokeVertexColors, getStrokeVertexWidths,\n colorOverrides,\n now = (): number => (typeof performance !== 'undefined' ? performance.now() : Date.now()),\n } = opts;\n const warned = new Set<string>();\n const isDev = typeof import.meta !== 'undefined'\n && (import.meta as unknown as { env?: { DEV?: boolean } }).env\n && (import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV;\n\n return {\n id,\n label,\n draw: () => {\n const children: DrawCommand[] = [];\n const nodes = getNodes();\n for (let idx = 0; idx < nodes.length; idx++) {\n const node = nodes[idx];\n if (isHidden?.(node)) continue;\n const path = getPath(node);\n const fillFromHook = getFill?.(node);\n const strokeFromHook = getStroke?.(node);\n const baseVColors = getVertexColors?.(node);\n const baseStrokeVColors = getStrokeVertexColors?.(node);\n const strokeVWidths = getStrokeVertexWidths?.(node);\n\n const nodeId = (node as { id?: string }).id ?? String(idx);\n const tMs = colorOverrides ? now() : 0;\n\n const vColors = colorOverrides\n ? colorOverrides.resolve(nodeId, 'fill', baseVColors ?? undefined, tMs)\n : baseVColors;\n const strokeVColors = colorOverrides\n ? colorOverrides.resolve(nodeId, 'stroke', baseStrokeVColors ?? undefined, tMs)\n : baseStrokeVColors;\n\n const nodeKey = nodeId;\n const anchorCount = countPathAnchors(path);\n const expectedLen = 4 * anchorCount;\n\n let useVColors: readonly number[] | null = null;\n if (vColors != null) {\n if (vColors.length === expectedLen) {\n useVColors = vColors;\n } else if (isDev) {\n const key = `${id}:${nodeKey}:fill`;\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(\n `[createPathLayer ${id}] node ${nodeKey}: fill vertexColors length ${vColors.length}, expected ${expectedLen}; dropping`,\n );\n }\n }\n }\n\n let useStrokeVColors: readonly number[] | null = null;\n if (strokeVColors != null) {\n if (strokeVColors.length === expectedLen) {\n useStrokeVColors = strokeVColors;\n } else if (isDev) {\n const key = `${id}:${nodeKey}:stroke`;\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(\n `[createPathLayer ${id}] node ${nodeKey}: stroke vertexColors length ${strokeVColors.length}, expected ${expectedLen}; dropping`,\n );\n }\n }\n }\n\n // Synthesize placeholder only when colors validate (useVColors != null),\n // not on any raw hook return. Mismatched-length arrays drop both the\n // colors and placeholder so the dev signal (console warning) isn't duplicated.\n const fill: CommandFill | undefined =\n fillFromHook != null ? fillFromHook\n : (useVColors != null ? PLACEHOLDER_FILL : undefined);\n\n let useStrokeVWidths: number[] | null = null;\n if (strokeVWidths != null) {\n if (strokeVWidths.length === anchorCount) {\n useStrokeVWidths = strokeVWidths;\n } else if (isDev) {\n const key = `${id}:${nodeKey}:strokeWidths`;\n if (!warned.has(key)) {\n warned.add(key);\n console.warn(\n `[createPathLayer ${id}] node ${nodeKey}: stroke vertexWidths length ${strokeVWidths.length}, expected ${anchorCount}; dropping`,\n );\n }\n }\n }\n\n const baseStroke: CommandStroke | undefined =\n strokeFromHook != null ? strokeFromHook\n : (useStrokeVColors != null || useStrokeVWidths != null ? PLACEHOLDER_STROKE : undefined);\n\n const stroke: CommandStroke | undefined =\n baseStroke != null\n ? {\n ...baseStroke,\n ...(useStrokeVColors != null ? { vertexColors: useStrokeVColors as number[] } : {}),\n ...(useStrokeVWidths != null ? { vertexWidths: useStrokeVWidths } : {}),\n }\n : baseStroke;\n\n if (fill == null && stroke == null) continue;\n\n children.push({\n kind: 'path',\n path,\n ...(fill != null ? { fill } : {}),\n ...(stroke != null ? { stroke } : {}),\n ...(useVColors != null ? { vertexColors: useVColors as number[] } : {}),\n });\n }\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n"],"mappings":";;;;AAcA,IAAMA,IAAgC,EAAE,OAAO,EAAE,OAAO,UAAU,EAAE,GAC9DC,IAAoC;CAAE,OAAO,EAAE,OAAO,UAAU;CAAG,OAAO;AAAE;AAoDlF,SAAgBC,EAAmB,GAAoD;CACrF,IAAM,EACJ,QAAK,SAAS,WAAQ,SACtB,aAAU,YAAS,YAAS,cAAW,aACvC,oBAAiB,0BAAuB,0BACxC,mBACA,eAAqB,OAAO,cAAgB,MAAc,YAAY,IAAI,IAAI,KAAK,IAAI,MACrFC;CAMJ,OAAO;EACL;EACA;EACA,YAAY;GACV,IAAMC,IAA0B,CAAC,GAC3BC,IAAQC,EAAS;GACvB,KAAK,IAAIC,IAAM,GAAGA,IAAMF,EAAM,QAAQ,KAAO;IAC3C,IAAMG,IAAOH,EAAME;IACnB,IAAIE,IAAWD,CAAI,GAAG;IACtB,IAAME,IAAOC,EAAQH,CAAI,GACnBI,IAAeC,IAAUL,CAAI,GAC7BM,IAAiBC,IAAYP,CAAI,GACjCQ,IAAcC,IAAkBT,CAAI,GACpCU,IAAoBC,IAAwBX,CAAI,GAChDY,IAAgBC,IAAwBb,CAAI,GAE5Cc,IAAUd,EAAyB,MAAM,OAAOD,CAAG,GACnDgB,IAAMC,IAAiBC,EAAI,IAAI,GAE/BC,IAAUF,IACZA,EAAe,QAAQF,GAAQ,QAAQN,KAAe,KAAA,GAAWO,CAAG,IACpEP,GACEW,IAAgBH,IAClBA,EAAe,QAAQF,GAAQ,UAAUJ,KAAqB,KAAA,GAAWK,CAAG,IAC5EL,GAGEU,IAAcC,EAAiBnB,CAAI,GACnCoB,IAAc,IAAIF,GAEpBG,IAAuC;IAC3C,AAAIL,KAAW,QACTA,EAAQ,WAAWI,MACrB,IAAaJ;IAYjB,IAAIM,IAA6C;IACjD,AAAIL,KAAiB,QACfA,EAAc,WAAWG,MAC3B,IAAmBH;IAevB,IAAMM,IACJrB,MACGmB,KAAc,OAA0B,KAAA,IAAnB/B,IAEtBkC,IAAoC;IACxC,AAAId,KAAiB,QACfA,EAAc,WAAWQ,MAC3B,IAAmBR;IAYvB,IAAMe,IACJrB,MACGkB,KAAoB,QAAQE,KAAoB,OAAOjC,IAAqB,KAAA,IAE3EmC,IACJD,KAAc,OAMVA,IALA;KACE,GAAGA;KACH,GAAIH,KAAoB,OAAwD,CAAC,IAAlD,EAAE,cAAcA,EAA6B;KAC5E,GAAIE,KAAoB,OAA4C,CAAC,IAAtC,EAAE,cAAcA,EAAiB;IAClE;IAGN,CAAID,KAAQ,QAAQG,KAAU,SAE9BhC,EAAS,KAAK;KACZ,MAAM;KACN;KACA,GAAI6B,KAAQ,OAAkB,CAAC,IAAZ,EAAE,QAAK;KAC1B,GAAIG,KAAU,OAAoB,CAAC,IAAd,EAAE,UAAO;KAC9B,GAAIL,KAAc,OAAkD,CAAC,IAA5C,EAAE,cAAcA,EAAuB;IAClE,CAAC;GACH;GAEA,OAAO3B;EACT;CACF;AACF"}
@@ -1,6 +1,4 @@
1
- import { anchorsToPath as e } from "./anchors.js";
2
- import { circlePath as t } from "./markers.js";
3
- import { PATH_C as n, PATH_L as r, PATH_M as i } from "@weasel-js/geom";
1
+ import { PATH_C as e, PATH_L as t, PATH_M as n, anchorsToPath as r, circlePath as i } from "@weasel-js/geom";
4
2
  //#region src/features/paths/penPreviewLayer.ts
5
3
  var a = {
6
4
  anchorFill: "#d4c4a8",
@@ -13,77 +11,77 @@ var a = {
13
11
  function l(e, t, n) {
14
12
  return [(e - n.x) * n.scale.x, (t - n.y) * n.scale.y];
15
13
  }
16
- function u(e, n, r) {
17
- return t(e, n, r);
14
+ function u(e, t, n) {
15
+ return i(e, t, n);
18
16
  }
19
- function d(t, n) {
20
- if (t.anchors.length === 0) return null;
21
- let r = (e) => {
22
- let [t, r] = l(e.x, e.y, n);
17
+ function d(e, t) {
18
+ if (e.anchors.length === 0) return null;
19
+ let n = (e) => {
20
+ let [n, r] = l(e.x, e.y, t);
23
21
  return {
24
- x: t,
22
+ x: n,
25
23
  y: r
26
24
  };
27
- }, i = t.anchors.map((e) => ({
28
- ...r(e),
29
- ...e.inHandle ? { inHandle: r(e.inHandle) } : {},
30
- ...e.outHandle ? { outHandle: r(e.outHandle) } : {}
25
+ }, i = e.anchors.map((e) => ({
26
+ ...n(e),
27
+ ...e.inHandle ? { inHandle: n(e.inHandle) } : {},
28
+ ...e.outHandle ? { outHandle: n(e.outHandle) } : {}
31
29
  }));
32
- return e([i], [t.closed]);
30
+ return r([i], [e.closed]);
33
31
  }
34
- function f(e) {
35
- let t = {
32
+ function f(r) {
33
+ let i = {
36
34
  ...a,
37
- ...e.style ?? {}
38
- }, f = () => e.penTool.initScratch();
35
+ ...r.style ?? {}
36
+ }, f = r.state;
39
37
  return {
40
38
  id: "penPreview",
41
39
  label: "Pen preview",
42
40
  space: "screen",
43
- draw: (e, a) => {
44
- let p = f(), m = [];
45
- for (let e of p.finishedSubpaths) {
46
- let n = d(e, a);
47
- n !== null && m.push({
41
+ draw: (r, a) => {
42
+ let p = [];
43
+ for (let e of f.finishedSubpaths) {
44
+ let t = d(e, a);
45
+ t !== null && p.push({
48
46
  kind: "path",
49
- path: n,
47
+ path: t,
50
48
  stroke: {
51
49
  paint: {
52
- fill: "solid",
53
- color: t.finishedSubpathStroke
50
+ kind: "solid",
51
+ color: i.finishedSubpathStroke
54
52
  },
55
53
  width: 1
56
54
  }
57
55
  });
58
56
  }
59
- let h = p.current;
60
- if (!h && p.cursor === null) return m;
61
- if (h) {
62
- let e = d(h, a);
63
- e !== null && m.push({
57
+ let m = f.current;
58
+ if (!m && f.cursor === null) return p;
59
+ if (m) {
60
+ let e = d(m, a);
61
+ e !== null && p.push({
64
62
  kind: "path",
65
63
  path: e,
66
64
  stroke: {
67
65
  paint: {
68
- fill: "solid",
69
- color: t.rubberBandStroke
66
+ kind: "solid",
67
+ color: i.rubberBandStroke
70
68
  },
71
69
  width: 1
72
70
  }
73
71
  });
74
72
  }
75
- if (h && h.anchors.length > 0 && p.cursor && p.draggingHandleAt === null) {
76
- let e = h.anchors[h.anchors.length - 1], o = e.outHandle, [s, c] = l(e.x, e.y, a), [u, d] = l(p.cursor.x, p.cursor.y, a), f;
73
+ if (m && m.anchors.length > 0 && f.cursor && f.draggingHandleAt === null) {
74
+ let r = m.anchors[m.anchors.length - 1], o = r.outHandle, [s, c] = l(r.x, r.y, a), [u, d] = l(f.cursor.x, f.cursor.y, a), h;
77
75
  if (o) {
78
- let [e, t] = l(o.x, o.y, a);
79
- f = {
76
+ let [t, r] = l(o.x, o.y, a);
77
+ h = {
80
78
  kind: "polygon",
81
- commands: new Uint8Array([i, n]),
79
+ commands: new Uint8Array([n, e]),
82
80
  coords: new Float32Array([
83
81
  s,
84
82
  c,
85
- e,
86
83
  t,
84
+ r,
87
85
  u,
88
86
  d,
89
87
  u,
@@ -91,9 +89,9 @@ function f(e) {
91
89
  ]),
92
90
  fillRule: "nonzero"
93
91
  };
94
- } else f = {
92
+ } else h = {
95
93
  kind: "polygon",
96
- commands: new Uint8Array([i, r]),
94
+ commands: new Uint8Array([n, t]),
97
95
  coords: new Float32Array([
98
96
  s,
99
97
  c,
@@ -102,39 +100,39 @@ function f(e) {
102
100
  ]),
103
101
  fillRule: "nonzero"
104
102
  };
105
- m.push({
103
+ p.push({
106
104
  kind: "path",
107
- path: f,
105
+ path: h,
108
106
  stroke: {
109
107
  paint: {
110
- fill: "solid",
111
- color: t.rubberBandStroke
108
+ kind: "solid",
109
+ color: i.rubberBandStroke
112
110
  },
113
111
  width: 1
114
112
  }
115
113
  });
116
114
  }
117
- if (h) {
118
- for (let e = 0; e < h.anchors.length; e++) {
119
- let n = h.anchors[e], [c, d] = l(n.x, n.y, a);
120
- if (m.push({
115
+ if (m) {
116
+ for (let e = 0; e < m.anchors.length; e++) {
117
+ let r = m.anchors[e], [c, d] = l(r.x, r.y, a);
118
+ if (p.push({
121
119
  kind: "path",
122
120
  path: u(c, d, o),
123
- fill: {
124
- fill: "solid",
125
- color: t.anchorFill
126
- },
121
+ fill: { paint: {
122
+ kind: "solid",
123
+ color: i.anchorFill
124
+ } },
127
125
  stroke: {
128
126
  paint: {
129
- fill: "solid",
130
- color: t.anchorStroke
127
+ kind: "solid",
128
+ color: i.anchorStroke
131
129
  },
132
130
  width: 1
133
131
  }
134
- }), e === h.anchors.length - 1 && n.outHandle) {
135
- let [e, o] = l(n.outHandle.x, n.outHandle.y, a), f = {
132
+ }), e === m.anchors.length - 1 && r.outHandle) {
133
+ let [e, o] = l(r.outHandle.x, r.outHandle.y, a), f = {
136
134
  kind: "polygon",
137
- commands: new Uint8Array([i, r]),
135
+ commands: new Uint8Array([n, t]),
138
136
  coords: new Float32Array([
139
137
  c,
140
138
  d,
@@ -143,74 +141,74 @@ function f(e) {
143
141
  ]),
144
142
  fillRule: "nonzero"
145
143
  };
146
- m.push({
144
+ p.push({
147
145
  kind: "path",
148
146
  path: f,
149
147
  stroke: {
150
148
  paint: {
151
- fill: "solid",
152
- color: t.handleStroke
149
+ kind: "solid",
150
+ color: i.handleStroke
153
151
  },
154
152
  width: 1
155
153
  }
156
- }), m.push({
154
+ }), p.push({
157
155
  kind: "path",
158
156
  path: u(e, o, s),
159
- fill: {
160
- fill: "solid",
161
- color: t.handleStroke
162
- }
157
+ fill: { paint: {
158
+ kind: "solid",
159
+ color: i.handleStroke
160
+ } }
163
161
  });
164
- let p = n.inHandle;
165
- if (p) {
166
- let [e, n] = l(p.x, p.y, a), o = {
162
+ let m = r.inHandle;
163
+ if (m) {
164
+ let [e, r] = l(m.x, m.y, a), o = {
167
165
  kind: "polygon",
168
- commands: new Uint8Array([i, r]),
166
+ commands: new Uint8Array([n, t]),
169
167
  coords: new Float32Array([
170
168
  c,
171
169
  d,
172
170
  e,
173
- n
171
+ r
174
172
  ]),
175
173
  fillRule: "nonzero"
176
174
  };
177
- m.push({
175
+ p.push({
178
176
  kind: "path",
179
177
  path: o,
180
178
  stroke: {
181
179
  paint: {
182
- fill: "solid",
183
- color: t.handleStroke
180
+ kind: "solid",
181
+ color: i.handleStroke
184
182
  },
185
183
  width: 1
186
184
  }
187
- }), m.push({
185
+ }), p.push({
188
186
  kind: "path",
189
- path: u(e, n, s),
190
- fill: {
191
- fill: "solid",
192
- color: t.handleStroke
193
- }
187
+ path: u(e, r, s),
188
+ fill: { paint: {
189
+ kind: "solid",
190
+ color: i.handleStroke
191
+ } }
194
192
  });
195
193
  }
196
194
  }
197
195
  }
198
- if (p.closeHintActive && h.anchors.length >= 3) {
199
- let e = h.anchors[0], [n, r] = l(e.x, e.y, a);
200
- m.push({
196
+ if (f.closeHintActive && m.anchors.length >= 3) {
197
+ let e = m.anchors[0], [t, n] = l(e.x, e.y, a);
198
+ p.push({
201
199
  kind: "path",
202
- path: u(n, r, c),
200
+ path: u(t, n, c),
203
201
  stroke: {
204
202
  paint: {
205
- fill: "solid",
206
- color: t.closeHintFill
203
+ kind: "solid",
204
+ color: i.closeHintFill
207
205
  },
208
206
  width: 1.5
209
207
  }
210
208
  });
211
209
  }
212
210
  }
213
- return m;
211
+ return p;
214
212
  }
215
213
  };
216
214
  }
@@ -1 +1 @@
1
- {"version":3,"file":"penPreviewLayer.js","names":["DEFAULT_STYLE","ANCHOR_RADIUS_PX","HANDLE_DOT_RADIUS_PX","CLOSE_HINT_RADIUS_PX","w2s","wx","view","wy","approximateCircle","circlePath","cx","cy","subpathToPath","sp","pt","x","y","p","anchors","a","anchorsToPath","createPenPreviewLayer","style","opts","getScratch","s","out","path","cur","last","out2","sx","sy","c1x","c1y","PATH_M","PATH_C","PATH_L","i","ax","ay","hx","hy","linePath","inSide","mx","my","inLine","first","fx","fy"],"sources":["../../../src/features/paths/penPreviewLayer.ts"],"sourcesContent":["/**\n * Screen-space preview layer for `usePenTool`. Reads the tool's\n * persistent scratch each frame and renders the in-progress path: finished\n * subpaths (faded), the current subpath (bright + anchor dots + handles),\n * a rubber-band segment from the latest anchor to the cursor, and a\n * close-hint ring on the first anchor when the tool flags it as hot.\n *\n * Runs in screen space so anchor/handle sizes stay constant under zoom.\n * All world-space coords go through `worldToScreen` via the layer's `view`\n * argument.\n */\n\nimport type { DrawCommand } from '../../renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport type { Tool } from '../../tools/overlayBinding';\nimport type { PenScratch, PenAnchor, PenSubpath } from 'tools/builtin/pen';\nimport { PATH_C, PATH_L, PATH_M, type PolygonPath } from '@weasel-js/geom';\nimport { anchorsToPath } from './anchors';\nimport { circlePath } from './markers';\n\n/** Appearance of the pen tool's in-progress path. */\nexport interface PenPreviewStyle {\n anchorFill?: string;\n anchorStroke?: string;\n handleStroke?: string;\n rubberBandStroke?: string;\n closeHintFill?: string;\n finishedSubpathStroke?: string;\n}\n\n/** Options for `createPenPreviewLayer`. */\nexport interface CreatePenPreviewLayerOptions {\n /** The Tool returned by usePenTool. The layer reads its scratch via\n * `tool.initScratch()` (the hook is contracted to return a stable ref). */\n penTool: Tool<PenScratch>;\n style?: PenPreviewStyle;\n}\n\nconst DEFAULT_STYLE: Required<PenPreviewStyle> = {\n anchorFill: '#d4c4a8',\n anchorStroke: '#d4c4a8',\n handleStroke: '#d4c4a8',\n rubberBandStroke: '#d4c4a8',\n closeHintFill: '#d4c4a8',\n finishedSubpathStroke: '#8a7a5e',\n};\n\nconst ANCHOR_RADIUS_PX = 4;\nconst HANDLE_DOT_RADIUS_PX = 3;\nconst CLOSE_HINT_RADIUS_PX = 8;\n\nfunction w2s(wx: number, wy: number, view: { x: number; y: number; scale: { x: number; y: number } }): [number, number] {\n return [(wx - view.x) * view.scale.x, (wy - view.y) * view.scale.y];\n}\n\n// approximateCircle has moved to `./markers.ts` as `circlePath`. Re-exported\n// locally so we don't rename callers in this file.\nfunction approximateCircle(cx: number, cy: number, r: number): PolygonPath {\n return circlePath(cx, cy, r);\n}\n\n/** A pen subpath as a screen-space `PolygonPath`, segmented by the same rule\n * the pen commits with. */\nfunction subpathToPath(\n sp: PenSubpath,\n view: { x: number; y: number; scale: { x: number; y: number } },\n): PolygonPath | null {\n if (sp.anchors.length === 0) return null;\n const pt = (p: { x: number; y: number }) => {\n const [x, y] = w2s(p.x, p.y, view);\n return { x, y };\n };\n const anchors = sp.anchors.map((a: PenAnchor) => ({\n ...pt(a),\n ...(a.inHandle ? { inHandle: pt(a.inHandle) } : {}),\n ...(a.outHandle ? { outHandle: pt(a.outHandle) } : {}),\n }));\n return anchorsToPath([anchors], [sp.closed]);\n}\n\n/** Render layer that draws the pen tool's path as it is being placed —\n * committed anchors, the rubber band to the cursor, and the close hint. Draws\n * nothing when the pen is idle. */\nexport function createPenPreviewLayer(\n opts: CreatePenPreviewLayerOptions,\n): RenderLayer<unknown> {\n const style = { ...DEFAULT_STYLE, ...(opts.style ?? {}) };\n // Stable scratch ref — the pen tool contract guarantees identity stability.\n const getScratch = (): PenScratch => opts.penTool.initScratch!();\n\n return {\n id: 'penPreview',\n label: 'Pen preview',\n space: 'screen',\n draw: (_data, view) => {\n const s = getScratch();\n const out: DrawCommand[] = [];\n\n // (1) Finished subpaths — faded outline.\n for (const sp of s.finishedSubpaths) {\n const path = subpathToPath(sp, view);\n if (path === null) continue;\n out.push({\n kind: 'path',\n path,\n stroke: { paint: { fill: 'solid', color: style.finishedSubpathStroke }, width: 1 },\n });\n }\n\n const cur = s.current;\n if (!cur && s.cursor === null) return out;\n\n // (2) Current subpath — bright outline.\n if (cur) {\n const path = subpathToPath(cur, view);\n if (path !== null) {\n out.push({\n kind: 'path',\n path,\n stroke: { paint: { fill: 'solid', color: style.rubberBandStroke }, width: 1 },\n });\n }\n }\n\n // (3) Rubber-band from latest anchor to cursor.\n if (cur && cur.anchors.length > 0 && s.cursor && s.draggingHandleAt === null) {\n const last = cur.anchors[cur.anchors.length - 1];\n const out2 = last.outHandle;\n const [sx, sy] = w2s(last.x, last.y, view);\n const [cx, cy] = w2s(s.cursor.x, s.cursor.y, view);\n let path: PolygonPath;\n if (out2) {\n const [c1x, c1y] = w2s(out2.x, out2.y, view);\n path = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_C]),\n coords: new Float32Array([sx, sy, c1x, c1y, cx, cy, cx, cy]),\n fillRule: 'nonzero',\n };\n } else {\n path = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, sy, cx, cy]),\n fillRule: 'nonzero',\n };\n }\n out.push({\n kind: 'path',\n path,\n stroke: { paint: { fill: 'solid', color: style.rubberBandStroke }, width: 1 },\n });\n }\n\n // (4) Anchor dots + handles.\n if (cur) {\n for (let i = 0; i < cur.anchors.length; i++) {\n const a = cur.anchors[i];\n const [ax, ay] = w2s(a.x, a.y, view);\n out.push({\n kind: 'path',\n path: approximateCircle(ax, ay, ANCHOR_RADIUS_PX),\n fill: { fill: 'solid', color: style.anchorFill },\n stroke: { paint: { fill: 'solid', color: style.anchorStroke }, width: 1 },\n });\n // Handle line + dot (only the latest anchor, per spec).\n if (i === cur.anchors.length - 1 && a.outHandle) {\n const [hx, hy] = w2s(a.outHandle.x, a.outHandle.y, view);\n const linePath: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([ax, ay, hx, hy]),\n fillRule: 'nonzero',\n };\n out.push({\n kind: 'path',\n path: linePath,\n stroke: { paint: { fill: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: approximateCircle(hx, hy, HANDLE_DOT_RADIUS_PX),\n fill: { fill: 'solid', color: style.handleStroke },\n });\n const inSide = a.inHandle;\n if (inSide) {\n const [mx, my] = w2s(inSide.x, inSide.y, view);\n const inLine: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([ax, ay, mx, my]),\n fillRule: 'nonzero',\n };\n out.push({\n kind: 'path',\n path: inLine,\n stroke: { paint: { fill: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: approximateCircle(mx, my, HANDLE_DOT_RADIUS_PX),\n fill: { fill: 'solid', color: style.handleStroke },\n });\n }\n }\n }\n\n // (5) Close-hint ring on first anchor.\n if (s.closeHintActive && cur.anchors.length >= 3) {\n const first = cur.anchors[0];\n const [fx, fy] = w2s(first.x, first.y, view);\n out.push({\n kind: 'path',\n path: approximateCircle(fx, fy, CLOSE_HINT_RADIUS_PX),\n stroke: { paint: { fill: 'solid', color: style.closeHintFill }, width: 1.5 },\n });\n }\n }\n\n return out;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"penPreviewLayer.js","names":["DEFAULT_STYLE","ANCHOR_RADIUS_PX","HANDLE_DOT_RADIUS_PX","CLOSE_HINT_RADIUS_PX","w2s","wx","view","wy","approximateCircle","circlePath","cx","cy","r","subpathToPath","sp","pt","x","y","p","anchors","a","anchorsToPath","createPenPreviewLayer","style","opts","s","out","path","cur","last","out2","sx","sy","c1x","c1y","PATH_M","PATH_C","PATH_L","i","ax","ay","hx","hy","linePath","inSide","mx","my","inLine","first","fx","fy"],"sources":["../../../src/features/paths/penPreviewLayer.ts"],"sourcesContent":["/**\n * Screen-space preview layer for `usePenTool`. Reads the pen's state each\n * frame and renders the in-progress path: finished\n * subpaths (faded), the current subpath (bright + anchor dots + handles),\n * a rubber-band segment from the latest anchor to the cursor, and a\n * close-hint ring on the first anchor when the tool flags it as hot.\n *\n * Runs in screen space so anchor/handle sizes stay constant under zoom.\n * All world-space coords go through `worldToScreen` via the layer's `view`\n * argument.\n */\n\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport type { RenderLayer } from 'core/layers/render';\nimport type { PenScratch, PenAnchor, PenSubpath } from 'tools/builtin/pen';\nimport { PATH_C, PATH_L, PATH_M, type PolygonPath, anchorsToPath, circlePath } from '@weasel-js/geom';\n\n/** Appearance of the pen tool's in-progress path. */\nexport interface PenPreviewStyle {\n anchorFill?: string;\n anchorStroke?: string;\n handleStroke?: string;\n rubberBandStroke?: string;\n closeHintFill?: string;\n finishedSubpathStroke?: string;\n}\n\n/** Options for `createPenPreviewLayer`. */\nexport interface CreatePenPreviewLayerOptions {\n /** The pen's state. One object for the pen's life, changed in place, so\n * the layer reads the same one on every frame. */\n state: PenScratch;\n style?: PenPreviewStyle;\n}\n\nconst DEFAULT_STYLE: Required<PenPreviewStyle> = {\n anchorFill: '#d4c4a8',\n anchorStroke: '#d4c4a8',\n handleStroke: '#d4c4a8',\n rubberBandStroke: '#d4c4a8',\n closeHintFill: '#d4c4a8',\n finishedSubpathStroke: '#8a7a5e',\n};\n\nconst ANCHOR_RADIUS_PX = 4;\nconst HANDLE_DOT_RADIUS_PX = 3;\nconst CLOSE_HINT_RADIUS_PX = 8;\n\nfunction w2s(wx: number, wy: number, view: { x: number; y: number; scale: { x: number; y: number } }): [number, number] {\n return [(wx - view.x) * view.scale.x, (wy - view.y) * view.scale.y];\n}\n\n// approximateCircle has moved to `./markers.ts` as `circlePath`. Re-exported\n// locally so we don't rename callers in this file.\nfunction approximateCircle(cx: number, cy: number, r: number): PolygonPath {\n return circlePath(cx, cy, r);\n}\n\n/** A pen subpath as a screen-space `PolygonPath`, segmented by the same rule\n * the pen commits with. */\nfunction subpathToPath(\n sp: PenSubpath,\n view: { x: number; y: number; scale: { x: number; y: number } },\n): PolygonPath | null {\n if (sp.anchors.length === 0) return null;\n const pt = (p: { x: number; y: number }) => {\n const [x, y] = w2s(p.x, p.y, view);\n return { x, y };\n };\n const anchors = sp.anchors.map((a: PenAnchor) => ({\n ...pt(a),\n ...(a.inHandle ? { inHandle: pt(a.inHandle) } : {}),\n ...(a.outHandle ? { outHandle: pt(a.outHandle) } : {}),\n }));\n return anchorsToPath([anchors], [sp.closed]);\n}\n\n/** Render layer that draws the pen tool's path as it is being placed —\n * committed anchors, the rubber band to the cursor, and the close hint. Draws\n * nothing when the pen is idle. */\nexport function createPenPreviewLayer(\n opts: CreatePenPreviewLayerOptions,\n): RenderLayer<unknown> {\n const style = { ...DEFAULT_STYLE, ...(opts.style ?? {}) };\n const s = opts.state;\n\n return {\n id: 'penPreview',\n label: 'Pen preview',\n space: 'screen',\n draw: (_data, view) => {\n const out: DrawCommand[] = [];\n\n // (1) Finished subpaths — faded outline.\n for (const sp of s.finishedSubpaths) {\n const path = subpathToPath(sp, view);\n if (path === null) continue;\n out.push({\n kind: 'path',\n path,\n stroke: { paint: { kind: 'solid', color: style.finishedSubpathStroke }, width: 1 },\n });\n }\n\n const cur = s.current;\n if (!cur && s.cursor === null) return out;\n\n // (2) Current subpath — bright outline.\n if (cur) {\n const path = subpathToPath(cur, view);\n if (path !== null) {\n out.push({\n kind: 'path',\n path,\n stroke: { paint: { kind: 'solid', color: style.rubberBandStroke }, width: 1 },\n });\n }\n }\n\n // (3) Rubber-band from latest anchor to cursor.\n if (cur && cur.anchors.length > 0 && s.cursor && s.draggingHandleAt === null) {\n const last = cur.anchors[cur.anchors.length - 1];\n const out2 = last.outHandle;\n const [sx, sy] = w2s(last.x, last.y, view);\n const [cx, cy] = w2s(s.cursor.x, s.cursor.y, view);\n let path: PolygonPath;\n if (out2) {\n const [c1x, c1y] = w2s(out2.x, out2.y, view);\n path = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_C]),\n coords: new Float32Array([sx, sy, c1x, c1y, cx, cy, cx, cy]),\n fillRule: 'nonzero',\n };\n } else {\n path = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([sx, sy, cx, cy]),\n fillRule: 'nonzero',\n };\n }\n out.push({\n kind: 'path',\n path,\n stroke: { paint: { kind: 'solid', color: style.rubberBandStroke }, width: 1 },\n });\n }\n\n // (4) Anchor dots + handles.\n if (cur) {\n for (let i = 0; i < cur.anchors.length; i++) {\n const a = cur.anchors[i];\n const [ax, ay] = w2s(a.x, a.y, view);\n out.push({\n kind: 'path',\n path: approximateCircle(ax, ay, ANCHOR_RADIUS_PX),\n fill: { paint: { kind: 'solid', color: style.anchorFill } },\n stroke: { paint: { kind: 'solid', color: style.anchorStroke }, width: 1 },\n });\n // Handle line + dot (only the latest anchor, per spec).\n if (i === cur.anchors.length - 1 && a.outHandle) {\n const [hx, hy] = w2s(a.outHandle.x, a.outHandle.y, view);\n const linePath: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([ax, ay, hx, hy]),\n fillRule: 'nonzero',\n };\n out.push({\n kind: 'path',\n path: linePath,\n stroke: { paint: { kind: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: approximateCircle(hx, hy, HANDLE_DOT_RADIUS_PX),\n fill: { paint: { kind: 'solid', color: style.handleStroke } },\n });\n const inSide = a.inHandle;\n if (inSide) {\n const [mx, my] = w2s(inSide.x, inSide.y, view);\n const inLine: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L]),\n coords: new Float32Array([ax, ay, mx, my]),\n fillRule: 'nonzero',\n };\n out.push({\n kind: 'path',\n path: inLine,\n stroke: { paint: { kind: 'solid', color: style.handleStroke }, width: 1 },\n });\n out.push({\n kind: 'path',\n path: approximateCircle(mx, my, HANDLE_DOT_RADIUS_PX),\n fill: { paint: { kind: 'solid', color: style.handleStroke } },\n });\n }\n }\n }\n\n // (5) Close-hint ring on first anchor.\n if (s.closeHintActive && cur.anchors.length >= 3) {\n const first = cur.anchors[0];\n const [fx, fy] = w2s(first.x, first.y, view);\n out.push({\n kind: 'path',\n path: approximateCircle(fx, fy, CLOSE_HINT_RADIUS_PX),\n stroke: { paint: { kind: 'solid', color: style.closeHintFill }, width: 1.5 },\n });\n }\n }\n\n return out;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import { boundsOfPath as e, boxToBox as t, poseFrameOf as n, regularPolygonPath as r, starPath as i, transformPath as a, worldEditToStorage as o } from "@weasel-js/geom";
2
+ //#region src/features/paths/shapeGenerator.ts
3
+ var s = {
4
+ min: 3,
5
+ max: 32
6
+ }, c = {
7
+ min: .01,
8
+ max: 1
9
+ }, l = (e) => typeof e == "number" && Number.isFinite(e);
10
+ function u(e) {
11
+ if (typeof e != "object" || !e) return !1;
12
+ let t = e;
13
+ return l(t.rotation) ? t.kind === "polygon" ? l(t.sides) : t.kind === "star" && l(t.points) && l(t.innerRadiusRatio) : !1;
14
+ }
15
+ function d(e) {
16
+ let t = e?.generator;
17
+ return u(t) ? t : null;
18
+ }
19
+ var f = (e, t, n) => Math.min(n, Math.max(t, e)), p = (e) => f(Math.round(e), s.min, s.max);
20
+ function m(e) {
21
+ return e.kind === "polygon" ? {
22
+ kind: "polygon",
23
+ sides: p(e.sides),
24
+ rotation: e.rotation
25
+ } : {
26
+ kind: "star",
27
+ points: p(e.points),
28
+ innerRadiusRatio: f(e.innerRadiusRatio, c.min, c.max),
29
+ rotation: e.rotation
30
+ };
31
+ }
32
+ function h(e, t = {
33
+ x: 0,
34
+ y: 0
35
+ }, n = 1) {
36
+ let a = m(e);
37
+ return a.kind === "polygon" ? r(t, n, a.sides, a.rotation) : i(t, n, a.points, n * a.innerRadiusRatio, a.rotation);
38
+ }
39
+ function g(e) {
40
+ if (typeof e != "object" || !e || !("generator" in e)) return e;
41
+ let { generator: t, ...n } = e;
42
+ return n;
43
+ }
44
+ function _(n, r) {
45
+ let i = n;
46
+ if (i?.kind !== "polygon") return !1;
47
+ let a = h(r);
48
+ if (i.coords.length !== a.coords.length) return !1;
49
+ let o = e(a), s = e(i), c = t(o.x, o.y, o.width, o.height, s.x, s.y, s.width, s.height), l = 1e-4 * Math.max(1, Math.abs(s.x) + s.width, Math.abs(s.y) + s.height);
50
+ for (let e = 0; e + 1 < a.coords.length; e += 2) {
51
+ let t = c[0] * a.coords[e] + c[4], n = c[3] * a.coords[e + 1] + c[5];
52
+ if (Math.abs(t - i.coords[e]) > l || Math.abs(n - i.coords[e + 1]) > l) return !1;
53
+ }
54
+ return !0;
55
+ }
56
+ function v(r, i) {
57
+ let s = d(r.data);
58
+ if (!s || !_(r.data.path, s)) return null;
59
+ let c = m(i), l = e(h(s)), { pose: u } = r, f = t(l.x, l.y, l.width, l.height, u.x, u.y, u.width, u.height), p = a(h(c), f), g = n(u), v = g ? a(p, g) : p, y = o(u, v);
60
+ return {
61
+ pose: y.pose,
62
+ data: {
63
+ ...r.data,
64
+ path: y.path,
65
+ generator: c
66
+ }
67
+ };
68
+ }
69
+ function y(e, t) {
70
+ let n = e.data;
71
+ if (typeof n != "object" || !n || !("generator" in n)) return e;
72
+ let r = n.generator, i = d(t.data);
73
+ if (i !== null && JSON.stringify(r) === JSON.stringify(i)) return e;
74
+ let a = i !== null && u(r) && r.kind === i.kind ? v({
75
+ pose: e.pose,
76
+ data: {
77
+ ...n,
78
+ generator: i
79
+ }
80
+ }, r) : null;
81
+ return {
82
+ ...e,
83
+ ...a ?? { data: g(e.data) }
84
+ };
85
+ }
86
+ //#endregion
87
+ export { s as SHAPE_COUNT_RANGE, c as STAR_RATIO_RANGE, m as clampShapeGenerator, u as isShapeGenerator, v as regenerateShape, y as settleShapeGenerator, d as shapeGeneratorOf, h as shapeGeneratorPath, g as withoutShapeGenerator };
88
+
89
+ //# sourceMappingURL=shapeGenerator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeGenerator.js","names":["SHAPE_COUNT_RANGE","STAR_RATIO_RANGE","finite","v","isShapeGenerator","g","shapeGeneratorOf","data","clamp","hi","lo","count","clampShapeGenerator","shapeGeneratorPath","c","regularPolygonPath","center","radius","starPath","withoutShapeGenerator","_dropped","rest","pathMatches","p","path","unit","u","boundsOfPath","b","m","boxToBox","tol","i","x","y","regenerateShape","held","node","next","was","toLocal","pose","local","transformPath","frame","poseFrameOf","world","stored","worldEditToStorage","settleShapeGenerator","raw","prev","regenerated"],"sources":["../../../src/features/paths/shapeGenerator.ts"],"sourcesContent":["/**\n * The parameters a polygon or star was drawn with, kept on the node beside the\n * geometry they made (`data.generator` beside `data.path`), so the shape stays\n * editable as a polygon or a star after it is drawn.\n *\n * `data.path` stays the geometry every reader uses; the generator only says how\n * to make it again. Editing the path itself turns the shape into plain\n * geometry: the generator is dropped, since it could no longer reproduce what\n * is drawn. A generator whose path no longer matches it (a writer that changed\n * the path without dropping it) is treated the same way.\n */\nimport {\n boundsOfPath,\n boxToBox,\n poseFrameOf,\n regularPolygonPath,\n starPath,\n transformPath,\n worldEditToStorage,\n type PathInWorldPose,\n type PolygonPath,\n} from '@weasel-js/geom';\n\n/** A regular polygon's parameters. `rotation` is the angle of its first\n * vertex, in radians, inside the pose's own rotation. */\nexport interface PolygonGenerator {\n kind: 'polygon';\n sides: number;\n rotation: number;\n}\n\n/** A star's parameters. `innerRadiusRatio` is the inner radius over the outer\n * one; `rotation` is the angle of its first point, in radians, inside the\n * pose's own rotation. */\nexport interface StarGenerator {\n kind: 'star';\n points: number;\n innerRadiusRatio: number;\n rotation: number;\n}\n\n/** The parameters a node's `data.path` was generated from. */\nexport type ShapeGenerator = PolygonGenerator | StarGenerator;\n\n/** The range of a polygon's side count and a star's point count. */\nexport const SHAPE_COUNT_RANGE = { min: 3, max: 32 } as const;\n\n/** The range of a star's `innerRadiusRatio`. */\nexport const STAR_RATIO_RANGE = { min: 0.01, max: 1 } as const;\n\nconst finite = (v: unknown): v is number => typeof v === 'number' && Number.isFinite(v);\n\n/** Whether `v` is a well-formed {@link ShapeGenerator}. */\nexport function isShapeGenerator(v: unknown): v is ShapeGenerator {\n if (v === null || typeof v !== 'object') return false;\n const g = v as Record<string, unknown>;\n if (!finite(g.rotation)) return false;\n if (g.kind === 'polygon') return finite(g.sides);\n if (g.kind === 'star') return finite(g.points) && finite(g.innerRadiusRatio);\n return false;\n}\n\n/** The generator a node's `data` holds, or `null`. */\nexport function shapeGeneratorOf(data: unknown): ShapeGenerator | null {\n const g = (data as { generator?: unknown } | null | undefined)?.generator;\n return isShapeGenerator(g) ? g : null;\n}\n\nconst clamp = (v: number, lo: number, hi: number): number => Math.min(hi, Math.max(lo, v));\nconst count = (v: number): number => clamp(Math.round(v), SHAPE_COUNT_RANGE.min, SHAPE_COUNT_RANGE.max);\n\n/** `g` with its counts rounded and every field held in range. */\nexport function clampShapeGenerator(g: ShapeGenerator): ShapeGenerator {\n if (g.kind === 'polygon') return { kind: 'polygon', sides: count(g.sides), rotation: g.rotation };\n return {\n kind: 'star',\n points: count(g.points),\n innerRadiusRatio: clamp(g.innerRadiusRatio, STAR_RATIO_RANGE.min, STAR_RATIO_RANGE.max),\n rotation: g.rotation,\n };\n}\n\n/** The shape `g` makes, on a circle of `radius` around `center`. */\nexport function shapeGeneratorPath(\n g: ShapeGenerator,\n center: { x: number; y: number } = { x: 0, y: 0 },\n radius = 1,\n): PolygonPath {\n const c = clampShapeGenerator(g);\n return c.kind === 'polygon'\n ? regularPolygonPath(center, radius, c.sides, c.rotation)\n : starPath(center, radius, c.points, radius * c.innerRadiusRatio, c.rotation);\n}\n\n/** `data` without its generator: the shape as plain geometry. */\nexport function withoutShapeGenerator<T>(data: T): T {\n if (data === null || typeof data !== 'object' || !('generator' in data)) return data;\n const { generator: _dropped, ...rest } = data as Record<string, unknown>;\n void _dropped;\n return rest as T;\n}\n\n/** Whether `path` is what `g` makes, up to the box-to-box map storage applies. */\nfunction pathMatches(path: unknown, g: ShapeGenerator): boolean {\n const p = path as PolygonPath | undefined;\n if (p?.kind !== 'polygon') return false;\n const unit = shapeGeneratorPath(g);\n if (p.coords.length !== unit.coords.length) return false;\n const u = boundsOfPath(unit);\n const b = boundsOfPath(p);\n const m = boxToBox(u.x, u.y, u.width, u.height, b.x, b.y, b.width, b.height);\n // Paths store float32 coordinates, so the slack scales with how far they are from the origin.\n const tol = 1e-4 * Math.max(1, Math.abs(b.x) + b.width, Math.abs(b.y) + b.height);\n for (let i = 0; i + 1 < unit.coords.length; i += 2) {\n const x = m[0] * unit.coords[i] + m[4];\n const y = m[3] * unit.coords[i + 1] + m[5];\n if (Math.abs(x - p.coords[i]) > tol || Math.abs(y - p.coords[i + 1]) > tol) return false;\n }\n return true;\n}\n\n/** A node's two halves, as a regeneration reads and writes them. */\nexport interface GeneratedShape<P extends PathInWorldPose = PathInWorldPose> {\n pose: P;\n data: unknown;\n}\n\n/**\n * `node` made again from `next`, in place: the new shape takes the box the old\n * one's circle had, under the same rotation and transform, so a star given\n * more points keeps its center and its size. Returns `null` when the node holds\n * no generator, or its path no longer matches the one it holds.\n */\nexport function regenerateShape<P extends PathInWorldPose>(\n node: GeneratedShape<P>,\n next: ShapeGenerator,\n): GeneratedShape<P> | null {\n const held = shapeGeneratorOf(node.data);\n if (!held || !pathMatches((node.data as { path?: unknown }).path, held)) return null;\n const g = clampShapeGenerator(next);\n const was = boundsOfPath(shapeGeneratorPath(held));\n const { pose } = node;\n // Where the unit circle of the held generator lands in the pose's local frame.\n const toLocal = boxToBox(was.x, was.y, was.width, was.height, pose.x, pose.y, pose.width, pose.height);\n const local = transformPath(shapeGeneratorPath(g), toLocal) as PolygonPath;\n const frame = poseFrameOf(pose);\n const world = frame ? (transformPath(local, frame) as PolygonPath) : local;\n const stored = worldEditToStorage(pose, world);\n return { pose: stored.pose, data: { ...(node.data as object), path: stored.path, generator: g } };\n}\n\n/**\n * What a write that left a node as `next`, from `prev`, stores: when the write\n * changed the generator, the shape made again from it. A generator written\n * onto a node that held none, or of another kind, or onto one whose path no\n * longer matches, is dropped, leaving the shape as plain geometry. Any other\n * write is stored as written. Fits `NodePropertiesEntry.settle`.\n */\nexport function settleShapeGenerator<N extends { pose: unknown; data: unknown }>(next: N, prev: N): N {\n const data = next.data as Record<string, unknown> | null;\n if (data === null || typeof data !== 'object' || !('generator' in data)) return next;\n const raw = data.generator;\n const held = shapeGeneratorOf(prev.data);\n if (held !== null && JSON.stringify(raw) === JSON.stringify(held)) return next;\n const regenerated = held !== null && isShapeGenerator(raw) && raw.kind === held.kind\n ? regenerateShape({ pose: next.pose as PathInWorldPose, data: { ...data, generator: held } }, raw)\n : null;\n return { ...next, ...(regenerated ?? { data: withoutShapeGenerator(next.data) }) };\n}\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { rectFromPlane as e } from "../../core/viewport/parallax.js";
2
+ import { liveEditablePath as t } from "./editablePath.js";
3
+ import { createPathEditState as n } from "./pathEditState.js";
4
+ import { createPathEditingOverlayLayer as r } from "./pathEditingOverlayLayer.js";
5
+ import { useState as i } from "react";
6
+ import { useLatest as a } from "@weasel-js/react";
7
+ //#region src/features/paths/usePathEdit.ts
8
+ function o(e) {
9
+ let t = a(e), [r] = i(() => n({
10
+ host: () => t.current.host,
11
+ isAllowed: () => t.current.isAllowed?.() ?? !0,
12
+ isSelectedNode: (e) => t.current.isSelectedNode(e)
13
+ }));
14
+ return r;
15
+ }
16
+ function s(n, o) {
17
+ let s = a(o), [c] = i(() => ({
18
+ ...r({
19
+ getEditingId: () => n.getEditingId() || null,
20
+ getPose: (e, n, r) => t(e, s.current.nodeOf(e), n, s.current.planeOfNode(e, r)),
21
+ getSelectedAnchors: n.getSelectedAnchors,
22
+ getMarquee: (t) => {
23
+ let r = n.getMarquee(), i = r ? s.current.planeOfNode(n.getEditingId(), t) : null;
24
+ return r && i ? e(i, r) : r;
25
+ }
26
+ }),
27
+ subscribe: n.subscribe
28
+ }));
29
+ return c;
30
+ }
31
+ //#endregion
32
+ export { s as usePathEditOverlayLayer, o as usePathEditState };
33
+
34
+ //# sourceMappingURL=usePathEdit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePathEdit.js","names":["usePathEditState","live","useLatest","options","state","useState","createPathEditState","id","usePathEditOverlayLayer","inputs","layer","createPathEditingOverlayLayer","liveEditablePath","previews","view","rect","plane","rectFromPlane"],"sources":["../../../src/features/paths/usePathEdit.ts"],"sourcesContent":["/**\n * The path-edit state and its anchor overlay for one canvas surface.\n */\nimport { useLatest } from '@weasel-js/react';\nimport { useState } from 'react';\nimport type { PathEditHost } from 'canvas/SceneCanvas/pathEditHost';\nimport type { RenderLayer } from 'core/layers/render';\nimport { rectFromPlane, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { liveEditablePath, type EditableShape } from './editablePath';\nimport { createPathEditingOverlayLayer } from './pathEditingOverlayLayer';\nimport { createPathEditState, type PathEditState } from './pathEditState';\n\nexport interface UsePathEditStateOptions {\n /** `<SceneCanvas pathEdit>`. */\n host: PathEditHost | undefined;\n /** See `PathEditSource.isAllowed`; absent when no mode registry is wired. */\n isAllowed: (() => boolean) | undefined;\n isSelectedNode: (id: string) => boolean;\n}\n\n/** One state object for the life of the component, answering from the\n * options of the last committed render. */\nexport function usePathEditState(options: UsePathEditStateOptions): PathEditState {\n const live = useLatest(options);\n const [state] = useState(() => createPathEditState({\n host: () => live.current.host,\n isAllowed: () => live.current.isAllowed?.() ?? true,\n isSelectedNode: (id) => live.current.isSelectedNode(id),\n }));\n return state;\n}\n\nexport interface PathEditOverlayInputs {\n /** The committed node for an id, or nothing once it is gone. */\n nodeOf: (id: string) => EditableShape | null | undefined;\n /** How `view`'s world maps into the parallax plane `id` is drawn through. */\n planeOfNode: (id: string, view: View) => PlaneMap | null;\n}\n\n/** The anchor overlay for `state`. Built once: it reads `inputs` as of the\n * last commit and repaints itself when the state changes. */\nexport function usePathEditOverlayLayer(\n state: PathEditState,\n inputs: PathEditOverlayInputs,\n): RenderLayer<unknown> {\n const live = useLatest(inputs);\n const [layer] = useState<RenderLayer<unknown>>(() => ({\n ...createPathEditingOverlayLayer({\n getEditingId: () => state.getEditingId() || null,\n getPose: (id, previews, view) =>\n liveEditablePath(id, live.current.nodeOf(id), previews, live.current.planeOfNode(id, view)),\n getSelectedAnchors: state.getSelectedAnchors,\n // Drawn by an action that ran in the edited path's plane.\n getMarquee: (view) => {\n const rect = state.getMarquee();\n const plane = rect ? live.current.planeOfNode(state.getEditingId(), view) : null;\n return rect && plane ? rectFromPlane(plane, rect) : rect;\n },\n }),\n subscribe: state.subscribe,\n }));\n return layer;\n}\n"],"mappings":";;;;;;;AAuBA,SAAgBA,EAAiB,GAAiD;CAChF,IAAMC,IAAOC,EAAUC,CAAO,GACxB,CAACC,KAASC,QAAeC,EAAoB;EACjD,YAAYL,EAAK,QAAQ;EACzB,iBAAiBA,EAAK,QAAQ,YAAY,KAAK;EAC/C,iBAAiB,MAAOA,EAAK,QAAQ,eAAeM,CAAE;CACxD,CAAC,CAAC;CACF,OAAOH;AACT;AAWA,SAAgBI,EACd,GACA,GACsB;CACtB,IAAMP,IAAOC,EAAUO,CAAM,GACvB,CAACC,KAASL,SAAsC;EACpD,GAAGM,EAA8B;GAC/B,oBAAoBP,EAAM,aAAa,KAAK;GAC5C,UAAU,GAAI,GAAU,MACtBQ,EAAiBL,GAAIN,EAAK,QAAQ,OAAOM,CAAE,GAAGM,GAAUZ,EAAK,QAAQ,YAAYM,GAAIO,CAAI,CAAC;GAC5F,oBAAoBV,EAAM;GAE1B,aAAa,MAAS;IACpB,IAAMW,IAAOX,EAAM,WAAW,GACxBY,IAAQD,IAAOd,EAAK,QAAQ,YAAYG,EAAM,aAAa,GAAGU,CAAI,IAAI;IAC5E,OAAOC,KAAQC,IAAQC,EAAcD,GAAOD,CAAI,IAAIA;GACtD;EACF,CAAC;EACD,WAAWX,EAAM;CACnB,EAAE;CACF,OAAOM;AACT"}