@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":"overlay.js","names":["projectBounds","t","viewToTransform","view","sx","sy","worldToScreen","b","leavesOf","isContainer","id","out","visit","kids","getChildren","nid","k","composeSelectionPose","opts","d","AUTO_POSE_DESCRIPTOR","selectionLeaves","resolveLeaf","moved","moveOverlay","resizeOverlay","getStoredPose","leaves","containerResizeLeafPoses","leafBounds","leafId","visualBoundsViaDescriptor","overlayLeaf","u","unionAABB","makeContainerAwareBoundsResolver","oriented","p","getPose","DEFAULT_OUTLINE","DEFAULT_HANDLE_FILL","DEFAULT_HANDLE_OUTLINE","DEFAULT_HANDLE_SIZE","HANDLE_BASE_PX","defaultHandlesOf","resolveOutlineStroke","resolveHandles","rotateAroundMat3","c","theta","s","tx","cx","cy","ty","rectPathFor","outlineCommandsFor","align","stroke","width","resolveStrokeWidth","ids","worldB","resolveBounds","padded","pad","rot","poseRotationOf","r","alignedStrokeRect","q","screenCorners","PATH_M","PATH_L","PATH_Z","rectCorners","w","rotatePoint","x","y","ccx","ccy","normal","nx","a","ny","l","mx","my","n1","i","n2","handleCommandsFor","half","handles","handleAlign","handleWidth","angle","screenAngleOf","hLocal","handlesOf","hWorld","hsx","hsy","center","baseRect","sr","fillCmd","strokeCmd","rotationHandleCommands","rotationHandle","distance","rotation","scx","scy","size","arcRadius","ARC_HALF_ANGLE","arcWidth","cmds","xs","ys","arcCoords","arcPath","headLen","headWidth","arrowHead","len","ux","uy","px","py","tipX","endX","tipY","endY","baseLeftX","baseLeftY","baseRightX","baseRightY","angleA","endAX","endAY","tangentAX","tangentAY","angleB","endBX","endBY","tangentBX","tangentBY","headA","headB","headFill","transform","mat3","buildSelectionLayer","passes","poseBounds","rotationHandleDistance","rotationBadgeOf","chromeState","asChromeState","data","allIds","chromeSelectionIds","suppressed","isVisible","asIsVisible","showOutline","showHandles","showRotation","resolveTargetBounds","MULTI_RESIZE_TARGET_ID","outlineIdsRaw","outlineIds","cmd","DEFAULT_ROTATION_HANDLE_DISTANCE","createSelectionOutlineLayer","createSelectionHandlesLayer","createSelectionOverlayLayer","maybe","state"],"sources":["../../../src/features/selection/overlay.ts"],"sourcesContent":["/**\n * Selection overlay primitives — render layers for drawing selection\n * outlines and corner resize handles in world space.\n *\n * Three pieces:\n * - `composeSelectionPose` resolves the live pose for a selected id by\n * consulting the move overlay first, then the resize overlay, then the\n * stored pose. When `getChildren`/`isContainer` are supplied and the id\n * resolves to a container, the returned pose is the union AABB of all\n * transitive leaf poses (with the same precedence rules applied per leaf).\n * - `createSelectionOutlineLayer` draws the outline rect for each selected\n * id (container ids resolve to a union AABB via `getChildren`/`isContainer`).\n * - `createSelectionHandlesLayer` draws resize-handle rects (default 4\n * corners) for each selected id, with the same container-resolution rules.\n *\n * `createSelectionOverlayLayer` is a thin convenience that returns a single\n * `RenderLayer` whose draw runs the outline pass then the handles pass.\n *\n * **Pose shape:** TPose is generic; callers pass `poseDescriptor` for poses\n * `AUTO_POSE_DESCRIPTOR` can't read. Container ids reduce via `unionAABB`\n * over the projected AABBs.\n */\n\nimport type { DrawCommand } from '../../renderer';\nimport { mat3, type GlMat3 } from '../../renderer';\nimport type { NodeId } from 'core/scene/types';\nimport type { RenderLayer } from 'core/layers/render';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport {\n visualBoundsViaDescriptor,\n type PoseDescriptor,\n} from 'core/geometry/poseDescriptor';\nimport { AUTO_POSE_DESCRIPTOR } from 'interactions/actions/resize/autoPoseDescriptor';\nimport { alignedStrokeRect, type CommandFill, type CommandStroke } from '@weasel-js/paint';\nimport { resolveStrokeWidth } from 'features/paths/tessellate/stroke';\nimport {\n rotationHandle,\n DEFAULT_ROTATION_HANDLE_DISTANCE,\n} from 'interactions/actions/rotate/handle';\nimport { rectCorners, rotatePoint } from 'interactions/actions/rotate/geometry';\nimport { poseRotationOf } from 'core/geometry/poseRotation';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { ChromeState } from 'core/selection/chromeState';\nimport { MULTI_RESIZE_TARGET_ID } from 'core/selection/selectionTarget';\nimport type { View } from 'core/viewport/view';\nimport { viewToTransform } from 'core/viewport/view';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport { screenAngleOf } from 'core/viewport/pxExtent';\nimport { PATH_L, PATH_M, PATH_Z, type PolygonPath } from '@weasel-js/geom';\nimport { HANDLE_BASE_PX } from 'core/device/targets';\n\n/** Project world AABB into screen-space AABB using the active view. */\nfunction projectBounds<B extends Bounds>(b: B, view: View): B {\n const t = viewToTransform(view);\n const [sx, sy] = worldToScreen(b.x, b.y, t);\n return { ...b, x: sx, y: sy, width: b.width * view.scale.x, height: b.height * view.scale.y };\n}\n\n\n/**\n * Transitive leaf ids under `id`. A childless node is a leaf only if it is not\n * itself a container: an empty container contributes no bounds, and its own\n * stored pose is at its most stale when no children are left to have moved it.\n */\nfunction leavesOf(\n id: string,\n getChildren: (id: string) => readonly string[],\n isContainer: (id: string) => boolean,\n): string[] {\n if (!isContainer(id)) return [id];\n const out: string[] = [];\n const visit = (nid: string) => {\n const kids = getChildren(nid);\n if (kids.length === 0) { if (!isContainer(nid)) out.push(nid); return; }\n for (const k of kids) visit(k);\n };\n visit(id);\n return out;\n}\n\n/** Options for `composeSelectionPose`. */\nexport interface ComposeSelectionPoseOpts<TPose> {\n /** Move overlay; when present its `poses` map wins over everything else. */\n moveOverlay?: { poses: Map<string, TPose> } | null;\n /**\n * Resize overlay; consulted only when move overlay does not own the id.\n * For container resize, `leafPoses` (when present) maps each leaf id under\n * the container to its overlay pose. If absent the container falls back to\n * stored leaf poses (defensive — container-resize integration is in flight).\n */\n resizeOverlay?: {\n id: string;\n currentPose: TPose;\n leafPoses?: Map<string, TPose>;\n } | null;\n /** Fallback pose lookup (typically the stored/committed pose). */\n getStoredPose: (id: string) => TPose;\n /** How to read poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n /** Walk a container's direct children (e.g. `scene.childrenOf`). With\n * `isContainer`, a selected container resolves to the union AABB of its\n * transitive leaf poses instead of its own stored pose. */\n getChildren?: (id: string) => readonly string[];\n /** True when `id` is a structural container. */\n isContainer?: (id: string) => boolean;\n}\n\n/**\n * Build a pose resolver for a selection. Precedence per id:\n * move overlay > resize overlay > stored. When `getChildren`/`isContainer`\n * are supplied and the id resolves to a container, the resolver returns the\n * union AABB of all transitive leaf poses (each leaf still subject to the\n * precedence rules). Containers with no leaves resolve to `null`.\n */\nexport function composeSelectionPose<TPose>(\n opts: ComposeSelectionPoseOpts<TPose>,\n): (id: string) => TPose | null {\n const { moveOverlay, resizeOverlay, getStoredPose, getChildren, isContainer } = opts;\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const selectionLeaves = (id: string): string[] =>\n getChildren && isContainer ? leavesOf(id, getChildren, isContainer) : [id];\n\n const resolveLeaf = (id: string): TPose => {\n const moved = moveOverlay?.poses.get(id);\n if (moved !== undefined) return moved;\n if (resizeOverlay && resizeOverlay.id === id) return resizeOverlay.currentPose;\n return getStoredPose(id);\n };\n\n return (id: string): TPose | null => {\n if (isContainer?.(id)) {\n const leaves = selectionLeaves(id);\n if (leaves.length === 0) return null;\n const containerResizeLeafPoses =\n resizeOverlay && resizeOverlay.id === id ? resizeOverlay.leafPoses : undefined;\n const leafBounds: Bounds[] = [];\n for (const leafId of leaves) {\n const moved = moveOverlay?.poses.get(leafId);\n if (moved !== undefined) {\n leafBounds.push(visualBoundsViaDescriptor(moved, d));\n continue;\n }\n const overlayLeaf = containerResizeLeafPoses?.get(leafId);\n if (overlayLeaf !== undefined) {\n leafBounds.push(visualBoundsViaDescriptor(overlayLeaf, d));\n continue;\n }\n leafBounds.push(visualBoundsViaDescriptor(getStoredPose(leafId), d));\n }\n const u = unionAABB(leafBounds);\n if (u === null) return null;\n return d.fromBounds(u, getStoredPose(leaves[0]!));\n }\n return resolveLeaf(id);\n };\n}\n\n/**\n * Build a pose resolver that handles container ids by computing the union\n * AABB of every leaf's bounds. Non-container ids pass through directly. When\n * `getChildren`/`isContainer` are omitted, every id is treated as a leaf.\n */\nfunction makeContainerAwareBoundsResolver<TPose>(\n getPose: (id: string) => TPose | null,\n d: PoseDescriptor<TPose>,\n getChildren?: (id: string) => readonly string[],\n isContainer?: (id: string) => boolean,\n): (id: string) => Bounds | null {\n const oriented = (p: TPose): Bounds => {\n const b = d.getBounds(p);\n const r = d.getRotation?.(p);\n return r ? { ...b, rotation: r } : b;\n };\n if (getChildren === undefined || isContainer === undefined) {\n return (id: string) => {\n const p = getPose(id);\n return p === null ? null : oriented(p);\n };\n }\n return (id: string): Bounds | null => {\n if (!isContainer(id)) {\n const p = getPose(id);\n return p === null ? null : oriented(p);\n }\n const leaves = leavesOf(id, getChildren, isContainer);\n if (leaves.length === 0) return null;\n const leafBounds: Bounds[] = [];\n for (const leafId of leaves) {\n const p = getPose(leafId);\n if (p !== null) leafBounds.push(visualBoundsViaDescriptor(p, d));\n }\n if (leafBounds.length === 0) return null;\n return unionAABB(leafBounds);\n };\n}\n\n/** Options every selection layer shares. `getSelection` and `getPose` are\n * declared on {@link SelectionOverlayLayerOpts}, which makes both optional —\n * omitted, they come off the draw envelope. */\ninterface SelectionLayerCommon<TPose> {\n /** How to read poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n /** Walk a container's direct children (e.g. `scene.childrenOf`). When\n * supplied with `isContainer`, any id that resolves to a container is\n * rendered using the union bounds of all its transitive leaves. */\n getChildren?: (id: string) => readonly string[];\n /** True when `id` is a structural container. */\n isContainer?: (id: string) => boolean;\n}\n\n/** Options for `createSelectionOutlineLayer`. The overlay layer's options\n * minus the handle visuals — the two run the same body. */\nexport type SelectionOutlineLayerOpts<TPose> =\n Omit<SelectionOverlayLayerOpts<TPose>, 'handles' | 'handlesOf' | 'rotationHandle'>;\n\n/** Options for `createSelectionHandlesLayer`. The overlay layer's options\n * minus the outline stroke — the two run the same body. */\nexport type SelectionHandlesLayerOpts<TPose> =\n Omit<SelectionOverlayLayerOpts<TPose>, 'outline'>;\n\n/** Options for `createSelectionOverlayLayer`. */\nexport interface SelectionOverlayLayerOpts<TPose>\n extends SelectionLayerCommon<TPose> {\n /**\n * Which ids to draw chrome for. Omit to take them from the `ChromeState` on\n * the draw envelope, which is what makes one canvas's several views each\n * outline their own selection — the layer is shared, the envelope is not.\n *\n * A multi-selection resolves to the synthetic union id, with the real\n * members going to the outline pass, exactly as the explicit form does.\n */\n getSelection?: () => readonly NodeId[];\n /**\n * Resolve an id to the pose to draw chrome around. Return null to skip an\n * id. Omit to take bounds from the same envelope `getSelection` omitted\n * takes ids from — one cascade, the one the chrome state was built with,\n * rather than a second one here that has to agree with it.\n *\n * Takes `string` rather than `NodeId` because the container-aware resolver\n * walks expanded leaf ids via `getChildren`, which is generic over strings.\n */\n getPose?: (id: string) => TPose | null;\n outline?: CommandStroke & { pad?: number };\n /** Pass `false` to render outlines only. */\n handles?: SelectionHandleStyle | false;\n handlesOf?: (bounds: Bounds) => { x: number; y: number }[];\n /** Draw a rotate badge above the selection's top edge. `true` places it at\n * the default offset; `distance` sets the offset in screen pixels. Off by\n * default. */\n rotationHandle?:\n | boolean\n | {\n distance?: number;\n };\n /** Optional separate id list for the per-item outline pass. Use this in\n * multi-selection contexts where the handle pass works against a synthetic\n * union id (e.g. `MULTI_RESIZE_TARGET_ID`) but consumers still want to\n * see outlines around each real member. When omitted, the outline pass\n * uses the same `getSelection` ids as the handle pass. */\n getOutlineIds?: () => readonly NodeId[];\n /** Optional set of ids to suppress entirely — both outline and handles\n * are skipped. Used by SceneCanvas to hide the standard selection\n * chrome on the node currently in path-anchor edit mode, where the\n * per-anchor chrome takes over. */\n getSuppressedIds?: () => ReadonlySet<string>;\n}\n\nconst DEFAULT_OUTLINE: Required<Pick<CommandStroke, 'paint' | 'width'>> & { pad: number } = {\n paint: { fill: 'solid', color: '#f0e0a8' },\n width: 2,\n pad: 1,\n};\nconst DEFAULT_HANDLE_FILL: CommandFill = { fill: 'solid', color: '#d4c4a8' };\nconst DEFAULT_HANDLE_OUTLINE: CommandStroke = {\n paint: { fill: 'solid', color: '#1a130d' },\n width: 1,\n};\nconst DEFAULT_HANDLE_SIZE = HANDLE_BASE_PX;\n\nfunction defaultHandlesOf(b: Bounds): { x: number; y: number }[] {\n return [\n { x: b.x, y: b.y },\n { x: b.x + b.width, y: b.y },\n { x: b.x, y: b.y + b.height },\n { x: b.x + b.width, y: b.y + b.height },\n ];\n}\n\nfunction resolveOutlineStroke(opts?: CommandStroke & { pad?: number }): {\n stroke: CommandStroke;\n pad: number;\n} {\n if (!opts) {\n return {\n stroke: { paint: DEFAULT_OUTLINE.paint, width: DEFAULT_OUTLINE.width },\n pad: DEFAULT_OUTLINE.pad,\n };\n }\n return {\n stroke: {\n paint: opts.paint,\n width: opts.width ?? DEFAULT_OUTLINE.width,\n dash: opts.dash,\n cap: opts.cap,\n join: opts.join,\n align: opts.align,\n },\n pad: opts.pad ?? DEFAULT_OUTLINE.pad,\n };\n}\n\n/** Handle visuals, as a consumer supplies them. */\nexport interface SelectionHandleStyle {\n size?: number;\n fill?: CommandFill;\n outline?: CommandStroke;\n}\n\ninterface ResolvedHandles {\n size: number;\n fill: CommandFill;\n outline: CommandStroke;\n}\n\nfunction resolveHandles(opts?: SelectionHandleStyle): ResolvedHandles {\n return {\n size: opts?.size ?? DEFAULT_HANDLE_SIZE,\n fill: opts?.fill ?? DEFAULT_HANDLE_FILL,\n outline: opts?.outline ?? DEFAULT_HANDLE_OUTLINE,\n };\n}\n\n/**\n * GL helper: build the matrix `translate(cx, cy) * rotate(θ) * translate(-cx, -cy)`\n * used to wrap rotated outline / handle commands.\n */\nfunction rotateAroundMat3(cx: number, cy: number, theta: number): GlMat3 {\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n // Composed in column-major (matches mat3 helpers): T(cx,cy) · R(θ) · T(-cx,-cy).\n // After expansion: a=c, b=s, c'=-s, d=c, tx=cx - c*cx + s*cy, ty=cy - s*cx - c*cy.\n const tx = cx - c * cx + s * cy;\n const ty = cy - s * cx - c * cy;\n return new Float32Array([\n c, s, 0,\n -s, c, 0,\n tx, ty, 1,\n ]) as GlMat3;\n}\n\n/** GL helper: emit a closed rect path (kind:'rect'). */\nfunction rectPathFor(x: number, y: number, width: number, height: number): { kind: 'rect'; x: number; y: number; width: number; height: number } {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** GL helper: emit an outline command for one bounds entry. */\nfunction outlineCommandsFor(\n ids: readonly string[],\n resolveBounds: (id: string) => Bounds | null,\n stroke: CommandStroke,\n pad: number,\n view: View,\n): DrawCommand[] {\n const out: DrawCommand[] = [];\n const align = stroke.align ?? 'center';\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n for (const id of ids) {\n const worldB = resolveBounds(id);\n if (!worldB) continue;\n const b = projectBounds(worldB, view);\n const padded = {\n x: b.x - pad,\n y: b.y - pad,\n width: b.width + pad * 2,\n height: b.height + pad * 2,\n };\n const rot = poseRotationOf(worldB);\n if (!rot) {\n const r = alignedStrokeRect(padded, align, width);\n out.push({ kind: 'path', path: rectPathFor(r.x, r.y, r.width, r.height), stroke });\n continue;\n }\n // Turned, the target lands on screen as a parallelogram whenever the zoom\n // is non-uniform, so the outline is traced through its projected corners\n // rather than drawn as a screen rect and turned. `alignedStrokeRect`'s\n // shift is folded into the offset so the ribbon lands where it would.\n const shift = align === 'outer' ? width / 2 : align === 'inner' ? -width / 2 : 0;\n const q = screenCorners(worldB, rot, view, pad + shift);\n out.push({\n kind: 'path',\n path: {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: new Float32Array([q[0].x, q[0].y, q[1].x, q[1].y, q[2].x, q[2].y, q[3].x, q[3].y]),\n fillRule: 'nonzero',\n },\n stroke: { ...stroke, align: 'center' },\n });\n }\n return out;\n}\n\n/**\n * A turned target's corners on screen, TL/TR/BR/BL, each pushed `pad` screen\n * pixels out from both edges that meet there.\n */\nfunction screenCorners(\n worldB: Bounds,\n rot: { cx: number; cy: number; rotation: number },\n view: View,\n pad: number,\n): { x: number; y: number }[] {\n const t = viewToTransform(view);\n const q = rectCorners(worldB).map((c) => {\n const w = rotatePoint(c.x, c.y, rot.cx, rot.cy, rot.rotation);\n const [x, y] = worldToScreen(w.x, w.y, t);\n return { x, y };\n });\n if (pad === 0) return q;\n const [ccx, ccy] = worldToScreen(rot.cx, rot.cy, t);\n const normal = (a: { x: number; y: number }, b: { x: number; y: number }) => {\n let nx = -(b.y - a.y), ny = b.x - a.x;\n const l = Math.hypot(nx, ny) || 1;\n nx /= l; ny /= l;\n const mx = (a.x + b.x) / 2 - ccx, my = (a.y + b.y) / 2 - ccy;\n return nx * mx + ny * my < 0 ? { x: -nx, y: -ny } : { x: nx, y: ny };\n };\n return q.map((c, i) => {\n const n1 = normal(q[(i + 3) % 4], c);\n const n2 = normal(c, q[(i + 1) % 4]);\n // The point `pad` off both edge lines.\n const k = pad / (1 + n1.x * n2.x + n1.y * n2.y);\n return { x: c.x + (n1.x + n2.x) * k, y: c.y + (n1.y + n2.y) * k };\n });\n}\n\n/** GL helper: emit handle fill+stroke commands for one bounds entry. */\nfunction handleCommandsFor(\n ids: readonly string[],\n resolveBounds: (id: string) => Bounds | null,\n handles: ResolvedHandles,\n handlesOf: (b: Bounds) => { x: number; y: number }[],\n view: View,\n): DrawCommand[] {\n const out: DrawCommand[] = [];\n const half = handles.size / 2;\n const handleAlign = handles.outline.align ?? 'center';\n const handleWidth = resolveStrokeWidth(handles.outline.width ?? 1, 1);\n for (const id of ids) {\n const worldB = resolveBounds(id);\n if (!worldB) continue;\n // Rotation gate + angle from the kit's one convention. Turned in world,\n // then projected: turning the projected point instead lands somewhere else\n // under non-uniform zoom.\n const r = poseRotationOf(worldB);\n const t = viewToTransform(view);\n const angle = r ? screenAngleOf(r.rotation, view.scale) : 0;\n for (const hLocal of handlesOf(worldB)) {\n const hWorld = r ? rotatePoint(hLocal.x, hLocal.y, r.cx, r.cy, r.rotation) : hLocal;\n const [hsx, hsy] = worldToScreen(hWorld.x, hWorld.y, t);\n const center = { x: hsx, y: hsy };\n const baseRect = {\n x: center.x - half,\n y: center.y - half,\n width: handles.size,\n height: handles.size,\n };\n const sr = alignedStrokeRect(baseRect, handleAlign, handleWidth);\n const fillCmd: DrawCommand = {\n kind: 'path',\n path: rectPathFor(baseRect.x, baseRect.y, baseRect.width, baseRect.height),\n fill: handles.fill,\n };\n const strokeCmd: DrawCommand = {\n kind: 'path',\n path: rectPathFor(sr.x, sr.y, sr.width, sr.height),\n stroke: handles.outline,\n };\n if (!r) {\n out.push(fillCmd, strokeCmd);\n } else {\n out.push({\n kind: 'group',\n transform: rotateAroundMat3(center.x, center.y, angle),\n children: [fillCmd, strokeCmd],\n });\n }\n }\n }\n return out;\n}\n\n/** GL helper: emit a curved double-headed arrow indicating bidirectional\n * rotation. The arc opens *toward* the object (apex on top, mouth pointing\n * down) so the affordance reads as a small \"rotate\" badge sitting above\n * the rect. Two arrowheads at the arc endpoints point along the tangent,\n * signaling that rotation goes either direction. */\nfunction rotationHandleCommands(\n worldB: Bounds,\n handles: ResolvedHandles,\n distance: number,\n view: View,\n): DrawCommand[] {\n const hWorld = rotationHandle(worldB, distance, view.scale);\n const rotation = hWorld.angle;\n const t = viewToTransform(view);\n const [scx, scy] = worldToScreen(hWorld.cx, hWorld.cy, t);\n const size = handles.size;\n const arcRadius = size;\n // Arc spans ~240° (from 150° to -30° measured from arc center, going\n // CCW). The arc center is the handle anchor; the arc itself bulges\n // *toward the rect* (downward, since the handle sits above the AABB).\n const ARC_HALF_ANGLE = (Math.PI * 240) / 360 / 2; // 120°\n const N_SEGS = 18;\n const arcWidth = resolveStrokeWidth(handles.outline.width ?? 1, 1) * 1.5;\n const stroke: CommandStroke = {\n paint: handles.fill,\n width: arcWidth,\n cap: 'round',\n join: 'round',\n };\n // Build the arc as a polyline in handle-local coords. Arc bulges *away*\n // from the rect (upward in canvas space, since the handle sits above the\n // AABB top edge): apex at -y, endpoints at +y near the rect side.\n const cmds: number[] = [PATH_M];\n const xs: number[] = [];\n const ys: number[] = [];\n for (let i = 0; i <= N_SEGS; i++) {\n const t = i / N_SEGS;\n const angle = ARC_HALF_ANGLE - t * ARC_HALF_ANGLE * 2;\n xs.push(arcRadius * Math.sin(angle));\n ys.push(-arcRadius * Math.cos(angle));\n if (i > 0) cmds.push(PATH_L);\n }\n const arcCoords: number[] = [];\n for (let i = 0; i < xs.length; i++) {\n arcCoords.push(xs[i], ys[i]);\n }\n const arcPath: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(arcCoords),\n fillRule: 'nonzero',\n };\n // Arrowheads: small filled triangles at each endpoint, pointing along\n // the tangent (away from the arc body). Tangent at endpoint = derivative\n // of (sin(angle), cos(angle)) wrt angle = (cos(angle), -sin(angle)).\n // At +ARC_HALF_ANGLE the tangent points \"outward and slightly up\"; at\n // -ARC_HALF_ANGLE the tangent points the other way.\n const headLen = size * 0.6;\n const headWidth = size * 0.4;\n const arrowHead = (endX: number, endY: number, tx: number, ty: number): PolygonPath => {\n // Normalize tangent.\n const len = Math.hypot(tx, ty) || 1;\n const ux = tx / len;\n const uy = ty / len;\n // Perpendicular (rotate tangent 90° CCW).\n const px = -uy;\n const py = ux;\n // Triangle: tip is endX+ux*headLen, base is endX (with +/- headWidth/2 along p).\n const tipX = endX + ux * headLen;\n const tipY = endY + uy * headLen;\n const baseLeftX = endX + px * (headWidth / 2);\n const baseLeftY = endY + py * (headWidth / 2);\n const baseRightX = endX - px * (headWidth / 2);\n const baseRightY = endY - py * (headWidth / 2);\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L]),\n coords: new Float32Array([tipX, tipY, baseLeftX, baseLeftY, baseRightX, baseRightY, tipX, tipY]),\n fillRule: 'nonzero',\n };\n };\n // Endpoint A (right side, angle = +ARC_HALF_ANGLE). Arc point:\n // (sin(a)·R, -cos(a)·R). Tangent (d/da) = (cos(a)·R, sin(a)·R) — points\n // outward/down at the right end. Use as \"rotate further clockwise\" arrow.\n const angleA = ARC_HALF_ANGLE;\n const endAX = arcRadius * Math.sin(angleA);\n const endAY = -arcRadius * Math.cos(angleA);\n const tangentAX = Math.cos(angleA);\n const tangentAY = Math.sin(angleA);\n // Endpoint B (left side, angle = -ARC_HALF_ANGLE): tangent in the\n // outward direction is the negation of the above.\n const angleB = -ARC_HALF_ANGLE;\n const endBX = arcRadius * Math.sin(angleB);\n const endBY = -arcRadius * Math.cos(angleB);\n const tangentBX = -Math.cos(angleB);\n const tangentBY = -Math.sin(angleB);\n const headA = arrowHead(endAX, endAY, tangentAX, tangentAY);\n const headB = arrowHead(endBX, endBY, tangentBX, tangentBY);\n const headFill: CommandFill = handles.fill;\n // Build transform: translate(scx, scy) [* rotate(rotation)].\n let transform = mat3.translated(mat3.identity(), scx, scy);\n if (rotation !== 0) {\n const c = Math.cos(rotation);\n const s = Math.sin(rotation);\n const rot = new Float32Array([c, s, 0, -s, c, 0, 0, 0, 1]) as GlMat3;\n transform = mat3.multiply(transform, rot);\n }\n return [\n {\n kind: 'group',\n transform,\n children: [\n { kind: 'path', path: arcPath, stroke },\n { kind: 'path', path: headA, fill: headFill },\n { kind: 'path', path: headB, fill: headFill },\n ],\n },\n ];\n}\n\n/** Which passes a selection layer runs. The three exported factories differ\n * only in this — everything else they do is shared, so a fix to one is a fix\n * to all three. */\ninterface SelectionPasses {\n readonly id: string;\n readonly label: string;\n readonly outline: boolean;\n readonly handles: boolean;\n}\n\nfunction buildSelectionLayer<TPose>(\n opts: SelectionOverlayLayerOpts<TPose>,\n passes: SelectionPasses,\n): RenderLayer<unknown> {\n const { stroke, pad } = resolveOutlineStroke(opts.outline);\n const handlesEnabled = passes.handles && opts.handles !== false;\n const handles = handlesEnabled ? resolveHandles(opts.handles || undefined) : null;\n const handlesOf = opts.handlesOf ?? defaultHandlesOf;\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const getPose = opts.getPose;\n const poseBounds = getPose\n ? makeContainerAwareBoundsResolver(getPose, d, opts.getChildren, opts.isContainer)\n : null;\n const rotationHandleDistance = passes.handles\n ? rotationBadgeOf(opts)?.distancePx ?? null\n : null;\n\n return {\n id: passes.id,\n label: passes.label,\n space: 'screen',\n draw: (data, view) => {\n // The synthetic multi-resize id resolves to `ChromeState.unionBounds`,\n // the single owner of the multi-selection union AABB — the same value\n // the affordance hit-tester (`affordanceAt` / `composeAffordanceLayer`)\n // reads, so painted chrome and its hit region stay in agreement. When\n // no chromeState rides the draw envelope (bare/test callers), fall\n // through to the supplied resolver so they can synthesize it via\n // `getPose`.\n const chromeState = asChromeState(data);\n const allIds = opts.getSelection\n ? opts.getSelection()\n : chromeSelectionIds(chromeState);\n if (allIds.length === 0) return [];\n const suppressed = opts.getSuppressedIds?.();\n const ids = suppressed && suppressed.size > 0\n ? allIds.filter((id) => !suppressed.has(id as unknown as string))\n : allIds;\n if (ids.length === 0) return [];\n // Chrome-caps: gate each of the three passes (outline, resize\n // handles, rotation handle) on its canonical id. When no\n // `getIsVisible` is wired (legacy callers / tests), every pass\n // runs — preserving pre-chrome-caps behavior.\n const isVisible = asIsVisible(data);\n const showOutline = passes.outline && (isVisible ? isVisible('selection.outline') : true);\n const showHandles = isVisible ? isVisible('selection.resize-handles') : true;\n const showRotation = isVisible ? isVisible('selection.rotation-handle') : true;\n\n const resolveBounds = poseBounds ?? ((id: string) => chromeState?.boundsOf(id) ?? null);\n const resolveTargetBounds = (id: string): Bounds | null => {\n if (id === MULTI_RESIZE_TARGET_ID && chromeState?.unionBounds != null) {\n return chromeState.unionBounds;\n }\n return resolveBounds(id);\n };\n\n const out: DrawCommand[] = [];\n if (showOutline) {\n const outlineIdsRaw = opts.getOutlineIds\n ? opts.getOutlineIds()\n : (opts.getSelection ? ids : (chromeState?.selection ?? ids));\n const outlineIds = suppressed && suppressed.size > 0\n ? outlineIdsRaw.filter((id) => !suppressed.has(id as unknown as string))\n : outlineIdsRaw;\n for (const cmd of outlineCommandsFor(outlineIds, resolveTargetBounds, stroke, pad, view)) out.push(cmd);\n }\n if (!handles) return out;\n if (showHandles) {\n for (const cmd of handleCommandsFor(ids, resolveTargetBounds, handles, handlesOf, view)) out.push(cmd);\n }\n if (showRotation && rotationHandleDistance !== null) {\n for (const id of ids) {\n const b = resolveTargetBounds(id);\n if (!b) continue;\n for (const cmd of rotationHandleCommands(b, handles, rotationHandleDistance, view)) {\n out.push(cmd);\n }\n }\n }\n return out;\n },\n };\n}\n\n/** Where the overlay paints its rotate badge and how big it is, in screen\n * pixels, or `null` when it paints none. The badge's grab region and its\n * slops halo read this too, so all three agree on it. */\nexport function rotationBadgeOf(\n opts: Pick<SelectionOverlayLayerOpts<unknown>, 'handles' | 'rotationHandle'>,\n): { distancePx: number; sizePx: number } | null {\n const r = opts.rotationHandle;\n if (!r || opts.handles === false) return null;\n return {\n distancePx: r === true ? DEFAULT_ROTATION_HANDLE_DISTANCE : r.distance ?? DEFAULT_ROTATION_HANDLE_DISTANCE,\n sizePx: resolveHandles(opts.handles || undefined).size,\n };\n}\n/**\n * `RenderLayer` that draws selection outlines only. Stack alongside\n * `createSelectionHandlesLayer` (or use `createSelectionOverlayLayer`, which\n * runs both passes in one layer) when both are wanted.\n */\nexport function createSelectionOutlineLayer<TPose>(\n opts: SelectionOutlineLayerOpts<TPose>,\n): RenderLayer<unknown> {\n return buildSelectionLayer(opts, {\n id: 'selection-outline',\n label: 'Selection outline',\n outline: true,\n handles: false,\n });\n}\n\n/**\n * `RenderLayer` that draws selection handles only. Stack on top of\n * `createSelectionOutlineLayer` (handles render on top of the outline).\n */\nexport function createSelectionHandlesLayer<TPose>(\n opts: SelectionHandlesLayerOpts<TPose>,\n): RenderLayer<unknown> {\n return buildSelectionLayer(opts, {\n id: 'selection-handles',\n label: 'Selection handles',\n outline: false,\n handles: true,\n });\n}\n\n/**\n * Draws outlines then handles in a single layer. Exactly equivalent to\n * stacking `createSelectionOutlineLayer` and `createSelectionHandlesLayer` —\n * all three run the same body. Pass `handles: false` to render outlines only.\n */\nexport function createSelectionOverlayLayer<TPose>(\n opts: SelectionOverlayLayerOpts<TPose>,\n): RenderLayer<unknown> {\n return buildSelectionLayer(opts, {\n id: 'selection-overlay',\n label: 'Selection',\n outline: true,\n handles: true,\n });\n}\n\n/** Pull a chrome-caps visibility predicate off the draw `data` envelope.\n * Returns `null` when the caller passed bare data (no `getIsVisible`\n * thunk) — the layer then renders unconditionally, matching pre-\n * chrome-caps behavior. */\nfunction asIsVisible(data: unknown): ((id: string) => boolean) | null {\n const maybe = data as { getIsVisible?: () => (id: string) => boolean };\n if (typeof maybe?.getIsVisible === 'function') return maybe.getIsVisible();\n return null;\n}\n\n/** The ids the handle pass works against when the layer takes its selection\n * from the envelope: the synthetic union id for a multi-selection, the\n * selection itself otherwise. */\nfunction chromeSelectionIds(state: ChromeState | null): readonly NodeId[] {\n if (!state) return [];\n if (state.multiActive) return [MULTI_RESIZE_TARGET_ID as NodeId];\n return state.selection;\n}\n\n/** Pull live `ChromeState` off the draw `data` envelope (the same channel\n * `composeAffordanceLayer` uses). Returns `null` for bare/test callers that\n * pass plain data with no `getChromeState` thunk — the layer then resolves\n * the multi-union via the supplied `getPose` resolver, preserving pre-\n * chromeState behavior. */\nfunction asChromeState(data: unknown): ChromeState | null {\n const maybe = data as { getChromeState?: () => ChromeState };\n if (typeof maybe?.getChromeState === 'function') return maybe.getChromeState();\n return null;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"overlay.js","names":["projectBounds","t","viewToTransform","view","sx","sy","worldToScreen","b","leavesOf","isContainer","id","out","visit","kids","getChildren","nid","k","composeSelectionPose","opts","d","AUTO_POSE_DESCRIPTOR","selectionLeaves","resolveLeaf","moved","moveOverlay","resizeOverlay","getStoredPose","leaves","containerResizeLeafPoses","leafBounds","leafId","visualBoundsViaDescriptor","overlayLeaf","u","unionAABB","makeContainerAwareBoundsResolver","oriented","framedBounds","p","getPose","DEFAULT_OUTLINE","DEFAULT_HANDLE_FILL","DEFAULT_HANDLE_OUTLINE","DEFAULT_HANDLE_SIZE","HANDLE_BASE_PX","defaultHandlesOf","resolveOutlineStroke","resolveHandles","rotateAroundMat3","c","theta","s","tx","cx","cy","ty","rectPathFor","outlineCommandsFor","align","stroke","width","resolveStrokeWidth","ids","worldB","resolveBounds","padded","pad","xf","targetTransformOf","r","alignedStrokeRect","q","screenCorners","PATH_M","PATH_L","PATH_Z","targetCorners","x","y","w","ccx","ccy","normal","nx","a","ny","l","mx","my","n1","i","n2","handleCommandsFor","half","handles","handleAlign","handleWidth","angle","screenAngleOf","angleOf","hLocal","handlesOf","hWorld","localToWorld","hsx","hsy","center","baseRect","sr","fillCmd","strokeCmd","rotationHandleCommands","rotationHandle","distance","rotation","scx","scy","size","arcRadius","ARC_HALF_ANGLE","arcWidth","cmds","xs","ys","arcCoords","arcPath","headLen","headWidth","arrowHead","len","ux","uy","px","py","tipX","endX","tipY","endY","baseLeftX","baseLeftY","baseRightX","baseRightY","angleA","endAX","endAY","tangentAX","tangentAY","angleB","endBX","endBY","tangentBX","tangentBY","headA","headB","transform","mat3","rot","buildSelectionLayer","passes","poseBounds","rotationHandleDistance","rotationBadgeOf","chromeState","asChromeState","data","allIds","chromeSelectionIds","suppressed","isVisible","asIsVisible","showOutline","showHandles","showRotation","resolveTargetBounds","MULTI_RESIZE_TARGET_ID","outlineIdsRaw","outlineIds","cmd","DEFAULT_ROTATION_HANDLE_DISTANCE","createSelectionOutlineLayer","createSelectionHandlesLayer","createSelectionOverlayLayer","maybe","state"],"sources":["../../../src/features/selection/overlay.ts"],"sourcesContent":["/**\n * Selection overlay primitives — render layers for drawing selection\n * outlines and corner resize handles.\n *\n * **Pose shape:** TPose is generic; callers pass `poseDescriptor` for poses\n * `AUTO_POSE_DESCRIPTOR` can't read. Container ids reduce via `unionAABB`\n * over the projected AABBs.\n */\n\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { mat3, type GlMat3 } from '@weasel-js/renderer';\nimport type { NodeId } from 'core/scene/types';\nimport type { RenderLayer } from 'core/layers/render';\nimport { unionAABB } from 'core/geometry/unionBounds';\nimport {\n framedBounds,\n visualBoundsViaDescriptor,\n type PoseDescriptor,\n} from 'core/geometry/poseDescriptor';\nimport { angleOf, localToWorld, targetCorners, targetTransformOf, type TargetTransform } from 'core/geometry/targetFrame';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport { alignedStrokeRect, type CommandStroke, type CommandFill } from '@weasel-js/paint';\nimport { resolveStrokeWidth } from '@weasel-js/stroke';\nimport {\n rotationHandle,\n DEFAULT_ROTATION_HANDLE_DISTANCE,\n} from 'interactions/actions/rotate/handle';\nimport type { Bounds } from 'core/viewport/fitViewToBounds';\nimport type { ChromeState } from 'core/selection/chromeState';\nimport { MULTI_RESIZE_TARGET_ID } from 'core/selection/selectionTarget';\nimport type { View } from 'core/viewport/view';\nimport { viewToTransform } from 'core/viewport/view';\nimport { worldToScreen } from 'core/viewport/viewTransform';\nimport { screenAngleOf } from '@weasel-js/geom';\nimport { PATH_L, PATH_M, PATH_Z, type PolygonPath } from '@weasel-js/geom';\nimport { HANDLE_BASE_PX } from 'core/device/targets';\n\n/** Project world AABB into screen-space AABB using the active view. */\nfunction projectBounds<B extends Bounds>(b: B, view: View): B {\n const t = viewToTransform(view);\n const [sx, sy] = worldToScreen(b.x, b.y, t);\n return { ...b, x: sx, y: sy, width: b.width * view.scale.x, height: b.height * view.scale.y };\n}\n\n\n/**\n * Transitive leaf ids under `id`. A childless node is a leaf only if it is not\n * itself a container: an empty container contributes no bounds, and its own\n * stored pose is at its most stale when no children are left to have moved it.\n */\nfunction leavesOf(\n id: string,\n getChildren: (id: string) => readonly string[],\n isContainer: (id: string) => boolean,\n): string[] {\n if (!isContainer(id)) return [id];\n const out: string[] = [];\n const visit = (nid: string) => {\n const kids = getChildren(nid);\n if (kids.length === 0) { if (!isContainer(nid)) out.push(nid); return; }\n for (const k of kids) visit(k);\n };\n visit(id);\n return out;\n}\n\n/** Options for `composeSelectionPose`. */\nexport interface ComposeSelectionPoseOpts<TPose> {\n /** Move overlay; when present its `poses` map wins over everything else. */\n moveOverlay?: { poses: Map<string, TPose> } | null;\n /**\n * Resize overlay; consulted only when move overlay does not own the id.\n * For container resize, `leafPoses` (when present) maps each leaf id under\n * the container to its overlay pose. If absent the container falls back to\n * stored leaf poses.\n */\n resizeOverlay?: {\n id: string;\n currentPose: TPose;\n leafPoses?: Map<string, TPose>;\n } | null;\n /** Fallback pose lookup (typically the stored/committed pose). */\n getStoredPose: (id: string) => TPose;\n /** How to read poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n /** Walk a container's direct children (e.g. `scene.childrenOf`). With\n * `isContainer`, a selected container resolves to the union AABB of its\n * transitive leaf poses instead of its own stored pose. */\n getChildren?: (id: string) => readonly string[];\n /** True when `id` is a structural container. */\n isContainer?: (id: string) => boolean;\n}\n\n/**\n * Build a pose resolver for a selection. Precedence per id:\n * move overlay > resize overlay > stored. When `getChildren`/`isContainer`\n * are supplied and the id resolves to a container, the resolver returns the\n * union AABB of all transitive leaf poses (each leaf still subject to the\n * precedence rules). Containers with no leaves resolve to `null`.\n */\nexport function composeSelectionPose<TPose>(\n opts: ComposeSelectionPoseOpts<TPose>,\n): (id: string) => TPose | null {\n const { moveOverlay, resizeOverlay, getStoredPose, getChildren, isContainer } = opts;\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n\n const selectionLeaves = (id: string): string[] =>\n getChildren && isContainer ? leavesOf(id, getChildren, isContainer) : [id];\n\n const resolveLeaf = (id: string): TPose => {\n const moved = moveOverlay?.poses.get(id);\n if (moved !== undefined) return moved;\n if (resizeOverlay && resizeOverlay.id === id) return resizeOverlay.currentPose;\n return getStoredPose(id);\n };\n\n return (id: string): TPose | null => {\n if (isContainer?.(id)) {\n const leaves = selectionLeaves(id);\n if (leaves.length === 0) return null;\n const containerResizeLeafPoses =\n resizeOverlay && resizeOverlay.id === id ? resizeOverlay.leafPoses : undefined;\n const leafBounds: Bounds[] = [];\n for (const leafId of leaves) {\n const moved = moveOverlay?.poses.get(leafId);\n if (moved !== undefined) {\n leafBounds.push(visualBoundsViaDescriptor(moved, d));\n continue;\n }\n const overlayLeaf = containerResizeLeafPoses?.get(leafId);\n if (overlayLeaf !== undefined) {\n leafBounds.push(visualBoundsViaDescriptor(overlayLeaf, d));\n continue;\n }\n leafBounds.push(visualBoundsViaDescriptor(getStoredPose(leafId), d));\n }\n const u = unionAABB(leafBounds);\n if (u === null) return null;\n return d.fromBounds(u, getStoredPose(leaves[0]!));\n }\n return resolveLeaf(id);\n };\n}\n\n/**\n * Build a pose resolver that handles container ids by computing the union\n * AABB of every leaf's bounds. Non-container ids pass through directly. When\n * `getChildren`/`isContainer` are omitted, every id is treated as a leaf.\n */\nfunction makeContainerAwareBoundsResolver<TPose>(\n getPose: (id: string) => TPose | null,\n d: PoseDescriptor<TPose>,\n getChildren?: (id: string) => readonly string[],\n isContainer?: (id: string) => boolean,\n): (id: string) => Bounds | null {\n const oriented = (p: TPose): Bounds => framedBounds(p, d);\n if (getChildren === undefined || isContainer === undefined) {\n return (id: string) => {\n const p = getPose(id);\n return p === null ? null : oriented(p);\n };\n }\n return (id: string): Bounds | null => {\n if (!isContainer(id)) {\n const p = getPose(id);\n return p === null ? null : oriented(p);\n }\n const leaves = leavesOf(id, getChildren, isContainer);\n if (leaves.length === 0) return null;\n const leafBounds: Bounds[] = [];\n for (const leafId of leaves) {\n const p = getPose(leafId);\n if (p !== null) leafBounds.push(visualBoundsViaDescriptor(p, d));\n }\n if (leafBounds.length === 0) return null;\n return unionAABB(leafBounds);\n };\n}\n\n/** Options every selection layer shares. `getSelection` and `getPose` are\n * declared on {@link SelectionOverlayLayerOpts}, which makes both optional —\n * omitted, they come off the draw envelope. */\ninterface SelectionLayerCommon<TPose> {\n /** How to read poses. Default `AUTO_POSE_DESCRIPTOR`. */\n poseDescriptor?: PoseDescriptor<TPose>;\n /** Walk a container's direct children (e.g. `scene.childrenOf`). When\n * supplied with `isContainer`, any id that resolves to a container is\n * rendered using the union bounds of all its transitive leaves. */\n getChildren?: (id: string) => readonly string[];\n /** True when `id` is a structural container. */\n isContainer?: (id: string) => boolean;\n}\n\n/** Options for `createSelectionOutlineLayer`. The overlay layer's options\n * minus the handle visuals — the two run the same body. */\nexport type SelectionOutlineLayerOpts<TPose> =\n Omit<SelectionOverlayLayerOpts<TPose>, 'handles' | 'handlesOf' | 'rotationHandle'>;\n\n/** Options for `createSelectionHandlesLayer`. The overlay layer's options\n * minus the outline stroke — the two run the same body. */\nexport type SelectionHandlesLayerOpts<TPose> =\n Omit<SelectionOverlayLayerOpts<TPose>, 'outline'>;\n\n/** Options for `createSelectionOverlayLayer`. */\nexport interface SelectionOverlayLayerOpts<TPose>\n extends SelectionLayerCommon<TPose> {\n /**\n * Which ids to draw chrome for. Omit to take them from the `ChromeState` on\n * the draw envelope, which is what makes one canvas's several views each\n * outline their own selection — the layer is shared, the envelope is not.\n */\n getSelection?: () => readonly NodeId[];\n /**\n * Resolve an id to the pose to draw chrome around. Return null to skip an\n * id. Omit to take bounds from the same envelope `getSelection` omitted\n * takes ids from.\n *\n * Takes `string` rather than `NodeId` because the container-aware resolver\n * walks expanded leaf ids via `getChildren`, which is generic over strings.\n */\n getPose?: (id: string) => TPose | null;\n outline?: CommandStroke & { pad?: number };\n /** Pass `false` to render outlines only. */\n handles?: SelectionHandleStyle | false;\n handlesOf?: (bounds: Bounds) => { x: number; y: number }[];\n /** Draw a rotate badge above the selection's top edge. `true` places it at\n * the default offset; `distance` sets the offset in screen pixels. Off by\n * default. */\n rotationHandle?:\n | boolean\n | {\n distance?: number;\n };\n /** Optional separate id list for the per-item outline pass, for a\n * multi-selection whose handle pass works against a synthetic union id\n * (e.g. `MULTI_RESIZE_TARGET_ID`) while each real member is outlined.\n * When omitted, the outline pass uses the handle pass's ids. */\n getOutlineIds?: () => readonly NodeId[];\n /** Optional set of ids to suppress entirely — both outline and handles\n * are skipped. */\n getSuppressedIds?: () => ReadonlySet<string>;\n}\n\nconst DEFAULT_OUTLINE: Required<Pick<CommandStroke, 'paint' | 'width'>> & { pad: number } = {\n paint: { kind: 'solid', color: '#f0e0a8' },\n width: 2,\n pad: 1,\n};\nconst DEFAULT_HANDLE_FILL: CommandFill = { paint: { kind: 'solid', color: '#d4c4a8' } };\nconst DEFAULT_HANDLE_OUTLINE: CommandStroke = {\n paint: { kind: 'solid', color: '#1a130d' },\n width: 1,\n};\nconst DEFAULT_HANDLE_SIZE = HANDLE_BASE_PX;\n\nfunction defaultHandlesOf(b: Bounds): { x: number; y: number }[] {\n return [\n { x: b.x, y: b.y },\n { x: b.x + b.width, y: b.y },\n { x: b.x, y: b.y + b.height },\n { x: b.x + b.width, y: b.y + b.height },\n ];\n}\n\nfunction resolveOutlineStroke(opts?: CommandStroke & { pad?: number }): {\n stroke: CommandStroke;\n pad: number;\n} {\n if (!opts) {\n return {\n stroke: { paint: DEFAULT_OUTLINE.paint, width: DEFAULT_OUTLINE.width },\n pad: DEFAULT_OUTLINE.pad,\n };\n }\n return {\n stroke: {\n paint: opts.paint,\n width: opts.width ?? DEFAULT_OUTLINE.width,\n dash: opts.dash,\n cap: opts.cap,\n join: opts.join,\n align: opts.align,\n },\n pad: opts.pad ?? DEFAULT_OUTLINE.pad,\n };\n}\n\n/** Handle visuals, as a consumer supplies them. */\nexport interface SelectionHandleStyle {\n size?: number;\n fill?: CommandFill;\n outline?: CommandStroke;\n}\n\ninterface ResolvedHandles {\n size: number;\n fill: CommandFill;\n outline: CommandStroke;\n}\n\nfunction resolveHandles(opts?: SelectionHandleStyle): ResolvedHandles {\n return {\n size: opts?.size ?? DEFAULT_HANDLE_SIZE,\n fill: opts?.fill ?? DEFAULT_HANDLE_FILL,\n outline: opts?.outline ?? DEFAULT_HANDLE_OUTLINE,\n };\n}\n\n/**\n * GL helper: build the matrix `translate(cx, cy) * rotate(θ) * translate(-cx, -cy)`\n * used to wrap rotated outline / handle commands.\n */\nfunction rotateAroundMat3(cx: number, cy: number, theta: number): GlMat3 {\n const c = Math.cos(theta);\n const s = Math.sin(theta);\n // Composed in column-major (matches mat3 helpers): T(cx,cy) · R(θ) · T(-cx,-cy).\n // After expansion: a=c, b=s, c'=-s, d=c, tx=cx - c*cx + s*cy, ty=cy - s*cx - c*cy.\n const tx = cx - c * cx + s * cy;\n const ty = cy - s * cx - c * cy;\n return new Float32Array([\n c, s, 0,\n -s, c, 0,\n tx, ty, 1,\n ]) as GlMat3;\n}\n\n/** GL helper: emit a closed rect path (kind:'rect'). */\nfunction rectPathFor(x: number, y: number, width: number, height: number): { kind: 'rect'; x: number; y: number; width: number; height: number } {\n return { kind: 'rect', x, y, width, height };\n}\n\n/** GL helper: emit an outline command for one bounds entry. */\nfunction outlineCommandsFor(\n ids: readonly string[],\n resolveBounds: (id: string) => Bounds | null,\n stroke: CommandStroke,\n pad: number,\n view: View,\n): DrawCommand[] {\n const out: DrawCommand[] = [];\n const align = stroke.align ?? 'center';\n const width = resolveStrokeWidth(stroke.width ?? 1, 1);\n for (const id of ids) {\n const worldB = resolveBounds(id);\n if (!worldB) continue;\n const b = projectBounds(worldB, view);\n const padded = {\n x: b.x - pad,\n y: b.y - pad,\n width: b.width + pad * 2,\n height: b.height + pad * 2,\n };\n const xf = targetTransformOf(worldB);\n if (xf.identity) {\n const r = alignedStrokeRect(padded, align, width);\n out.push({ kind: 'path', path: rectPathFor(r.x, r.y, r.width, r.height), stroke });\n continue;\n }\n // Turned or skewed, the target lands on screen as a parallelogram, so the\n // outline is traced through its projected corners. `alignedStrokeRect`'s\n // shift is folded into the offset so the ribbon lands where it would.\n const shift = align === 'outer' ? width / 2 : align === 'inner' ? -width / 2 : 0;\n const q = screenCorners(worldB, xf, view, pad + shift);\n out.push({\n kind: 'path',\n path: {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L, PATH_Z]),\n coords: new Float32Array([q[0].x, q[0].y, q[1].x, q[1].y, q[2].x, q[2].y, q[3].x, q[3].y]),\n fillRule: 'nonzero',\n },\n stroke: { ...stroke, align: 'center' },\n });\n }\n return out;\n}\n\n/**\n * A framed target's corners on screen, TL/TR/BR/BL, each pushed `pad` screen\n * pixels out from both edges that meet there.\n */\nfunction screenCorners(\n worldB: Bounds,\n xf: TargetTransform,\n view: View,\n pad: number,\n): { x: number; y: number }[] {\n const t = viewToTransform(view);\n const q = targetCorners(worldB, xf).map((w) => {\n const [x, y] = worldToScreen(w.x, w.y, t);\n return { x, y };\n });\n if (pad === 0) return q;\n const [ccx, ccy] = worldToScreen(worldB.x + worldB.width / 2, worldB.y + worldB.height / 2, t);\n const normal = (a: { x: number; y: number }, b: { x: number; y: number }) => {\n let nx = -(b.y - a.y), ny = b.x - a.x;\n const l = Math.hypot(nx, ny) || 1;\n nx /= l; ny /= l;\n const mx = (a.x + b.x) / 2 - ccx, my = (a.y + b.y) / 2 - ccy;\n return nx * mx + ny * my < 0 ? { x: -nx, y: -ny } : { x: nx, y: ny };\n };\n return q.map((c, i) => {\n const n1 = normal(q[(i + 3) % 4], c);\n const n2 = normal(c, q[(i + 1) % 4]);\n // The point `pad` off both edge lines.\n const k = pad / (1 + n1.x * n2.x + n1.y * n2.y);\n return { x: c.x + (n1.x + n2.x) * k, y: c.y + (n1.y + n2.y) * k };\n });\n}\n\n/** GL helper: emit handle fill+stroke commands for one bounds entry. */\nfunction handleCommandsFor(\n ids: readonly string[],\n resolveBounds: (id: string) => Bounds | null,\n handles: ResolvedHandles,\n handlesOf: (b: Bounds) => { x: number; y: number }[],\n view: View,\n): DrawCommand[] {\n const out: DrawCommand[] = [];\n const half = handles.size / 2;\n const handleAlign = handles.outline.align ?? 'center';\n const handleWidth = resolveStrokeWidth(handles.outline.width ?? 1, 1);\n for (const id of ids) {\n const worldB = resolveBounds(id);\n if (!worldB) continue;\n // Framed in world, then projected: turning the projected point instead\n // lands somewhere else under non-uniform zoom.\n const xf = targetTransformOf(worldB);\n const t = viewToTransform(view);\n const angle = screenAngleOf(angleOf(xf), view.scale);\n for (const hLocal of handlesOf(worldB)) {\n const hWorld = localToWorld(xf, hLocal.x, hLocal.y);\n const [hsx, hsy] = worldToScreen(hWorld.x, hWorld.y, t);\n const center = { x: hsx, y: hsy };\n const baseRect = {\n x: center.x - half,\n y: center.y - half,\n width: handles.size,\n height: handles.size,\n };\n const sr = alignedStrokeRect(baseRect, handleAlign, handleWidth);\n const fillCmd: DrawCommand = {\n kind: 'path',\n path: rectPathFor(baseRect.x, baseRect.y, baseRect.width, baseRect.height),\n fill: handles.fill,\n };\n const strokeCmd: DrawCommand = {\n kind: 'path',\n path: rectPathFor(sr.x, sr.y, sr.width, sr.height),\n stroke: handles.outline,\n };\n if (angle === 0) {\n out.push(fillCmd, strokeCmd);\n } else {\n out.push({\n kind: 'group',\n transform: rotateAroundMat3(center.x, center.y, angle),\n children: [fillCmd, strokeCmd],\n });\n }\n }\n }\n return out;\n}\n\n/** GL helper: emit a curved double-headed arrow, the rotate badge above the\n * rect. The arc opens *toward* the object (apex on top, mouth pointing\n * down), with an arrowhead at each endpoint pointing along the tangent. */\nfunction rotationHandleCommands(\n worldB: Bounds,\n handles: ResolvedHandles,\n distance: number,\n view: View,\n): DrawCommand[] {\n const hWorld = rotationHandle(worldB, distance, view.scale);\n const rotation = hWorld.angle;\n const t = viewToTransform(view);\n const [scx, scy] = worldToScreen(hWorld.cx, hWorld.cy, t);\n const size = handles.size;\n const arcRadius = size;\n const ARC_HALF_ANGLE = (Math.PI * 240) / 360 / 2; // 120°\n const N_SEGS = 18;\n const arcWidth = resolveStrokeWidth(handles.outline.width ?? 1, 1) * 1.5;\n const stroke: CommandStroke = {\n paint: handles.fill.paint,\n width: arcWidth,\n cap: 'round',\n join: 'round',\n };\n // The arc as a polyline in handle-local coords, centered on the handle\n // anchor: apex at -y, endpoints at +y near the rect side.\n const cmds: number[] = [PATH_M];\n const xs: number[] = [];\n const ys: number[] = [];\n for (let i = 0; i <= N_SEGS; i++) {\n const t = i / N_SEGS;\n const angle = ARC_HALF_ANGLE - t * ARC_HALF_ANGLE * 2;\n xs.push(arcRadius * Math.sin(angle));\n ys.push(-arcRadius * Math.cos(angle));\n if (i > 0) cmds.push(PATH_L);\n }\n const arcCoords: number[] = [];\n for (let i = 0; i < xs.length; i++) {\n arcCoords.push(xs[i], ys[i]);\n }\n const arcPath: PolygonPath = {\n kind: 'polygon',\n commands: new Uint8Array(cmds),\n coords: new Float32Array(arcCoords),\n fillRule: 'nonzero',\n };\n // Arrowheads: small filled triangles at each endpoint, pointing along\n // the tangent (away from the arc body).\n const headLen = size * 0.6;\n const headWidth = size * 0.4;\n const arrowHead = (endX: number, endY: number, tx: number, ty: number): PolygonPath => {\n // Normalize tangent.\n const len = Math.hypot(tx, ty) || 1;\n const ux = tx / len;\n const uy = ty / len;\n // Perpendicular (rotate tangent 90° CCW).\n const px = -uy;\n const py = ux;\n // Triangle: tip is endX+ux*headLen, base is endX (with +/- headWidth/2 along p).\n const tipX = endX + ux * headLen;\n const tipY = endY + uy * headLen;\n const baseLeftX = endX + px * (headWidth / 2);\n const baseLeftY = endY + py * (headWidth / 2);\n const baseRightX = endX - px * (headWidth / 2);\n const baseRightY = endY - py * (headWidth / 2);\n return {\n kind: 'polygon',\n commands: new Uint8Array([PATH_M, PATH_L, PATH_L, PATH_L]),\n coords: new Float32Array([tipX, tipY, baseLeftX, baseLeftY, baseRightX, baseRightY, tipX, tipY]),\n fillRule: 'nonzero',\n };\n };\n // Endpoint A (right side, angle = +ARC_HALF_ANGLE). Arc point:\n // (sin(a)·R, -cos(a)·R). Tangent (d/da) = (cos(a)·R, sin(a)·R).\n const angleA = ARC_HALF_ANGLE;\n const endAX = arcRadius * Math.sin(angleA);\n const endAY = -arcRadius * Math.cos(angleA);\n const tangentAX = Math.cos(angleA);\n const tangentAY = Math.sin(angleA);\n // Endpoint B (left side, angle = -ARC_HALF_ANGLE): tangent in the\n // outward direction is the negation of the above.\n const angleB = -ARC_HALF_ANGLE;\n const endBX = arcRadius * Math.sin(angleB);\n const endBY = -arcRadius * Math.cos(angleB);\n const tangentBX = -Math.cos(angleB);\n const tangentBY = -Math.sin(angleB);\n const headA = arrowHead(endAX, endAY, tangentAX, tangentAY);\n const headB = arrowHead(endBX, endBY, tangentBX, tangentBY);\n // Build transform: translate(scx, scy) [* rotate(rotation)].\n let transform = mat3.translated(mat3.identity(), scx, scy);\n if (rotation !== 0) {\n const c = Math.cos(rotation);\n const s = Math.sin(rotation);\n const rot = new Float32Array([c, s, 0, -s, c, 0, 0, 0, 1]) as GlMat3;\n transform = mat3.multiply(transform, rot);\n }\n return [\n {\n kind: 'group',\n transform,\n children: [\n { kind: 'path', path: arcPath, stroke },\n { kind: 'path', path: headA, fill: handles.fill },\n { kind: 'path', path: headB, fill: handles.fill },\n ],\n },\n ];\n}\n\n/** Which passes a selection layer runs. The three exported factories differ\n * only in this — everything else they do is shared, so a fix to one is a fix\n * to all three. */\ninterface SelectionPasses {\n readonly id: string;\n readonly label: string;\n readonly outline: boolean;\n readonly handles: boolean;\n}\n\nfunction buildSelectionLayer<TPose>(\n opts: SelectionOverlayLayerOpts<TPose>,\n passes: SelectionPasses,\n): RenderLayer<unknown> {\n const { stroke, pad } = resolveOutlineStroke(opts.outline);\n const handlesEnabled = passes.handles && opts.handles !== false;\n const handles = handlesEnabled ? resolveHandles(opts.handles || undefined) : null;\n const handlesOf = opts.handlesOf ?? defaultHandlesOf;\n const d = (opts.poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const getPose = opts.getPose;\n const poseBounds = getPose\n ? makeContainerAwareBoundsResolver(getPose, d, opts.getChildren, opts.isContainer)\n : null;\n const rotationHandleDistance = passes.handles\n ? rotationBadgeOf(opts)?.distancePx ?? null\n : null;\n\n return {\n id: passes.id,\n label: passes.label,\n space: 'screen',\n draw: (data, view) => {\n // The synthetic multi-resize id resolves to `ChromeState.unionBounds`,\n // the same value the affordance hit-tester reads, so painted chrome\n // and its hit region stay in agreement. With no chromeState on the\n // draw envelope, fall through to the supplied resolver.\n const chromeState = asChromeState(data);\n const allIds = opts.getSelection\n ? opts.getSelection()\n : chromeSelectionIds(chromeState);\n if (allIds.length === 0) return [];\n const suppressed = opts.getSuppressedIds?.();\n const ids = suppressed && suppressed.size > 0\n ? allIds.filter((id) => !suppressed.has(id as unknown as string))\n : allIds;\n if (ids.length === 0) return [];\n // Chrome-caps: gate each pass on its canonical id. When no\n // `getIsVisible` is wired, every pass runs.\n const isVisible = asIsVisible(data);\n const showOutline = passes.outline && (isVisible ? isVisible('selection.outline') : true);\n const showHandles = isVisible ? isVisible('selection.resize-handles') : true;\n const showRotation = isVisible ? isVisible('selection.rotation-handle') : true;\n\n const resolveBounds = poseBounds ?? ((id: string) => chromeState?.boundsOf(id) ?? null);\n const resolveTargetBounds = (id: string): Bounds | null => {\n if (id === MULTI_RESIZE_TARGET_ID && chromeState?.unionBounds != null) {\n return chromeState.unionBounds;\n }\n return resolveBounds(id);\n };\n\n const out: DrawCommand[] = [];\n if (showOutline) {\n const outlineIdsRaw = opts.getOutlineIds\n ? opts.getOutlineIds()\n : (opts.getSelection ? ids : (chromeState?.selection ?? ids));\n const outlineIds = suppressed && suppressed.size > 0\n ? outlineIdsRaw.filter((id) => !suppressed.has(id as unknown as string))\n : outlineIdsRaw;\n for (const cmd of outlineCommandsFor(outlineIds, resolveTargetBounds, stroke, pad, view)) out.push(cmd);\n }\n if (!handles) return out;\n if (showHandles) {\n for (const cmd of handleCommandsFor(ids, resolveTargetBounds, handles, handlesOf, view)) out.push(cmd);\n }\n if (showRotation && rotationHandleDistance !== null) {\n for (const id of ids) {\n const b = resolveTargetBounds(id);\n if (!b) continue;\n for (const cmd of rotationHandleCommands(b, handles, rotationHandleDistance, view)) {\n out.push(cmd);\n }\n }\n }\n return out;\n },\n };\n}\n\n/** Where the overlay paints its rotate badge and how big it is, in screen\n * pixels, or `null` when it paints none. The badge's grab region and its\n * slops halo read this too, so all three agree on it. */\nexport function rotationBadgeOf(\n opts: Pick<SelectionOverlayLayerOpts<unknown>, 'handles' | 'rotationHandle'>,\n): { distancePx: number; sizePx: number } | null {\n const r = opts.rotationHandle;\n if (!r || opts.handles === false) return null;\n return {\n distancePx: r === true ? DEFAULT_ROTATION_HANDLE_DISTANCE : r.distance ?? DEFAULT_ROTATION_HANDLE_DISTANCE,\n sizePx: resolveHandles(opts.handles || undefined).size,\n };\n}\n/**\n * `RenderLayer` that draws selection outlines only. Stack alongside\n * `createSelectionHandlesLayer` (or use `createSelectionOverlayLayer`, which\n * runs both passes in one layer) when both are wanted.\n */\nexport function createSelectionOutlineLayer<TPose>(\n opts: SelectionOutlineLayerOpts<TPose>,\n): RenderLayer<unknown> {\n return buildSelectionLayer(opts, {\n id: 'selection-outline',\n label: 'Selection outline',\n outline: true,\n handles: false,\n });\n}\n\n/**\n * `RenderLayer` that draws selection handles only. Stack on top of\n * `createSelectionOutlineLayer` (handles render on top of the outline).\n */\nexport function createSelectionHandlesLayer<TPose>(\n opts: SelectionHandlesLayerOpts<TPose>,\n): RenderLayer<unknown> {\n return buildSelectionLayer(opts, {\n id: 'selection-handles',\n label: 'Selection handles',\n outline: false,\n handles: true,\n });\n}\n\n/**\n * Draws outlines then handles in a single layer. Exactly equivalent to\n * stacking `createSelectionOutlineLayer` and `createSelectionHandlesLayer` —\n * all three run the same body. Pass `handles: false` to render outlines only.\n */\nexport function createSelectionOverlayLayer<TPose>(\n opts: SelectionOverlayLayerOpts<TPose>,\n): RenderLayer<unknown> {\n return buildSelectionLayer(opts, {\n id: 'selection-overlay',\n label: 'Selection',\n outline: true,\n handles: true,\n });\n}\n\n/** Pull a chrome-caps visibility predicate off the draw `data` envelope.\n * Returns `null` when the caller passed bare data (no `getIsVisible`\n * thunk) — the layer then renders unconditionally. */\nfunction asIsVisible(data: unknown): ((id: string) => boolean) | null {\n const maybe = data as { getIsVisible?: () => (id: string) => boolean };\n if (typeof maybe?.getIsVisible === 'function') return maybe.getIsVisible();\n return null;\n}\n\n/** The ids the handle pass works against when the layer takes its selection\n * from the envelope: the synthetic union id for a multi-selection, the\n * selection itself otherwise. */\nfunction chromeSelectionIds(state: ChromeState | null): readonly NodeId[] {\n if (!state) return [];\n if (state.multiActive) return [MULTI_RESIZE_TARGET_ID as NodeId];\n return state.selection;\n}\n\n/** Pull live `ChromeState` off the draw `data` envelope. Returns `null` for\n * callers that pass plain data with no `getChromeState` thunk — the layer\n * then resolves the multi-union via the supplied `getPose` resolver. */\nfunction asChromeState(data: unknown): ChromeState | null {\n const maybe = data as { getChromeState?: () => ChromeState };\n if (typeof maybe?.getChromeState === 'function') return maybe.getChromeState();\n return null;\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { createTextLayer as e } from "./textLayer.js";
2
+ import { useSceneTextEdit as t } from "./useSceneTextEdit.js";
3
+ import { textCommand as n, textCommandFromPose as r, textCommandFromRuns as i } from "@weasel-js/renderer";
4
+ import { TextOutlinesError as a, loadTextOutlines as o, textToPath as s, textToPathsByPaint as c } from "@weasel-js/text";
5
+ import { TEXT_EDIT_FONT_HOLD as l, charOffsetToDomPosition as u, domPositionToCharOffset as d, domToRuns as f, runsToDom as p, useTextEdit as m } from "@weasel-js/text-dom";
6
+ export { l as TEXT_EDIT_FONT_HOLD, a as TextOutlinesError, u as charOffsetToDomPosition, e as createTextLayer, d as domPositionToCharOffset, f as domToRuns, o as loadTextOutlines, p as runsToDom, n as textCommand, r as textCommandFromPose, i as textCommandFromRuns, s as textToPath, c as textToPathsByPaint, t as useSceneTextEdit, m as useTextEdit };
@@ -1,4 +1,4 @@
1
- import { textCommandFromPose as e } from "./textCommand.js";
1
+ import { textCommandFromPose as e } from "@weasel-js/renderer";
2
2
  import { runsToPlainText as t } from "@weasel-js/text";
3
3
  //#region src/features/text/textLayer.ts
4
4
  function n(n) {
@@ -1 +1 @@
1
- {"version":3,"file":"textLayer.js","names":["createTextLayer","opts","scale","view","children","node","getTexts","isHidden","pose","getPose","runsToPlainText","textCmd","textCommandFromPose","clipToBounds"],"sources":["../../../src/features/text/textLayer.ts"],"sourcesContent":["/**\n * Text RenderLayer for text that is not in a scene: one `textCommandFromPose`\n * command per item, the same command the `kit:text` node painter emits, so an\n * item lays out — and wraps, or doesn't, per its style — as a node would.\n *\n * The GL renderer uses MSDF text. The resolved style's `fontFamily` must\n * be registered via `registerFont(family, variant, metricsUrl, atlasUrl)`\n * from the renderer module *before* the GL backend dispatches this layer.\n * Unregistered families render with a warning and no glyphs (see\n * `TextDrawCommand`'s contract).\n */\n\nimport { type DrawCommand } from '../../renderer';\nimport type { TextPose } from '@weasel-js/text';\n\nimport type { RenderLayer } from 'core/layers/render';\nimport { textCommandFromPose } from './textCommand';\nimport { runsToPlainText } from '@weasel-js/text';\n\n\n/** Options for `createTextLayer`. */\nexport interface CreateTextLayerOpts<T> {\n id?: string;\n label?: string;\n getTexts: () => readonly T[];\n getPose: (node: T) => TextPose;\n /** Optional per-node hide hook (e.g., suppress while editing). */\n isHidden?: (node: T) => boolean;\n /** When `true`, each text command is wrapped in a clipped group so any\n * overflow beyond the pose's `(width × height)` is hidden. Default\n * `false` (legacy: text can spill outside the declared bounds). Opt-in\n * so existing consumers who rely on overflow keep working. */\n clipToBounds?: boolean;\n}\n\n/** Build a `RenderLayer` that emits one `TextDrawCommand` per text node. */\nexport function createTextLayer<T>(opts: CreateTextLayerOpts<T>): RenderLayer<unknown> {\n const { id = 'text', label = 'Text', getTexts, getPose, isHidden, clipToBounds = false } = opts;\n return {\n id,\n label,\n draw: (_data, view) => {\n // A world-space layer, so a `{ px }` size in a pose's style resolves\n // against the live camera. Radial in effect — one factor for both axes.\n const scale = (view.scale.x + view.scale.y) / 2;\n const children: DrawCommand[] = [];\n for (const node of getTexts()) {\n if (isHidden?.(node)) continue;\n const pose = getPose(node);\n if (pose.runs && pose.runs.length > 0 && runsToPlainText(pose.runs) !== pose.text) {\n throw new Error(\n `weasel createTextLayer: TextPose invariant violated — ` +\n `runsToPlainText(runs) !== text. Either omit \\`runs\\` or keep it ` +\n `synchronized with \\`text\\`.`,\n );\n }\n const textCmd = textCommandFromPose(pose, scale);\n if (clipToBounds) {\n children.push({\n kind: 'group',\n clip: { kind: 'rect', x: pose.x, y: pose.y, width: pose.width, height: pose.height },\n children: [textCmd],\n });\n } else {\n children.push(textCmd);\n }\n }\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n"],"mappings":";;;AAoCA,SAAgBA,EAAmB,GAAoD;CACrF,IAAM,EAAE,QAAK,QAAQ,WAAQ,QAAQ,aAAU,YAAS,aAAU,kBAAe,OAAUC;CAC3F,OAAO;EACL;EACA;EACA,OAAO,GAAO,MAAS;GAGrB,IAAMC,KAASC,EAAK,MAAM,IAAIA,EAAK,MAAM,KAAK,GACxCC,IAA0B,CAAC;GACjC,KAAK,IAAMC,KAAQC,EAAS,GAAG;IAC7B,IAAIC,IAAWF,CAAI,GAAG;IACtB,IAAMG,IAAOC,EAAQJ,CAAI;IACzB,IAAIG,EAAK,QAAQA,EAAK,KAAK,SAAS,KAAKE,EAAgBF,EAAK,IAAI,MAAMA,EAAK,MAC3E,MAAU,MACR,+IAGF;IAEF,IAAMG,IAAUC,EAAoBJ,GAAMN,CAAK;IAC/C,AAAIW,IACFT,EAAS,KAAK;KACZ,MAAM;KACN,MAAM;MAAE,MAAM;MAAQ,GAAGI,EAAK;MAAG,GAAGA,EAAK;MAAG,OAAOA,EAAK;MAAO,QAAQA,EAAK;KAAO;KACnF,UAAU,CAACG,CAAO;IACpB,CAAC,IAEDP,EAAS,KAAKO,CAAO;GAEzB;GAEA,OAAOP;EACT;CACF;AACF"}
1
+ {"version":3,"file":"textLayer.js","names":["createTextLayer","opts","scale","view","children","node","getTexts","isHidden","pose","getPose","runsToPlainText","textCmd","textCommandFromPose","clipToBounds"],"sources":["../../../src/features/text/textLayer.ts"],"sourcesContent":["/**\n * Text RenderLayer for text that is not in a scene: one `textCommandFromPose`\n * command per item, the same command the `kit:text` node painter emits, so an\n * item lays out — and wraps, or doesn't, per its style — as a node would.\n *\n * The GL renderer uses MSDF text. The resolved style's `fontFamily` must\n * be registered via `registerFont(family, variant, metricsUrl, atlasUrl)`\n * from the renderer module *before* the GL backend dispatches this layer.\n * Unregistered families render with a warning and no glyphs (see\n * `TextDrawCommand`'s contract).\n */\n\nimport { type DrawCommand } from '@weasel-js/renderer';\nimport type { TextPose } from '@weasel-js/text';\n\nimport type { RenderLayer } from 'core/layers/render';\nimport { textCommandFromPose } from '@weasel-js/renderer';\nimport { runsToPlainText } from '@weasel-js/text';\n\n\n/** Options for `createTextLayer`. */\nexport interface CreateTextLayerOpts<T> {\n id?: string;\n label?: string;\n getTexts: () => readonly T[];\n getPose: (node: T) => TextPose;\n /** Optional per-node hide hook (e.g., suppress while editing). */\n isHidden?: (node: T) => boolean;\n /** When `true`, each text command is wrapped in a clipped group so any\n * overflow beyond the pose's `(width × height)` is hidden. Default\n * `false` (legacy: text can spill outside the declared bounds). Opt-in\n * so existing consumers who rely on overflow keep working. */\n clipToBounds?: boolean;\n}\n\n/** Build a `RenderLayer` that emits one `TextDrawCommand` per text node. */\nexport function createTextLayer<T>(opts: CreateTextLayerOpts<T>): RenderLayer<unknown> {\n const { id = 'text', label = 'Text', getTexts, getPose, isHidden, clipToBounds = false } = opts;\n return {\n id,\n label,\n draw: (_data, view) => {\n // A world-space layer, so a `{ px }` size in a pose's style resolves\n // against the live camera. Radial in effect — one factor for both axes.\n const scale = (view.scale.x + view.scale.y) / 2;\n const children: DrawCommand[] = [];\n for (const node of getTexts()) {\n if (isHidden?.(node)) continue;\n const pose = getPose(node);\n if (pose.runs && pose.runs.length > 0 && runsToPlainText(pose.runs) !== pose.text) {\n throw new Error(\n `weasel createTextLayer: TextPose invariant violated — ` +\n `runsToPlainText(runs) !== text. Either omit \\`runs\\` or keep it ` +\n `synchronized with \\`text\\`.`,\n );\n }\n const textCmd = textCommandFromPose(pose, scale);\n if (clipToBounds) {\n children.push({\n kind: 'group',\n clip: { kind: 'rect', x: pose.x, y: pose.y, width: pose.width, height: pose.height },\n children: [textCmd],\n });\n } else {\n children.push(textCmd);\n }\n }\n // World-space commands; drawLayers wraps in viewToMat3 automatically.\n return children;\n },\n };\n}\n"],"mappings":";;;AAoCA,SAAgBA,EAAmB,GAAoD;CACrF,IAAM,EAAE,QAAK,QAAQ,WAAQ,QAAQ,aAAU,YAAS,aAAU,kBAAe,OAAUC;CAC3F,OAAO;EACL;EACA;EACA,OAAO,GAAO,MAAS;GAGrB,IAAMC,KAASC,EAAK,MAAM,IAAIA,EAAK,MAAM,KAAK,GACxCC,IAA0B,CAAC;GACjC,KAAK,IAAMC,KAAQC,EAAS,GAAG;IAC7B,IAAIC,IAAWF,CAAI,GAAG;IACtB,IAAMG,IAAOC,EAAQJ,CAAI;IACzB,IAAIG,EAAK,QAAQA,EAAK,KAAK,SAAS,KAAKE,EAAgBF,EAAK,IAAI,MAAMA,EAAK,MAC3E,MAAU,MACR,+IAGF;IAEF,IAAMG,IAAUC,EAAoBJ,GAAMN,CAAK;IAC/C,AAAIW,IACFT,EAAS,KAAK;KACZ,MAAM;KACN,MAAM;MAAE,MAAM;MAAQ,GAAGI,EAAK;MAAG,GAAGA,EAAK;MAAG,OAAOA,EAAK;MAAO,QAAQA,EAAK;KAAO;KACnF,UAAU,CAACG,CAAO;IACpB,CAAC,IAEDP,EAAS,KAAKO,CAAO;GAEzB;GAEA,OAAOP;EACT;CACF;AACF"}
@@ -1,84 +1,86 @@
1
- import { effectivePose as e } from "../../core/scene/effectivePose.js";
2
- import { asNodeId as t } from "../../core/scene/types.js";
3
- import { findMountedCanvas as n } from "../../canvas/mountedCanvases.js";
4
- import { isTextData as r } from "./isTextData.js";
5
- import { caretIndexAt as i, pointInTextPose as a } from "./hitTest.js";
6
- import { useTextEdit as o } from "./useTextEdit.js";
7
- import { resolveScreenLength as s } from "@weasel-js/paint";
8
- import { useCallback as c, useMemo as l, useRef as u } from "react";
9
- import { useLatest as d } from "@weasel-js/react";
10
- import { clientToCanvas as f } from "@weasel-js/routing";
1
+ import { targetTransformOf as e, worldToLocal as t } from "../../core/geometry/targetFrame.js";
2
+ import { asNodeId as n } from "../../core/scene/types.js";
3
+ import { scenePaintedPoseOf as r } from "../../canvas/derivedPath.js";
4
+ import { findMountedCanvas as i } from "../../canvas/mountedCanvases.js";
5
+ import { poseFrameOf as a } from "@weasel-js/geom";
6
+ import { useCallback as o, useMemo as s, useRef as c } from "react";
7
+ import { useLatest as l } from "@weasel-js/react";
8
+ import { clientToCanvas as u } from "@weasel-js/routing";
9
+ import { resolveScreenLength as d } from "@weasel-js/paint";
10
+ import { caretIndexAt as f, isTextData as p, pointInTextPose as m } from "@weasel-js/text";
11
+ import { useTextEdit as h } from "@weasel-js/text-dom";
11
12
  //#region src/features/text/useSceneTextEdit.ts
12
- function p(e) {
13
+ function g(e) {
13
14
  return typeof e == "function" ? e() : e;
14
15
  }
15
- function m(m, h, g = {}) {
16
- let _ = d(m), v = d(g), y = d(h), b = u(null), x = () => {
17
- let e = y.current, t = e ? n(e, b.current) : null;
16
+ function _(e) {
17
+ return {
18
+ isText: (t) => e.current.isText ? e.current.isText(t) : p(t),
19
+ text: (t) => e.current.getText ? e.current.getText(t) : t.text ?? "",
20
+ style: (t) => e.current.getStyle ? e.current.getStyle(t) : t.style,
21
+ runs: (t) => e.current.getRuns ? e.current.getRuns(t) : t.runs,
22
+ verticalAlign: (t) => e.current.getVerticalAlign ? e.current.getVerticalAlign(t) : t.verticalAlign
23
+ };
24
+ }
25
+ function v(a, p, v = {}) {
26
+ let b = l(a), x = l(v), S = l(p), C = c(null), w = () => {
27
+ let e = S.current, t = e ? i(e, C.current) : null;
18
28
  if (!e || !t) return null;
19
- let r = t.element.getBoundingClientRect(), i = e.getBoundingClientRect();
29
+ let n = t.element.getBoundingClientRect(), r = e.getBoundingClientRect();
20
30
  return {
21
31
  canvas: t,
22
32
  box: {
23
- x: r.left - i.left - e.clientLeft + e.scrollLeft,
24
- y: r.top - i.top - e.clientTop + e.scrollTop,
25
- width: r.width,
26
- height: r.height
33
+ x: n.left - r.left - e.clientLeft + e.scrollLeft,
34
+ y: n.top - r.top - e.clientTop + e.scrollTop,
35
+ width: n.width,
36
+ height: n.height
27
37
  }
28
38
  };
29
- }, S = l(() => ({
30
- isText: (e) => v.current.isText ? v.current.isText(e) : r(e),
31
- text: (e) => v.current.getText ? v.current.getText(e) : e.text ?? "",
32
- style: (e) => v.current.getStyle ? v.current.getStyle(e) : e.style,
33
- runs: (e) => v.current.getRuns ? v.current.getRuns(e) : e.runs,
34
- verticalAlign: (e) => v.current.getVerticalAlign ? v.current.getVerticalAlign(e) : e.verticalAlign
35
- }), [v]), C = o({
36
- container: h,
37
- isEditorChrome: (e) => v.current.isEditorChrome?.(e) ?? !1,
38
- escape: g.escape,
39
- fontHold: g.fontHold,
39
+ }, T = s(() => _(x), [x]), E = h({
40
+ container: p,
41
+ isEditorChrome: (e) => x.current.isEditorChrome?.(e) ?? !1,
42
+ escape: v.escape,
43
+ fontHold: v.fontHold,
44
+ onStart: (e) => x.current.onStart?.(e),
45
+ onEnd: (e) => x.current.onEnd?.(e),
40
46
  getText: (e) => {
41
- let n = _.current.get(t(e));
42
- return n ? S.text(n.data) : "";
47
+ let t = b.current.get(n(e));
48
+ return t ? T.text(t.data) : "";
43
49
  },
44
50
  getStyle: (e) => {
45
- let n = _.current.get(t(e));
46
- return n ? S.style(n.data) : void 0;
51
+ let t = b.current.get(n(e));
52
+ return t ? T.style(t.data) : void 0;
47
53
  },
48
54
  getPaint: (e) => {
49
- let n = _.current.get(t(e));
50
- if (!n) return;
51
- let r = v.current.getPaint;
52
- return r ? r(n.data) : {
53
- fill: n.data.fill,
54
- stroke: n.data.stroke
55
+ let t = b.current.get(n(e));
56
+ if (!t) return;
57
+ let r = x.current.getPaint;
58
+ return r ? r(t.data) : {
59
+ fill: t.data.fill,
60
+ stroke: t.data.stroke
55
61
  };
56
62
  },
57
- getScreenPose: (n) => {
58
- let r = _.current, i = r.get(t(n));
63
+ getScreenPose: (e) => {
64
+ let t = b.current, i = t.get(n(e));
59
65
  if (!i) return null;
60
- let a = e(r, i), o = S.style(i.data), c = x(), l = p(v.current.view) ?? c?.canvas.getView(), u = l ? l.scale.x : 1, d = c?.box.x ?? 0, f = c?.box.y ?? 0;
66
+ let a = r(t)(i), o = T.style(i.data), s = w(), c = y(a, g(x.current.view) ?? s?.canvas.getView(), s?.box);
61
67
  return {
62
- x: d + (l ? (a.x - l.x) * l.scale.x : a.x),
63
- y: f + (l ? (a.y - l.y) * l.scale.y : a.y),
64
- width: a.width,
65
- height: a.height,
66
- fontSize: s(o?.fontSize ?? v.current.defaultFontSize ?? 16, u),
67
- zoom: u,
68
- verticalAlign: S.verticalAlign(i.data)
68
+ ...c,
69
+ fontSize: d(o?.fontSize ?? x.current.defaultFontSize ?? 16, c.zoom),
70
+ verticalAlign: T.verticalAlign(i.data)
69
71
  };
70
72
  },
71
- getClipRect: () => x()?.box ?? null,
73
+ getClipRect: () => w()?.box ?? null,
72
74
  getRuns: (e) => {
73
- let n = _.current.get(t(e));
74
- return n ? S.runs(n.data) : void 0;
75
+ let t = b.current.get(n(e));
76
+ return t ? T.runs(t.data) : void 0;
75
77
  },
76
- commit: (e, { text: n, runs: r, style: i }) => {
77
- let a = t(e), o = _.current.get(a);
78
+ commit: (e, { text: t, runs: r, style: i }) => {
79
+ let a = n(e), o = b.current.get(a);
78
80
  if (!o) return;
79
- let { setText: s, setRuns: c, setStyle: l } = v.current, u = s ? s(o.data, n) : {
81
+ let { setText: s, setRuns: c, setStyle: l } = x.current, u = s ? s(o.data, t) : {
80
82
  ...o.data,
81
- text: n
83
+ text: t
82
84
  };
83
85
  r && (u = c ? c(u, r) : {
84
86
  ...u,
@@ -86,47 +88,76 @@ function m(m, h, g = {}) {
86
88
  }), i && (u = l ? l(u, i) : {
87
89
  ...u,
88
90
  style: i
89
- }), _.current.update(a, { data: u });
91
+ }), b.current.update(a, { data: u });
90
92
  }
91
- }), w = c((t) => {
92
- let r = t.target instanceof HTMLElement ? t.target : null;
93
- if (!r || r.closest("[contenteditable=\"true\"]")) return;
94
- let [o, s] = f(r, t.clientX, t.clientY), c = y.current, l = p(v.current.view) ?? (c ? n(c, r)?.getView() : void 0), u = l ? o / l.scale.x + l.x : o, d = l ? s / l.scale.y + l.y : s, m = _.current.renderOrderNodes();
95
- for (let t = m.length - 1; t >= 0; t--) {
96
- let n = m[t];
97
- if (_.current.isLocked(n.id) || !S.isText(n.data)) continue;
98
- let o = S.text(n.data), s = e(_.current, n), c = {
99
- x: s.x,
100
- y: s.y,
101
- width: s.width,
102
- height: s.height,
103
- text: o,
104
- runs: S.runs(n.data),
105
- style: S.style(n.data),
106
- verticalAlign: S.verticalAlign(n.data)
93
+ }), D = o((n) => {
94
+ let a = n.target instanceof HTMLElement ? n.target : null;
95
+ if (!a || a.closest("[contenteditable=\"true\"]")) return;
96
+ let [o, s] = u(a, n.clientX, n.clientY), c = S.current, l = g(x.current.view) ?? (c ? i(c, a)?.getView() : void 0), d = l ? o / l.scale.x + l.x : o, p = l ? s / l.scale.y + l.y : s, h = b.current.renderOrderNodes(), _ = r(b.current);
97
+ for (let n = h.length - 1; n >= 0; n--) {
98
+ let r = h[n];
99
+ if (b.current.isLocked(r.id) || !T.isText(r.data)) continue;
100
+ let i = T.text(r.data), o = _(r), s = t(e(o), d, p);
101
+ if (!s) continue;
102
+ let c = {
103
+ x: o.x,
104
+ y: o.y,
105
+ width: o.width,
106
+ height: o.height,
107
+ text: i,
108
+ runs: T.runs(r.data),
109
+ style: T.style(r.data),
110
+ verticalAlign: T.verticalAlign(r.data)
107
111
  };
108
- if (a(u, d, c)) {
109
- b.current = r, C.startEdit(String(n.id), { caret: i(u, d, c) });
112
+ if (m(s.x, s.y, c)) {
113
+ C.current = a, E.startEdit(String(r.id), { caret: f(s.x, s.y, c) });
110
114
  return;
111
115
  }
112
116
  }
113
117
  }, [
114
- C,
115
- y,
116
- v,
118
+ E,
117
119
  S,
118
- _
119
- ]), T = c((e) => {
120
- let n = _.current.get(t(e));
121
- return n !== void 0 && S.isText(n.data);
122
- }, [S, _]);
120
+ x,
121
+ T,
122
+ b
123
+ ]), O = o((e) => {
124
+ let t = b.current.get(n(e));
125
+ return t !== void 0 && T.isText(t.data);
126
+ }, [T, b]);
123
127
  return {
124
- ...C,
125
- onDoubleClick: w,
126
- isTextNode: T
128
+ ...E,
129
+ onDoubleClick: D,
130
+ isTextNode: O
127
131
  };
128
132
  }
133
+ function y(e, t, n) {
134
+ let r = t ? t.scale.x : 1, i = t ? t.scale.y : 1, a = (n?.x ?? 0) + (e.x + e.width / 2 - (t?.x ?? 0)) * r, o = (n?.y ?? 0) + (e.y + e.height / 2 - (t?.y ?? 0)) * i;
135
+ return {
136
+ x: a - e.width * r / 2,
137
+ y: o - e.height * r / 2,
138
+ width: e.width,
139
+ height: e.height,
140
+ zoom: r,
141
+ frame: b(e, i / r)
142
+ };
143
+ }
144
+ function b(e, t) {
145
+ let n = a(e);
146
+ if (!n && t === 1) return;
147
+ let [r, i, o, s] = n ?? [
148
+ 1,
149
+ 0,
150
+ 0,
151
+ 1
152
+ ];
153
+ return [
154
+ r,
155
+ i * t,
156
+ o,
157
+ s * t
158
+ ];
159
+ }
129
160
  //#endregion
130
- export { m as useSceneTextEdit };
161
+ export { v as useSceneTextEdit };
131
162
 
132
163
  //# sourceMappingURL=useSceneTextEdit.js.map