@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
@@ -3,46 +3,51 @@ import { resolveDerivedPath as t } from "../core/scene/derivedPath.js";
3
3
  import { clipCarrier as n } from "./planeClips.js";
4
4
  import { findShapeSilhouette as r } from "./NodeShape.js";
5
5
  import { asNodeId as i } from "../core/scene/types.js";
6
- import { sceneDerivedPathOf as a, scenePaintedPoseOf as o } from "./derivedPath.js";
6
+ import { sceneDerivedPathOf as a, scenePaintedPoseOf as o, showsComputedPath as s } from "./derivedPath.js";
7
+ import { reaches as c } from "./pickReach.js";
8
+ import { adapterPickSource as l } from "./adapterPickSource.js";
9
+ import { invert as u } from "@weasel-js/geom";
7
10
  //#region src/canvas/pickWalk.ts
8
- var s = [];
9
- function c(e, t, n) {
11
+ var d = [];
12
+ function f(e, t, n) {
10
13
  return e.kind === "container" ? typeof e.clipFromPose == "function" ? e.clipFromPose(t) : r(e, t, { derivedPath: n }) : null;
11
14
  }
12
- function l(e, t) {
15
+ function p(e, t) {
13
16
  let r = t.includeContainers ?? !0, i = t.includeLocked === !0 ? void 0 : e.isLocked, a = [], o = /* @__PURE__ */ new Map(), s = n(e.planeOf ?? null), l = (t) => {
14
17
  let n = o.get(t.id);
15
18
  if (n !== void 0) return n;
16
- let r = c(t, e.poseOf(t), e.derivedPathOf?.(t));
19
+ let r = f(t, e.poseOf(t), e.derivedPathOf?.(t));
17
20
  return o.set(t.id, r), r;
18
- }, u = /* @__PURE__ */ new Map(), d = (n) => {
21
+ }, d = /* @__PURE__ */ new Map(), p = (t) => {
22
+ let n = d.get(t.id);
23
+ if (n === void 0) {
24
+ let r = t.kind === "container" ? t.copiesFromPose : void 0;
25
+ n = (r ? r(e.poseOf(t), t) ?? [] : []).map(u).filter((e) => e !== null), d.set(t.id, n);
26
+ }
27
+ return n;
28
+ }, m = /* @__PURE__ */ new Map(), h = (n) => {
19
29
  if (n === void 0 || e.planeOf === void 0) return t;
20
- let r = u.get(n);
30
+ let r = m.get(n);
21
31
  if (r === void 0) {
22
32
  let i = e.planeOf(n);
23
- r = i === null ? t : t.inPlane?.(i) ?? null, u.set(n, r);
33
+ r = i === null ? t : t.inPlane?.(i) ?? null, m.set(n, r);
24
34
  }
25
35
  return r;
26
- };
27
- for (let t of e.order()) {
36
+ }, g = e.order(), _ = g.some((e) => e.kind === "container" && typeof e.copiesFromPose == "function");
37
+ for (let t of g) {
28
38
  if (!r && t.kind === "container" || t.pickable === !1 || t.layer !== void 0 && e.layerIsPainted?.(t.layer) === !1 || e.alphaOf !== void 0 && e.alphaOf(t.id) <= 0 || i !== void 0 && i(t)) continue;
29
- let n = d(t.layer);
39
+ let n = h(t.layer);
30
40
  if (n === null) continue;
31
- let o = e.poseOf(t), c = e.derivedPathOf?.(t);
32
- if (!n.hits(t, o, c)) continue;
33
- let u = !1;
34
- for (let r of e.parentsOf(t)) {
35
- let e = l(r);
36
- if (e !== null && !n.clipAdmits(s(e, r.layer, t.layer), t, o, c)) {
37
- u = !0;
38
- break;
39
- }
40
- }
41
- u || a.push(t.id);
41
+ let o = e.poseOf(t), u = e.derivedPathOf?.(t);
42
+ c(t, o, u, n, () => e.parentsOf(t), _, {
43
+ clipOf: l,
44
+ copiesOf: p,
45
+ carry: s
46
+ }) && a.push(t.id);
42
47
  }
43
48
  return a;
44
49
  }
45
- function u(e) {
50
+ function m(e) {
46
51
  let t = null;
47
52
  for (let n of e.layers ?? []) n.locked === !0 && (t ??= /* @__PURE__ */ new Set()).add(n.id);
48
53
  if (t === null) return null;
@@ -56,18 +61,18 @@ function u(e) {
56
61
  return !1;
57
62
  };
58
63
  }
59
- function d(e) {
64
+ function h(e) {
60
65
  let t = /* @__PURE__ */ new Set();
61
66
  for (let n of e ?? []) n.visible === !1 && t.add(n.id);
62
67
  return t;
63
68
  }
64
- function f(e, n = {}) {
65
- let r = d(e.layers), c = u(e), { getPose: l, alphaOf: f, layerIsPainted: m } = n, h = null, g = typeof e.overrides?.ids == "function";
66
- if (!f && g) for (let t of e.overrides.ids()) {
69
+ function g(e, n = {}) {
70
+ let r = h(e.layers), c = m(e), { getPose: l, alphaOf: u, layerIsPainted: f } = n, p = null, g = typeof e.overrides?.ids == "function";
71
+ if (!u && g) for (let t of e.overrides.ids()) {
67
72
  let n = e.overrides.read(t)?.alpha;
68
- n !== void 0 && n <= 0 && (h ??= /* @__PURE__ */ new Set()).add(t);
73
+ n !== void 0 && n <= 0 && (p ??= /* @__PURE__ */ new Set()).add(t);
69
74
  }
70
- let _ = f ?? (g ? h ? (e) => +!h.has(e) : void 0 : (t) => e.overrides.read(i(t))?.alpha ?? 1), v = n.poseComposition, y = o(e, void 0, v), b = l ? (e) => l(e.id) : (e) => y(e), x = (t) => e.childrenOf(t), S = (n) => {
75
+ let v = u ?? (g ? p ? (e) => +!p.has(e) : void 0 : (t) => e.overrides.read(i(t))?.alpha ?? 1), y = o(e), b = l ? (e) => l(e.id) : (e) => y(e), x = (t) => e.childrenOf(t), S = (n) => {
71
76
  let r = e.get(n);
72
77
  if (r !== void 0) return {
73
78
  node: r,
@@ -76,10 +81,10 @@ function f(e, n = {}) {
76
81
  return t(r, S, x);
77
82
  }
78
83
  };
79
- }, C = l ? null : a(e, void 0, v), w = (e) => {
80
- let n = e;
81
- return n.dependsOn === void 0 ? null : C ? C(n) : t(n, S, x);
82
- }, T = n.camera ? p(e.layers, n.camera) : null;
84
+ }, C = l ? null : a(e), w = (n) => {
85
+ let r = n;
86
+ return C ? s(e, r) ? C(r) : null : r.dependsOn === void 0 ? null : t(r, S, x);
87
+ }, T = n.camera ? _(e.layers, n.camera) : null;
83
88
  return {
84
89
  ...T ? { planeOf: T } : {},
85
90
  order: () => e.renderOrderNodes(),
@@ -87,7 +92,7 @@ function f(e, n = {}) {
87
92
  poseOf: b,
88
93
  parentsOf(t) {
89
94
  let n = t.parent ?? null;
90
- if (n === null) return s;
95
+ if (n === null) return d;
91
96
  let r = [], a = /* @__PURE__ */ new Set();
92
97
  for (; n !== null && !a.has(n);) {
93
98
  a.add(n);
@@ -97,51 +102,19 @@ function f(e, n = {}) {
97
102
  }
98
103
  return r;
99
104
  },
100
- ..._ ? { alphaOf: _ } : {},
105
+ ...v ? { alphaOf: v } : {},
101
106
  ...c ? { isLocked: (e) => c(e.id) } : {},
102
- ...r.size > 0 || m ? { layerIsPainted: (e) => !r.has(e) && (m === void 0 || m(e)) } : {}
107
+ ...r.size > 0 || f ? { layerIsPainted: (e) => !r.has(e) && (f === void 0 || f(e)) } : {}
103
108
  };
104
109
  }
105
- function p(t, n) {
110
+ function _(t, n) {
106
111
  let r = null;
107
112
  for (let i of t ?? []) i.parallax && (r ??= /* @__PURE__ */ new Map()).set(i.id, e(n, i.parallax));
108
113
  if (r === null) return null;
109
114
  let i = r;
110
115
  return (e) => i.get(e) ?? null;
111
116
  }
112
- function m(e, t = {}) {
113
- let n = e, r = typeof e.getChildren == "function" && typeof e.getNode == "function", i = /* @__PURE__ */ new Map(), a = (t) => typeof e.getWorldPose == "function" ? e.getWorldPose(t) : e.getPose(t), o = (e) => ({
114
- ...n.getNode(e),
115
- id: e,
116
- pose: a(e)
117
- });
118
- return {
119
- order() {
120
- if (!r) return i = /* @__PURE__ */ new Map(), e.getNodes().map((e) => ({
121
- ...e,
122
- id: e.id,
123
- pose: a(e.id)
124
- }));
125
- let t = [], s = /* @__PURE__ */ new Map(), c = (e, r) => {
126
- for (let i of n.getChildren(e)) {
127
- let e = o(i);
128
- r && s.set(i, r), t.push(e), c(i, e);
129
- }
130
- };
131
- return c(null, null), i = s, t;
132
- },
133
- ...t.alphaOf ? { alphaOf: t.alphaOf } : {},
134
- ...t.layerIsPainted ? { layerIsPainted: t.layerIsPainted } : {},
135
- ...t.planeOf ? { planeOf: t.planeOf } : {},
136
- poseOf: (e) => a(e.id),
137
- parentsOf(e) {
138
- let t = [], n = i.get(e.id), r = /* @__PURE__ */ new Set();
139
- for (; n && !r.has(n.id);) r.add(n.id), t.push(n), n = i.get(n.id);
140
- return t;
141
- }
142
- };
143
- }
144
117
  //#endregion
145
- export { m as adapterPickSource, d as hiddenLayerIds, c as ownClipOf, l as pickWalk, f as scenePickSource, p as scenePlaneOf };
118
+ export { l as adapterPickSource, h as hiddenLayerIds, f as ownClipOf, p as pickWalk, g as scenePickSource, _ as scenePlaneOf };
146
119
 
147
120
  //# sourceMappingURL=pickWalk.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pickWalk.js","names":["EMPTY_PARENTS","ownClipOf","node","pose","findShapeSilhouette","derived","pickWalk","includeContainers","q","isLocked","src","out","clipPath","carry","clipCarrier","clipOf","cached","ancestor","resolved","planeQueries","queryFor","layer","found","map","query","clipped","clip","lockedNodeTest","locked","scene","lockedLayers","cur","asNodeId","id","seen","hiddenLayerIds","layers","scenePickSource","hidden","opts","faded","enumerable","alphaOf","a","readAlpha","composition","paintedPoseOf","scenePaintedPoseOf","poseOf","getPose","childrenOf","depOf","dep","resolveDerivedPath","sceneDerivedPath","sceneDerivedPathOf","derivedPathOf","planeOf","scenePlaneOf","parentId","chain","parent","layerIsPainted","maps","l","planeMap","camera","adapterPickSource","hier","adapter","hierarchical","parents","worldPose","nodeOf","n","next","visit","childId","gates"],"sources":["../../src/canvas/pickWalk.ts"],"sourcesContent":["/**\n * The one hit-test walk.\n *\n * Four walks used to answer this question — two point queries, two area\n * queries — over the same tree with the same gates. They drifted three times\n * without a failing test, because nothing held them to each other. Everything\n * that decides whether a node *can* be hit lives here now; a query supplies\n * only the shape test and the clip predicate for its own region.\n *\n * The gates, in the order the walk applies them:\n * 1. containers, when the query does not want them\n * 2. the layer is painted at all — scene visibility, and the asking view's\n * `layerVisibility` / `layerOrder`\n * 3. painted alpha is above zero\n * 4. the node is not locked, unless the query asks for locked nodes\n * 5. the query's own shape test\n * 6. every ancestor clip admits the query region\n *\n * 2, 3 and 6 are all \"the renderer did not put this on screen\". A pick path\n * that skips one answers for a node the user cannot see. 4 is the other axis:\n * a locked node is on screen and still out of reach.\n */\n\nimport type { Path } from '@weasel-js/geom';\nimport { findShapeSilhouette } from 'canvas/NodeShape';\nimport type { ClipFromPoseFn, DerivedDep, Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport { resolveDerivedPath, sceneDerivedPathOf, scenePaintedPoseOf } from './derivedPath';\nimport type { PoseComposition } from 'features/groups/composePose';\nimport { planeMap, type ParallaxOpts, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { clipCarrier } from './planeClips';\n\n/** Shared, never mutated: most scenes are flat and every node returns it. */\nconst EMPTY_PARENTS: readonly never[] = [];\n\n/** The subset of a node the walk itself reads. Deliberately structural: a\n * bare adapter's node satisfies it as readily as a `SceneNode`. */\nexport interface PickCandidate<TPose> {\n id: string;\n kind?: string;\n layer?: string;\n pose: TPose;\n /** `false` makes the node transparent to the walk — see `SceneNode.pickable`. */\n pickable?: boolean;\n clipFromPose?: ClipFromPoseFn<TPose>;\n}\n\n/**\n * Everything the walk reads that a **view** owns.\n *\n * A layer must not hold state a view owns, so none of these are closed over\n * at construction — each is asked per walk, of the view being dispatched to.\n */\nexport interface PickSource<TPose> {\n /** Candidates in paint order, back-to-front. Containers included; the\n * query decides whether they can be hit. */\n order(): readonly PickCandidate<TPose>[];\n /** The pose the renderer draws — override-aware. Not `node.pose`, which is\n * how the render and pick paths came to disagree about where a node is. */\n poseOf(node: PickCandidate<TPose>): TPose;\n /** Ancestors, innermost first. Only walked for candidates that already\n * passed their own shape test. */\n parentsOf(node: PickCandidate<TPose>): readonly PickCandidate<TPose>[];\n /** Painted alpha for the asking view: the view's `alphaFor` times any\n * per-node override alpha. Omit when the source has no alpha concept. */\n alphaOf?(id: string): number;\n /** Whether this layer reaches the screen in the asking view. Omit for a\n * source with no layers. */\n layerIsPainted?(layer: string): boolean;\n /** Whether the node is locked — painted, but not something a pointer can\n * take. Omit for a source with no lock concept. */\n isLocked?(node: PickCandidate<TPose>): boolean;\n /** The path a node computes from its dependencies' poses, or null when it\n * derives nothing. Only a scene-backed source can answer — deriving needs\n * the dependencies' poses — so a bare adapter omits it, and every derived\n * node there keeps answering from its own (placeholder) pose. */\n derivedPathOf?(node: PickCandidate<TPose>): Path | null;\n /** How the asking view's world maps into a parallax layer's, or null for a\n * layer that moves with the camera. Omit for a source with no planes. */\n planeOf?(layer: string): PlaneMap | null;\n}\n\n/** One hit-test question: what region, and what counts as covering it. */\nexport interface PickQuery<TPose> {\n /** Default `true`. The area walks exclude containers so a marquee does not\n * return a container and its children both. */\n includeContainers?: boolean;\n /** Default `false`. Every selecting or editing query passes over locked\n * nodes; one that only samples what is painted can take them back. */\n includeLocked?: boolean;\n /** Does this node, drawn at this pose, cover the query region? `derived`\n * is the node's resolved path when it has one — a derived node's pose is a\n * placeholder, so a region test that reads only the pose answers for the\n * wrong box. */\n hits(node: PickCandidate<TPose>, pose: TPose, derived?: Path | null): boolean;\n /**\n * Does an ancestor's clip leave anything of `node` for this query to hit?\n *\n * A point query asks point-in-clip and ignores the node. An area query has\n * to ask about the node as well: the clip and the area can overlap where\n * the node is not, and the node and the clip can overlap where the area is\n * not, and only the two terms together reject both.\n */\n clipAdmits(\n clip: Path,\n node: PickCandidate<TPose>,\n pose: TPose,\n derived?: Path | null,\n ): boolean;\n /** The same question asked in a parallax plane's world: the region carried\n * through `map`, and any screen-pixel slop re-derived at the plane's scale.\n * A query without it cannot reach nodes on a plane — it would test them\n * where their poses sit rather than where they are painted. */\n inPlane?(map: PlaneMap): PickQuery<TPose>;\n}\n\n/** The clip a container imposes on its subtree, or null when it imposes none. */\nexport function ownClipOf<TPose>(\n node: PickCandidate<TPose>,\n pose: TPose,\n derived?: Path | null,\n): Path | null {\n if (node.kind !== 'container') return null;\n if (typeof node.clipFromPose === 'function') return node.clipFromPose(pose);\n return findShapeSilhouette(\n node as unknown as Node<unknown, string, TPose>,\n pose,\n { derivedPath: derived },\n );\n}\n\n/**\n * Collect every candidate the query hits, back-to-front — the last element is\n * the topmost, which is the order `pickTopMostHit` expects.\n */\nexport function pickWalk<TPose>(\n src: PickSource<TPose>,\n q: PickQuery<TPose>,\n): string[] {\n const includeContainers = q.includeContainers ?? true;\n const isLocked = q.includeLocked === true ? undefined : src.isLocked;\n const out: string[] = [];\n\n // Resolving a container's clip means `clipFromPose` or a silhouette build,\n // which is the expensive half; the predicate against it is cheap. So the\n // *path* is memoized per container for the walk and the predicate re-runs\n // per candidate — `clipAdmits` needs the candidate, and caching its answer\n // per container would answer the wrong question for an area query.\n const clipPath = new Map<string, Path | null>();\n // A clip is in its container's plane; the query is in the candidate's.\n const carry = clipCarrier(src.planeOf ?? null);\n\n const clipOf = (ancestor: PickCandidate<TPose>): Path | null => {\n const cached = clipPath.get(ancestor.id);\n if (cached !== undefined) return cached;\n const resolved = ownClipOf(\n ancestor, src.poseOf(ancestor), src.derivedPathOf?.(ancestor),\n );\n clipPath.set(ancestor.id, resolved);\n return resolved;\n };\n\n // One reprojected query per plane per walk; `null` marks a plane this\n // query cannot reach.\n const planeQueries = new Map<string, PickQuery<TPose> | null>();\n const queryFor = (layer: string | undefined): PickQuery<TPose> | null => {\n if (layer === undefined || src.planeOf === undefined) return q;\n let found = planeQueries.get(layer);\n if (found === undefined) {\n const map = src.planeOf(layer);\n found = map === null ? q : (q.inPlane?.(map) ?? null);\n planeQueries.set(layer, found);\n }\n return found;\n };\n\n for (const node of src.order()) {\n if (!includeContainers && node.kind === 'container') continue;\n // Transparent to picking: the click belongs to whatever is behind it,\n // which for a label inside a box is the box.\n if (node.pickable === false) continue;\n if (node.layer !== undefined && src.layerIsPainted?.(node.layer) === false) continue;\n if (src.alphaOf !== undefined && src.alphaOf(node.id) <= 0) continue;\n if (isLocked !== undefined && isLocked(node)) continue;\n\n const query = queryFor(node.layer);\n if (query === null) continue;\n const pose = src.poseOf(node);\n const derived = src.derivedPathOf?.(node);\n if (!query.hits(node, pose, derived)) continue;\n\n let clipped = false;\n for (const ancestor of src.parentsOf(node)) {\n const clip = clipOf(ancestor);\n if (clip === null) continue;\n if (!query.clipAdmits(carry(clip, ancestor.layer, node.layer), node, pose, derived)) {\n clipped = true;\n break;\n }\n }\n if (clipped) continue;\n\n out.push(node.id);\n }\n\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// Sources\n// ---------------------------------------------------------------------------\n\n/** Answers `Scene.isLocked` from the layer records and parent links alone,\n * so a partial scene stand-in works too. Null when nothing is locked, which\n * is what keeps the gate off the walk in the common case. */\nfunction lockedNodeTest(\n scene: Pick<Scene<unknown, string, unknown>, 'layers' | 'get'>,\n): ((id: string) => boolean) | null {\n let locked: Set<string> | null = null;\n for (const layer of scene.layers ?? []) {\n if (layer.locked === true) (locked ??= new Set()).add(layer.id);\n }\n if (locked === null) return null;\n const lockedLayers = locked;\n return (id) => {\n let cur = scene.get(asNodeId(id));\n const seen = new Set<string>();\n while (cur !== undefined && !seen.has(cur.id)) {\n if (lockedLayers.has(cur.layer)) return true;\n seen.add(cur.id);\n cur = cur.parent === null ? undefined : scene.get(cur.parent);\n }\n return false;\n };\n}\n\n/** Layer ids the scene reports as hidden. Only an explicit `false` hides a\n * layer: a partial scene stand-in that omits the flag stays pickable. */\nexport function hiddenLayerIds(\n layers: readonly { id: string; visible?: boolean }[] | undefined,\n): Set<string> {\n const out = new Set<string>();\n for (const layer of layers ?? []) {\n if (layer.visible === false) out.add(layer.id);\n }\n return out;\n}\n\n/**\n * The two answers a pick needs from the view it is asked for rather than from\n * the data behind it: how that view paints a node, and whether it paints a\n * layer at all. A scene and a bare adapter take the same pair.\n */\nexport interface ViewPickGates {\n /** Painted alpha: the view's `alphaFor` times any per-node override alpha.\n * A node painted at alpha 0 cannot be hit. */\n alphaOf?: (id: string) => number;\n /** Whether a node's `layer` reaches the screen in the asking view. */\n layerIsPainted?: (layer: string) => boolean;\n}\n\n/** The gates a bare adapter takes from its view, plus how that view's camera\n * maps into each parallax layer — see `scenePlaneOf`. */\nexport interface AdapterPickGates extends ViewPickGates {\n planeOf?: (layer: string) => PlaneMap | null;\n}\n\nexport interface ScenePickSourceOptions<TPose> extends ViewPickGates {\n /** Pose lookup, when the caller holds an adapter that already resolves\n * overrides. Defaults to `effectivePose` against the scene's own. */\n getPose?: (id: string) => TPose;\n /** The asking view's composed alpha — `alphaFor(id)` times override alpha.\n * Defaults to the override alpha alone, which is all a bare scene knows. */\n alphaOf?: (id: string) => number;\n /** The asking view's answer to \"does this scene layer reach the screen\",\n * which is `layerVisibility` and `layerOrder` on top of the scene's own\n * `visible` flag. Consulted after the scene's flag, never instead of it. */\n layerIsPainted?: (layer: string) => boolean;\n /** How a child's stored pose folds into its parent's frame. Needed because\n * picking tests where a node is drawn, and under a composing strategy that\n * is not where its own pose says. Ignored when `getPose` already answers in\n * world coordinates. */\n poseComposition?: PoseComposition<TPose>;\n /** The asking view's camera. With it, a layer carrying `parallax` is picked\n * through its plane; without it, every layer is taken to move with the\n * camera. */\n camera?: View;\n}\n\nexport function scenePickSource<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n opts: ScenePickSourceOptions<TPose> = {},\n): PickSource<TPose> {\n const hidden = hiddenLayerIds(scene.layers);\n const locked = lockedNodeTest(scene as never);\n const { getPose, alphaOf, layerIsPainted } = opts;\n\n // Resolved once per walk rather than once per candidate: a scene with\n // nothing faded has nothing to say about alpha, and asking it per node is a\n // Map lookup on a linear scan that has no other reason to touch the\n // override table. Needs enumeration — a partial scene stand-in carrying\n // only `read` falls back to reading per node.\n let faded: Set<string> | null = null;\n const enumerable = typeof scene.overrides?.ids === 'function';\n if (!alphaOf && enumerable) {\n for (const id of scene.overrides.ids()) {\n const a = scene.overrides.read(id)?.alpha;\n if (a !== undefined && a <= 0) (faded ??= new Set()).add(id);\n }\n }\n const readAlpha = alphaOf\n ?? (enumerable\n ? (faded ? (id: string) => (faded.has(id) ? 0 : 1) : undefined)\n : (id: string) => scene.overrides.read(asNodeId(id))?.alpha ?? 1);\n\n // A composing strategy makes a node's own pose local, so picking folds the\n // parent chain the same way the render walk does: one definition of both.\n const composition = opts.poseComposition;\n const paintedPoseOf = scenePaintedPoseOf(scene, undefined, composition);\n const poseOf = getPose\n ? (node: PickCandidate<TPose>) => getPose(node.id)\n : (node: PickCandidate<TPose>) => paintedPoseOf(node as never);\n\n // Through `poseOf`, not the document pose: a derived node has to be tested\n // where the renderer draws its dependencies, which is what an override says.\n const childrenOf = (id: NodeId): readonly NodeId[] => scene.childrenOf(id);\n const depOf = (id: NodeId): DerivedDep<TPose> | undefined => {\n const dep = scene.get(id);\n if (dep === undefined) return undefined;\n return {\n node: dep as Node<unknown, string, TPose>,\n pose: poseOf(dep as never),\n get path(): Path | null {\n return resolveDerivedPath(dep as never, depOf, childrenOf);\n },\n };\n };\n\n const sceneDerivedPath = getPose ? null : sceneDerivedPathOf(scene, undefined, composition);\n const derivedPathOf = (node: PickCandidate<TPose>): Path | null => {\n const n = node as unknown as Node<TData, TLayer, TPose>;\n if (n.dependsOn === undefined) return null;\n return sceneDerivedPath ? sceneDerivedPath(n) : resolveDerivedPath(n, depOf, childrenOf);\n };\n\n const planeOf = opts.camera ? scenePlaneOf(scene.layers, opts.camera) : null;\n\n return {\n ...(planeOf ? { planeOf } : {}),\n order: () => scene.renderOrderNodes() as unknown as readonly PickCandidate<TPose>[],\n derivedPathOf,\n poseOf,\n parentsOf(node) {\n let parentId = (node as { parent?: string | null }).parent ?? null;\n if (parentId === null) return EMPTY_PARENTS;\n const chain: PickCandidate<TPose>[] = [];\n const seen = new Set<string>();\n while (parentId !== null) {\n if (seen.has(parentId)) break;\n seen.add(parentId);\n const parent = scene.get(asNodeId(parentId));\n if (!parent) break;\n chain.push(parent as unknown as PickCandidate<TPose>);\n parentId = parent.parent ?? null;\n }\n return chain;\n },\n // Absent entirely when nothing is faded, so the walk skips the gate.\n ...(readAlpha ? { alphaOf: readAlpha } : {}),\n ...(locked ? { isLocked: (node: PickCandidate<TPose>) => locked(node.id) } : {}),\n ...(hidden.size > 0 || layerIsPainted\n ? {\n layerIsPainted: (layer: string) =>\n !hidden.has(layer) && (layerIsPainted === undefined || layerIsPainted(layer)),\n }\n : {}),\n };\n}\n\n/** Each parallax layer's plane map under `camera`, or null when no layer is a\n * plane — which keeps the per-layer lookup off the walk entirely. */\nexport function scenePlaneOf(\n layers: readonly { id: string; parallax?: ParallaxOpts }[] | undefined,\n camera: View,\n): ((layer: string) => PlaneMap | null) | null {\n let maps: Map<string, PlaneMap> | null = null;\n for (const l of layers ?? []) {\n if (l.parallax) (maps ??= new Map()).set(l.id, planeMap(camera, l.parallax));\n }\n if (maps === null) return null;\n const found = maps;\n return (layer) => found.get(layer) ?? null;\n}\n\n/** The adapter surface the walk can reach without a `Scene`. */\ninterface PickAdapter<TPose> {\n /** Composed world pose, when the adapter has a composition strategy.\n * Falls back to `getPose`, which is the same value under the\n * absolute-pose model. */\n getWorldPose?(id: string): TPose;\n getNodes(): readonly { id: string }[];\n getPose(id: string): TPose;\n getNode?: (id: string) => unknown;\n getChildren?: (parentId: string | null) => readonly string[];\n}\n\n/**\n * A source over a bare `SelectAdapter`, for consumers with no `Scene`.\n *\n * A hierarchical adapter is walked depth-first, parents before children —\n * the same back-to-front order `renderOrderNodes` produces for a single\n * layer. A flat adapter falls back to `getNodes()`, which carries no\n * parentage, so nothing clips.\n *\n * `gates` come from whichever view is picking, never from the adapter.\n */\nexport function adapterPickSource<TPose>(\n adapter: PickAdapter<TPose>,\n gates: AdapterPickGates = {},\n): PickSource<TPose> {\n const hier = adapter as Required<Pick<PickAdapter<TPose>, 'getNode' | 'getChildren'>>;\n const hierarchical =\n typeof adapter.getChildren === 'function' && typeof adapter.getNode === 'function';\n\n // Rebuilt per walk: the tree may have changed between queries, and a walk\n // is the only thing that reads it.\n let parents = new Map<string, PickCandidate<TPose>>();\n\n // The adapter composes if it has a strategy; `getPose` alone is the node's\n // own pose, which is not where a framed child is drawn.\n const worldPose = (id: string): TPose =>\n (typeof adapter.getWorldPose === 'function' ? adapter.getWorldPose(id) : adapter.getPose(id));\n\n const nodeOf = (id: string): PickCandidate<TPose> => {\n const raw = hier.getNode(id) as Partial<PickCandidate<TPose>>;\n return { ...raw, id, pose: worldPose(id) } as PickCandidate<TPose>;\n };\n\n return {\n order() {\n if (!hierarchical) {\n parents = new Map();\n return adapter.getNodes().map((n) => ({\n ...(n as object), id: n.id, pose: worldPose(n.id),\n })) as PickCandidate<TPose>[];\n }\n const out: PickCandidate<TPose>[] = [];\n const next = new Map<string, PickCandidate<TPose>>();\n const visit = (parentId: string | null, parent: PickCandidate<TPose> | null): void => {\n for (const childId of hier.getChildren(parentId)) {\n const node = nodeOf(childId);\n if (parent) next.set(childId, parent);\n out.push(node);\n visit(childId, node);\n }\n };\n visit(null, null);\n parents = next;\n return out;\n },\n ...(gates.alphaOf ? { alphaOf: gates.alphaOf } : {}),\n ...(gates.layerIsPainted ? { layerIsPainted: gates.layerIsPainted } : {}),\n ...(gates.planeOf ? { planeOf: gates.planeOf } : {}),\n poseOf: (node) => worldPose(node.id),\n parentsOf(node) {\n const chain: PickCandidate<TPose>[] = [];\n let cur = parents.get(node.id);\n const seen = new Set<string>();\n while (cur && !seen.has(cur.id)) {\n seen.add(cur.id);\n chain.push(cur);\n cur = parents.get(cur.id);\n }\n return chain;\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pickWalk.js","names":["EMPTY_PARENTS","ownClipOf","node","pose","findShapeSilhouette","derived","pickWalk","includeContainers","q","isLocked","src","out","clipPath","carry","clipCarrier","clipOf","cached","ancestor","resolved","copyMaps","copiesOf","found","fn","invert","m","planeQueries","queryFor","layer","map","order","copying","n","query","reaches","lockedNodeTest","locked","scene","lockedLayers","cur","asNodeId","id","seen","hiddenLayerIds","layers","scenePickSource","hidden","opts","faded","enumerable","alphaOf","a","readAlpha","paintedPoseOf","scenePaintedPoseOf","poseOf","getPose","childrenOf","depOf","dep","resolveDerivedPath","sceneDerivedPath","sceneDerivedPathOf","derivedPathOf","showsComputedPath","planeOf","scenePlaneOf","parentId","chain","parent","layerIsPainted","maps","l","planeMap","camera","adapterPickSource"],"sources":["../../src/canvas/pickWalk.ts"],"sourcesContent":["/**\n * The one hit-test walk. Everything that decides whether a node *can* be hit lives here; a\n * query supplies only the shape test and the clip predicate for its own region.\n *\n * The gates, in the order the walk applies them:\n * 1. containers, when the query does not want them\n * 2. the layer is painted at all — scene visibility, and the asking view's\n * `layerVisibility` / `layerOrder`\n * 3. painted alpha is above zero\n * 4. the node is not locked, unless the query asks for locked nodes\n * 5. the query's own shape test\n * 6. every ancestor clip admits the query region\n *\n * 2, 3 and 6 are all \"the renderer did not put this on screen\". A pick path\n * that skips one answers for a node the user cannot see. 4 is the other axis:\n * a locked node is on screen and still out of reach.\n */\n\nimport { invert, type Affine, type Path } from '@weasel-js/geom';\nimport { findShapeSilhouette } from 'canvas/NodeShape';\nimport type { ClipFromPoseFn, CopiesFromPoseFn, DerivedDep, Node, NodeId, Scene } from 'core/scene/types';\nimport { asNodeId } from 'core/scene/types';\nimport { resolveDerivedPath, sceneDerivedPathOf, scenePaintedPoseOf, showsComputedPath } from './derivedPath';\nimport { planeMap, type ParallaxOpts, type PlaneMap } from 'core/viewport/parallax';\nimport type { View } from 'core/viewport/view';\nimport { clipCarrier } from './planeClips';\nimport { reaches } from './pickReach';\n\n/** Shared, never mutated: most scenes are flat and every node returns it. */\nconst EMPTY_PARENTS: readonly never[] = [];\n\n/** The subset of a node the walk itself reads. Deliberately structural: a\n * bare adapter's node satisfies it as readily as a `SceneNode`. */\nexport interface PickCandidate<TPose> {\n id: string;\n kind?: string;\n layer?: string;\n pose: TPose;\n /** `false` makes the node transparent to the walk — see `SceneNode.pickable`. */\n pickable?: boolean;\n clipFromPose?: ClipFromPoseFn<TPose>;\n copiesFromPose?: CopiesFromPoseFn<TPose>;\n}\n\n/**\n * Everything the walk reads that a **view** owns.\n *\n * A layer must not hold state a view owns, so none of these are closed over\n * at construction — each is asked per walk, of the view being dispatched to.\n */\nexport interface PickSource<TPose> {\n /** Candidates in paint order, back-to-front. Containers included; the\n * query decides whether they can be hit. */\n order(): readonly PickCandidate<TPose>[];\n /** The pose the renderer draws — override-aware. Not `node.pose`, which is\n * how the render and pick paths came to disagree about where a node is. */\n poseOf(node: PickCandidate<TPose>): TPose;\n /** Ancestors, innermost first. Only walked for candidates that already\n * passed their own shape test. */\n parentsOf(node: PickCandidate<TPose>): readonly PickCandidate<TPose>[];\n /** Painted alpha for the asking view: the view's `alphaFor` times any\n * per-node override alpha. Omit when the source has no alpha concept. */\n alphaOf?(id: string): number;\n /** Whether this layer reaches the screen in the asking view. Omit for a\n * source with no layers. */\n layerIsPainted?(layer: string): boolean;\n /** Whether the node is locked — painted, but not something a pointer can\n * take. Omit for a source with no lock concept. */\n isLocked?(node: PickCandidate<TPose>): boolean;\n /** The path a node computes from its dependencies, or null for none. */\n derivedPathOf?(node: PickCandidate<TPose>): Path | null;\n /** How the asking view's world maps into a parallax layer's, or null for a\n * layer that moves with the camera. Omit for a source with no planes. */\n planeOf?(layer: string): PlaneMap | null;\n}\n\n/** One hit-test question: what region, and what counts as covering it. */\nexport interface PickQuery<TPose> {\n /** Default `true`. The area walks exclude containers so a marquee does not\n * return a container and its children both. */\n includeContainers?: boolean;\n /** Default `false`. Every selecting or editing query passes over locked\n * nodes; one that only samples what is painted can take them back. */\n includeLocked?: boolean;\n /** Does this node, drawn at this pose, cover the query region? `derived`\n * is the node's resolved path when it has one — a derived node's pose is a\n * placeholder, so a region test that reads only the pose answers for the\n * wrong box. */\n hits(node: PickCandidate<TPose>, pose: TPose, derived?: Path | null): boolean;\n /**\n * Does an ancestor's clip leave anything of `node` for this query to hit?\n *\n * A point query asks point-in-clip and ignores the node. An area query has\n * to ask about the node as well: the clip and the area can overlap where\n * the node is not, and the node and the clip can overlap where the area is\n * not, and only the two terms together reject both.\n */\n clipAdmits(\n clip: Path,\n node: PickCandidate<TPose>,\n pose: TPose,\n derived?: Path | null,\n ): boolean;\n /** The same question asked in a parallax plane's world: the region carried\n * through `map`, and any screen-pixel slop re-derived at the plane's scale.\n * A query without it cannot reach nodes on a plane — it would test them\n * where their poses sit rather than where they are painted. */\n inPlane?(map: PlaneMap): PickQuery<TPose>;\n /** The same question carried by `m`, an affine from world into the source\n * frame of a copy a container draws. A query without it cannot reach\n * copies — see `ContainerNode.copiesFromPose`. */\n inCopy?(m: Affine): PickQuery<TPose>;\n}\n\n/** The clip a container imposes on its subtree, or null when it imposes none. */\nexport function ownClipOf<TPose>(\n node: PickCandidate<TPose>,\n pose: TPose,\n derived?: Path | null,\n): Path | null {\n if (node.kind !== 'container') return null;\n if (typeof node.clipFromPose === 'function') return node.clipFromPose(pose);\n return findShapeSilhouette(\n node as unknown as Node<unknown, string, TPose>,\n pose,\n { derivedPath: derived },\n );\n}\n\n/**\n * Collect every candidate the query hits, back-to-front — the last element is\n * the topmost, which is the order `pickTopMostHit` expects.\n */\nexport function pickWalk<TPose>(\n src: PickSource<TPose>,\n q: PickQuery<TPose>,\n): string[] {\n const includeContainers = q.includeContainers ?? true;\n const isLocked = q.includeLocked === true ? undefined : src.isLocked;\n const out: string[] = [];\n\n // Resolving a container's clip is the expensive half, so the *path* is memoized per\n // container for the walk. The predicate re-runs per candidate: caching its answer per\n // container would answer the wrong question for an area query.\n const clipPath = new Map<string, Path | null>();\n // A clip is in its container's plane; the query is in the candidate's.\n const carry = clipCarrier(src.planeOf ?? null);\n\n const clipOf = (ancestor: PickCandidate<TPose>): Path | null => {\n const cached = clipPath.get(ancestor.id);\n if (cached !== undefined) return cached;\n const resolved = ownClipOf(\n ancestor, src.poseOf(ancestor), src.derivedPathOf?.(ancestor),\n );\n clipPath.set(ancestor.id, resolved);\n return resolved;\n };\n\n const copyMaps = new Map<string, readonly Affine[]>();\n const copiesOf = (ancestor: PickCandidate<TPose>): readonly Affine[] => {\n let found = copyMaps.get(ancestor.id);\n if (found === undefined) {\n const fn = ancestor.kind === 'container' ? ancestor.copiesFromPose : undefined;\n const copies = fn ? fn(src.poseOf(ancestor), ancestor as never) ?? [] : [];\n found = copies.map(invert).filter((m): m is Affine => m !== null);\n copyMaps.set(ancestor.id, found);\n }\n return found;\n };\n\n // One reprojected query per plane per walk; `null` marks a plane this\n // query cannot reach.\n const planeQueries = new Map<string, PickQuery<TPose> | null>();\n const queryFor = (layer: string | undefined): PickQuery<TPose> | null => {\n if (layer === undefined || src.planeOf === undefined) return q;\n let found = planeQueries.get(layer);\n if (found === undefined) {\n const map = src.planeOf(layer);\n found = map === null ? q : (q.inPlane?.(map) ?? null);\n planeQueries.set(layer, found);\n }\n return found;\n };\n\n const order = src.order();\n const copying = order.some((n) => n.kind === 'container' && typeof n.copiesFromPose === 'function');\n for (const node of order) {\n if (!includeContainers && node.kind === 'container') continue;\n // Transparent to picking: the click belongs to whatever is behind it,\n // which for a label inside a box is the box.\n if (node.pickable === false) continue;\n if (node.layer !== undefined && src.layerIsPainted?.(node.layer) === false) continue;\n if (src.alphaOf !== undefined && src.alphaOf(node.id) <= 0) continue;\n if (isLocked !== undefined && isLocked(node)) continue;\n\n const query = queryFor(node.layer);\n if (query === null) continue;\n const pose = src.poseOf(node);\n const derived = src.derivedPathOf?.(node);\n if (!reaches(node, pose, derived, query, () => src.parentsOf(node), copying, { clipOf, copiesOf, carry })) continue;\n out.push(node.id);\n }\n\n return out;\n}\n\n/** Answers `Scene.isLocked` from the layer records and parent links alone,\n * so a partial scene stand-in works too. Null when nothing is locked, which\n * is what keeps the gate off the walk in the common case. */\nfunction lockedNodeTest(\n scene: Pick<Scene<unknown, string, unknown>, 'layers' | 'get'>,\n): ((id: string) => boolean) | null {\n let locked: Set<string> | null = null;\n for (const layer of scene.layers ?? []) {\n if (layer.locked === true) (locked ??= new Set()).add(layer.id);\n }\n if (locked === null) return null;\n const lockedLayers = locked;\n return (id) => {\n let cur = scene.get(asNodeId(id));\n const seen = new Set<string>();\n while (cur !== undefined && !seen.has(cur.id)) {\n if (lockedLayers.has(cur.layer)) return true;\n seen.add(cur.id);\n cur = cur.parent === null ? undefined : scene.get(cur.parent);\n }\n return false;\n };\n}\n\n/** Layer ids the scene reports as hidden. Only an explicit `false` hides a\n * layer: a partial scene stand-in that omits the flag stays pickable. */\nexport function hiddenLayerIds(\n layers: readonly { id: string; visible?: boolean }[] | undefined,\n): Set<string> {\n const out = new Set<string>();\n for (const layer of layers ?? []) {\n if (layer.visible === false) out.add(layer.id);\n }\n return out;\n}\n\n/**\n * The two answers a pick needs from the view it is asked for rather than from\n * the data behind it: how that view paints a node, and whether it paints a\n * layer at all. A scene and a bare adapter take the same pair.\n */\nexport interface ViewPickGates {\n /** Painted alpha: the view's `alphaFor` times any per-node override alpha.\n * A node painted at alpha 0 cannot be hit. */\n alphaOf?: (id: string) => number;\n /** Whether a node's `layer` reaches the screen in the asking view. */\n layerIsPainted?: (layer: string) => boolean;\n}\n\n/** The gates a bare adapter takes from its view, plus how that view's camera\n * maps into each parallax layer — see `scenePlaneOf`. */\nexport interface AdapterPickGates extends ViewPickGates {\n planeOf?: (layer: string) => PlaneMap | null;\n}\n\nexport interface ScenePickSourceOptions<TPose> extends ViewPickGates {\n /** Pose lookup, when the caller holds an adapter that already resolves\n * overrides. Defaults to `effectivePose` against the scene's own. */\n getPose?: (id: string) => TPose;\n /** The asking view's composed alpha — `alphaFor(id)` times override alpha.\n * Defaults to the override alpha alone, which is all a bare scene knows. */\n alphaOf?: (id: string) => number;\n /** The asking view's answer to \"does this scene layer reach the screen\",\n * which is `layerVisibility` and `layerOrder` on top of the scene's own\n * `visible` flag. Consulted after the scene's flag, never instead of it. */\n layerIsPainted?: (layer: string) => boolean;\n /** The asking view's camera. With it, a layer carrying `parallax` is picked\n * through its plane; without it, every layer is taken to move with the\n * camera. */\n camera?: View;\n}\n\nexport function scenePickSource<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n opts: ScenePickSourceOptions<TPose> = {},\n): PickSource<TPose> {\n const hidden = hiddenLayerIds(scene.layers);\n const locked = lockedNodeTest(scene as never);\n const { getPose, alphaOf, layerIsPainted } = opts;\n\n // Resolved once per walk rather than once per candidate. Needs enumeration — a\n // partial scene stand-in carrying only `read` falls back to reading per node.\n let faded: Set<string> | null = null;\n const enumerable = typeof scene.overrides?.ids === 'function';\n if (!alphaOf && enumerable) {\n for (const id of scene.overrides.ids()) {\n const a = scene.overrides.read(id)?.alpha;\n if (a !== undefined && a <= 0) (faded ??= new Set()).add(id);\n }\n }\n const readAlpha = alphaOf\n ?? (enumerable\n ? (faded ? (id: string) => (faded.has(id) ? 0 : 1) : undefined)\n : (id: string) => scene.overrides.read(asNodeId(id))?.alpha ?? 1);\n\n // A composing strategy makes a node's own pose local, so picking folds the\n // parent chain the same way the render walk does: one definition of both.\n const paintedPoseOf = scenePaintedPoseOf(scene);\n const poseOf = getPose\n ? (node: PickCandidate<TPose>) => getPose(node.id)\n : (node: PickCandidate<TPose>) => paintedPoseOf(node as never);\n\n // Through `poseOf`, not the document pose: a derived node has to be tested\n // where the renderer draws its dependencies, which is what an override says.\n const childrenOf = (id: NodeId): readonly NodeId[] => scene.childrenOf(id);\n const depOf = (id: NodeId): DerivedDep<TPose> | undefined => {\n const dep = scene.get(id);\n if (dep === undefined) return undefined;\n return {\n node: dep as Node<unknown, string, TPose>,\n pose: poseOf(dep as never),\n get path(): Path | null {\n return resolveDerivedPath(dep as never, depOf, childrenOf);\n },\n };\n };\n\n const sceneDerivedPath = getPose ? null : sceneDerivedPathOf(scene);\n const derivedPathOf = (node: PickCandidate<TPose>): Path | null => {\n const n = node as unknown as Node<TData, TLayer, TPose>;\n if (!sceneDerivedPath) return n.dependsOn === undefined ? null : resolveDerivedPath(n, depOf, childrenOf);\n return showsComputedPath(scene, n) ? sceneDerivedPath(n) : null;\n };\n\n const planeOf = opts.camera ? scenePlaneOf(scene.layers, opts.camera) : null;\n\n return {\n ...(planeOf ? { planeOf } : {}),\n order: () => scene.renderOrderNodes() as unknown as readonly PickCandidate<TPose>[],\n derivedPathOf,\n poseOf,\n parentsOf(node) {\n let parentId = (node as { parent?: string | null }).parent ?? null;\n if (parentId === null) return EMPTY_PARENTS;\n const chain: PickCandidate<TPose>[] = [];\n const seen = new Set<string>();\n while (parentId !== null) {\n if (seen.has(parentId)) break;\n seen.add(parentId);\n const parent = scene.get(asNodeId(parentId));\n if (!parent) break;\n chain.push(parent as unknown as PickCandidate<TPose>);\n parentId = parent.parent ?? null;\n }\n return chain;\n },\n // Absent entirely when nothing is faded, so the walk skips the gate.\n ...(readAlpha ? { alphaOf: readAlpha } : {}),\n ...(locked ? { isLocked: (node: PickCandidate<TPose>) => locked(node.id) } : {}),\n ...(hidden.size > 0 || layerIsPainted\n ? {\n layerIsPainted: (layer: string) =>\n !hidden.has(layer) && (layerIsPainted === undefined || layerIsPainted(layer)),\n }\n : {}),\n };\n}\n\n/** Each parallax layer's plane map under `camera`, or null when no layer is a\n * plane — which keeps the per-layer lookup off the walk entirely. */\nexport function scenePlaneOf(\n layers: readonly { id: string; parallax?: ParallaxOpts }[] | undefined,\n camera: View,\n): ((layer: string) => PlaneMap | null) | null {\n let maps: Map<string, PlaneMap> | null = null;\n for (const l of layers ?? []) {\n if (l.parallax) (maps ??= new Map()).set(l.id, planeMap(camera, l.parallax));\n }\n if (maps === null) return null;\n const found = maps;\n return (layer) => found.get(layer) ?? null;\n}\n\nexport { adapterPickSource } from './adapterPickSource';\n"],"mappings":"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"}
@@ -1,28 +1,27 @@
1
- import { mat3 as e } from "../renderer/math/mat3.js";
2
- import { planeMatrix as t, planeToPlane as n } from "../core/viewport/parallax.js";
3
- import { transformPath as r } from "@weasel-js/geom";
1
+ import { planeMatrix as e, planeToPlane as t } from "../core/viewport/parallax.js";
2
+ import { mat3 as n, transformPath as r } from "@weasel-js/geom";
4
3
  //#region src/canvas/planeClips.ts
5
- function i(e) {
6
- if (e === null) return (e) => e;
7
- let i = (t) => t === void 0 ? null : e(t), a = /* @__PURE__ */ new WeakMap();
8
- return (e, o, s) => {
9
- let c = i(s), l = n(i(o), c);
10
- if (l === null) return e;
11
- let u = a.get(e);
12
- u === void 0 && a.set(e, u = /* @__PURE__ */ new Map());
4
+ function i(n) {
5
+ if (n === null) return (e) => e;
6
+ let i = (e) => e === void 0 ? null : n(e), a = /* @__PURE__ */ new WeakMap();
7
+ return (n, o, s) => {
8
+ let c = i(s), l = t(i(o), c);
9
+ if (l === null) return n;
10
+ let u = a.get(n);
11
+ u === void 0 && a.set(n, u = /* @__PURE__ */ new Map());
13
12
  let d = u.get(c);
14
- return d === void 0 && u.set(c, d = r(e, t(l))), d;
13
+ return d === void 0 && u.set(c, d = r(n, e(l))), d;
15
14
  };
16
15
  }
17
16
  function a(r, i) {
18
- let a = n(r, i);
19
- return a === null ? void 0 : e.fromAffine(t(a));
17
+ let a = t(r, i);
18
+ return a === null ? void 0 : n.fromAffine(e(a));
20
19
  }
21
- function o(e, i) {
22
- let a = e;
23
- if (i === null || !a || a.kind !== "polygon" && a.kind !== "rect") return e;
24
- let o = n(i, null);
25
- return o === null ? e : r(e, t(o));
20
+ function o(n, i) {
21
+ let a = n;
22
+ if (i === null || !a || a.kind !== "polygon" && a.kind !== "rect") return n;
23
+ let o = t(i, null);
24
+ return o === null ? n : r(n, e(o));
26
25
  }
27
26
  //#endregion
28
27
  export { i as clipCarrier, o as pathFromPlane, a as planeTransform };
@@ -1 +1 @@
1
- {"version":3,"file":"planeClips.js","names":["clipCarrier","planeOf","clip","mapOf","layer","cache","to","toLayer","m","planeToPlane","fromLayer","byTarget","out","transformPath","planeMatrix","planeTransform","from","mat3","pathFromPlane","p","path","back"],"sources":["../../src/canvas/planeClips.ts"],"sourcesContent":["import { type Path, transformPath } from '@weasel-js/geom';\nimport { planeMatrix, planeToPlane, type PlaneMap } from 'core/viewport/parallax';\nimport { mat3, type GlMat3 } from '../renderer/math/mat3';\n\n/**\n * Carries a container's clip into the world a descendant is drawn or picked\n * in. A clip is built from the container's pose, so it is in the container's\n * plane; a child on another plane reads it in its own. Null `planeOf` means no\n * layer is a plane, and every clip passes through untouched.\n *\n * Memoized per clip path and target plane, so a container with many children\n * on one other plane maps its clip once.\n */\nexport function clipCarrier(\n planeOf: ((layer: string) => PlaneMap | null) | null,\n): (clip: Path, fromLayer: string | undefined, toLayer: string | undefined) => Path {\n if (planeOf === null) return (clip) => clip;\n const mapOf = (layer: string | undefined) => (layer === undefined ? null : planeOf(layer));\n const cache = new WeakMap<Path, Map<PlaneMap | null, Path>>();\n return (clip, fromLayer, toLayer) => {\n const to = mapOf(toLayer);\n const m = planeToPlane(mapOf(fromLayer), to);\n if (m === null) return clip;\n let byTarget = cache.get(clip);\n if (byTarget === undefined) cache.set(clip, byTarget = new Map());\n let out = byTarget.get(to);\n if (out === undefined) byTarget.set(to, out = transformPath(clip, planeMatrix(m)));\n return out;\n };\n}\n\n/** The group transform that draws `from`'s world inside `to`'s, where `null`\n * is the camera's. Undefined when they are the same world. */\nexport function planeTransform(from: PlaneMap | null, to: PlaneMap | null): GlMat3 | undefined {\n const m = planeToPlane(from, to);\n return m === null ? undefined : mat3.fromAffine(planeMatrix(m));\n}\n\n/** A path in a plane's world, in the camera's. Anything that is not a path\n * passes through. */\nexport function pathFromPlane<T>(path: T, m: PlaneMap | null): T {\n const p = path as { kind?: string } | null;\n if (m === null || !p || (p.kind !== 'polygon' && p.kind !== 'rect')) return path;\n const back = planeToPlane(m, null);\n return back === null ? path : transformPath(path as unknown as Path, planeMatrix(back)) as unknown as T;\n}\n"],"mappings":";;;;AAaA,SAAgBA,EACd,GACkF;CAClF,IAAIC,MAAY,MAAM,QAAQ,MAASC;CACvC,IAAMC,KAAS,MAA+BC,MAAU,KAAA,IAAY,OAAOH,EAAQG,CAAK,GAClFC,oBAAQ,IAAI,QAA0C;CAC5D,QAAQ,GAAM,GAAW,MAAY;EACnC,IAAMC,IAAKH,EAAMI,CAAO,GAClBC,IAAIC,EAAaN,EAAMO,CAAS,GAAGJ,CAAE;EAC3C,IAAIE,MAAM,MAAM,OAAON;EACvB,IAAIS,IAAWN,EAAM,IAAIH,CAAI;EAC7B,AAAIS,MAAa,KAAA,KAAWN,EAAM,IAAIH,GAAM,oBAAW,IAAI,IAAI,CAAC;EAChE,IAAIU,IAAMD,EAAS,IAAIL,CAAE;EAEzB,OADIM,MAAQ,KAAA,KAAWD,EAAS,IAAIL,GAAI,IAAMO,EAAcX,GAAMY,EAAYN,CAAC,CAAC,CAAC,GAC1EI;CACT;AACF;AAIA,SAAgBG,EAAe,GAAuB,GAAyC;CAC7F,IAAMP,IAAIC,EAAaO,GAAMV,CAAE;CAC/B,OAAOE,MAAM,OAAO,KAAA,IAAYS,EAAK,WAAWH,EAAYN,CAAC,CAAC;AAChE;AAIA,SAAgBU,EAAiB,GAAS,GAAuB;CAC/D,IAAMC,IAAIC;CACV,IAAIZ,MAAM,QAAQ,CAACW,KAAMA,EAAE,SAAS,aAAaA,EAAE,SAAS,QAAS,OAAOC;CAC5E,IAAMC,IAAOZ,EAAaD,GAAG,IAAI;CACjC,OAAOa,MAAS,OAAOD,IAAOP,EAAcO,GAAyBN,EAAYO,CAAI,CAAC;AACxF"}
1
+ {"version":3,"file":"planeClips.js","names":["clipCarrier","planeOf","clip","mapOf","layer","cache","to","toLayer","m","planeToPlane","fromLayer","byTarget","out","transformPath","planeMatrix","planeTransform","from","mat3","pathFromPlane","p","path","back"],"sources":["../../src/canvas/planeClips.ts"],"sourcesContent":["import { type Path, transformPath, mat3, type GlMat3 } from '@weasel-js/geom';\nimport { planeMatrix, planeToPlane, type PlaneMap } from 'core/viewport/parallax';\n\n/**\n * Carries a container's clip into the world a descendant is drawn or picked\n * in. A clip is built from the container's pose, so it is in the container's\n * plane; a child on another plane reads it in its own. Null `planeOf` means no\n * layer is a plane, and every clip passes through untouched.\n *\n * Memoized per clip path and target plane, so a container with many children\n * on one other plane maps its clip once.\n */\nexport function clipCarrier(\n planeOf: ((layer: string) => PlaneMap | null) | null,\n): (clip: Path, fromLayer: string | undefined, toLayer: string | undefined) => Path {\n if (planeOf === null) return (clip) => clip;\n const mapOf = (layer: string | undefined) => (layer === undefined ? null : planeOf(layer));\n const cache = new WeakMap<Path, Map<PlaneMap | null, Path>>();\n return (clip, fromLayer, toLayer) => {\n const to = mapOf(toLayer);\n const m = planeToPlane(mapOf(fromLayer), to);\n if (m === null) return clip;\n let byTarget = cache.get(clip);\n if (byTarget === undefined) cache.set(clip, byTarget = new Map());\n let out = byTarget.get(to);\n if (out === undefined) byTarget.set(to, out = transformPath(clip, planeMatrix(m)));\n return out;\n };\n}\n\n/** The group transform that draws `from`'s world inside `to`'s, where `null`\n * is the camera's. Undefined when they are the same world. */\nexport function planeTransform(from: PlaneMap | null, to: PlaneMap | null): GlMat3 | undefined {\n const m = planeToPlane(from, to);\n return m === null ? undefined : mat3.fromAffine(planeMatrix(m));\n}\n\n/** A path in a plane's world, in the camera's. Anything that is not a path\n * passes through. */\nexport function pathFromPlane<T>(path: T, m: PlaneMap | null): T {\n const p = path as { kind?: string } | null;\n if (m === null || !p || (p.kind !== 'polygon' && p.kind !== 'rect')) return path;\n const back = planeToPlane(m, null);\n return back === null ? path : transformPath(path as unknown as Path, planeMatrix(back)) as unknown as T;\n}\n"],"mappings":";;;AAYA,SAAgBA,EACd,GACkF;CAClF,IAAIC,MAAY,MAAM,QAAQ,MAASC;CACvC,IAAMC,KAAS,MAA+BC,MAAU,KAAA,IAAY,OAAOH,EAAQG,CAAK,GAClFC,oBAAQ,IAAI,QAA0C;CAC5D,QAAQ,GAAM,GAAW,MAAY;EACnC,IAAMC,IAAKH,EAAMI,CAAO,GAClBC,IAAIC,EAAaN,EAAMO,CAAS,GAAGJ,CAAE;EAC3C,IAAIE,MAAM,MAAM,OAAON;EACvB,IAAIS,IAAWN,EAAM,IAAIH,CAAI;EAC7B,AAAIS,MAAa,KAAA,KAAWN,EAAM,IAAIH,GAAM,oBAAW,IAAI,IAAI,CAAC;EAChE,IAAIU,IAAMD,EAAS,IAAIL,CAAE;EAEzB,OADIM,MAAQ,KAAA,KAAWD,EAAS,IAAIL,GAAI,IAAMO,EAAcX,GAAMY,EAAYN,CAAC,CAAC,CAAC,GAC1EI;CACT;AACF;AAIA,SAAgBG,EAAe,GAAuB,GAAyC;CAC7F,IAAMP,IAAIC,EAAaO,GAAMV,CAAE;CAC/B,OAAOE,MAAM,OAAO,KAAA,IAAYS,EAAK,WAAWH,EAAYN,CAAC,CAAC;AAChE;AAIA,SAAgBU,EAAiB,GAAS,GAAuB;CAC/D,IAAMC,IAAIC;CACV,IAAIZ,MAAM,QAAQ,CAACW,KAAMA,EAAE,SAAS,aAAaA,EAAE,SAAS,QAAS,OAAOC;CAC5E,IAAMC,IAAOZ,EAAaD,GAAG,IAAI;CACjC,OAAOa,MAAS,OAAOD,IAAOP,EAAcO,GAAyBN,EAAYO,CAAI,CAAC;AACxF"}
@@ -0,0 +1,41 @@
1
+ import { poseDescriptorForNode as e, translatePoseViaDescriptor as t } from "../core/geometry/poseDescriptor.js";
2
+ //#region src/canvas/poseCascade.ts
3
+ function n(e, t) {
4
+ let n = [], r = (t) => {
5
+ for (let i of e.childrenOf(t)) n.push(i), r(i);
6
+ };
7
+ return r(t), n;
8
+ }
9
+ function r(r, i, a, o) {
10
+ return {
11
+ write: o,
12
+ *beside(o) {
13
+ let s = r.get(i);
14
+ if (!s) return;
15
+ let c = e(a, s), l = c.getBounds(s.pose), u = c.getBounds(o);
16
+ for (let o of n(r, i)) {
17
+ let n = r.get(o);
18
+ n && (yield [o, t(n.pose, u.x - l.x, u.y - l.y, e(a, n))]);
19
+ }
20
+ }
21
+ };
22
+ }
23
+ function i(r, i) {
24
+ return (a, o) => {
25
+ let s = r.get(a);
26
+ if (!s || s.kind !== "container") return r.setPose(a, o);
27
+ let c = e(i, s), l = c.getBounds(s.pose), u = c.getBounds(o), d = u.x - l.x, f = u.y - l.y;
28
+ if (d === 0 && f === 0) return r.setPose(a, o);
29
+ r.batch("move container", () => {
30
+ r.setPose(a, o);
31
+ for (let o of n(r, a)) {
32
+ let n = r.get(o);
33
+ n && r.setPose(o, t(n.pose, d, f, e(i, n)));
34
+ }
35
+ });
36
+ };
37
+ }
38
+ //#endregion
39
+ export { i as cascadingSetPose, r as containerCascade, n as descendantsOf };
40
+
41
+ //# sourceMappingURL=poseCascade.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poseCascade.js","names":["descendantsOf","out","collect","child","scene","root","id","containerCascade","node","g","poseDescriptorForNode","d","from","to","pose","translatePoseViaDescriptor","cascadingSetPose","dx","dy"],"sources":["../../src/canvas/poseCascade.ts"],"sourcesContent":["import { poseDescriptorForNode, translatePoseViaDescriptor, type PoseDescriptor } from 'core/geometry/poseDescriptor';\nimport type { NodeId } from 'core/scene/types';\nimport type { PoseCascade } from '../animation/poseTarget';\n\n/** The part of a scene a container's cascade reads. */\ninterface CascadeScene<TPose> {\n get(id: NodeId): { pose: TPose; kind?: 'leaf' | 'container' } | undefined;\n childrenOf(id: NodeId): readonly NodeId[];\n}\n\n/** The part of a scene a cascading `setPose` writes. */\ninterface CascadeTarget<TPose> extends CascadeScene<TPose> {\n setPose(id: NodeId, pose: TPose): void;\n batch<T>(label: string, fn: () => T): T;\n}\n\n/** Every node under `id`, each after its parent. */\nexport function descendantsOf(scene: Pick<CascadeScene<unknown>, 'childrenOf'>, id: NodeId): NodeId[] {\n const out: NodeId[] = [];\n const collect = (root: NodeId): void => {\n for (const child of scene.childrenOf(root)) {\n out.push(child);\n collect(child);\n }\n };\n collect(id);\n return out;\n}\n\n/**\n * How container `id`'s pose target carries its descendants where each holds a pose of its own\n * in the same space: `write` commits a pose and moves them, and while the container shows\n * somewhere else each is shown moved by as much.\n */\nexport function containerCascade<TPose>(\n scene: CascadeScene<TPose>,\n id: NodeId,\n d: PoseDescriptor<TPose>,\n write: (pose: TPose) => void,\n): PoseCascade<TPose> {\n return {\n write,\n *beside(pose) {\n const node = scene.get(id);\n if (!node) return;\n const g = poseDescriptorForNode(d, node);\n const from = g.getBounds(node.pose);\n const to = g.getBounds(pose);\n for (const child of descendantsOf(scene, id)) {\n const n = scene.get(child);\n if (!n) continue;\n yield [child, translatePoseViaDescriptor(n.pose, to.x - from.x, to.y - from.y, poseDescriptorForNode(d, n))];\n }\n },\n };\n}\n\n/**\n * `setPose` for a scene of absolute poses: posing a container moves every\n * descendant by as much, in one undo step.\n */\nexport function cascadingSetPose<TPose>(\n scene: CascadeTarget<TPose>,\n d: PoseDescriptor<TPose>,\n): (id: NodeId, pose: TPose) => void {\n return (id, pose) => {\n const node = scene.get(id);\n if (!node || node.kind !== 'container') return scene.setPose(id, pose);\n const g = poseDescriptorForNode(d, node);\n const from = g.getBounds(node.pose);\n const to = g.getBounds(pose);\n const dx = to.x - from.x;\n const dy = to.y - from.y;\n if (dx === 0 && dy === 0) return scene.setPose(id, pose);\n scene.batch('move container', () => {\n scene.setPose(id, pose);\n for (const child of descendantsOf(scene, id)) {\n const n = scene.get(child);\n if (!n) continue;\n scene.setPose(child, translatePoseViaDescriptor(n.pose, dx, dy, poseDescriptorForNode(d, n)));\n }\n });\n };\n}\n"],"mappings":";;AAiBA,SAAgBA,EAAc,GAAkD,GAAsB;CACpG,IAAMC,IAAgB,CAAC,GACjBC,KAAW,MAAuB;EACtC,KAAK,IAAMC,KAASC,EAAM,WAAWC,CAAI,GAEvC,AADAJ,EAAI,KAAKE,CAAK,GACdD,EAAQC,CAAK;CAEjB;CAEA,OADAD,EAAQI,CAAE,GACHL;AACT;AAOA,SAAgBM,EACd,GACA,GACA,GACA,GACoB;CACpB,OAAO;EACL;EACA,CAAC,OAAO,GAAM;GACZ,IAAMC,IAAOJ,EAAM,IAAIE,CAAE;GACzB,IAAI,CAACE,GAAM;GACX,IAAMC,IAAIC,EAAsBC,GAAGH,CAAI,GACjCI,IAAOH,EAAE,UAAUD,EAAK,IAAI,GAC5BK,IAAKJ,EAAE,UAAUK,CAAI;GAC3B,KAAK,IAAMX,KAASH,EAAcI,GAAOE,CAAE,GAAG;IAC5C,IAAM,IAAIF,EAAM,IAAID,CAAK;IACzB,AAAK,MACL,MAAM,CAACA,GAAOY,EAA2B,EAAE,MAAMF,EAAG,IAAID,EAAK,GAAGC,EAAG,IAAID,EAAK,GAAGF,EAAsBC,GAAG,CAAC,CAAC,CAAC;GAC7G;EACF;CACF;AACF;AAMA,SAAgBK,EACd,GACA,GACmC;CACnC,QAAQ,GAAI,MAAS;EACnB,IAAMR,IAAOJ,EAAM,IAAIE,CAAE;EACzB,IAAI,CAACE,KAAQA,EAAK,SAAS,aAAa,OAAOJ,EAAM,QAAQE,GAAIQ,CAAI;EACrE,IAAML,IAAIC,EAAsBC,GAAGH,CAAI,GACjCI,IAAOH,EAAE,UAAUD,EAAK,IAAI,GAC5BK,IAAKJ,EAAE,UAAUK,CAAI,GACrBG,IAAKJ,EAAG,IAAID,EAAK,GACjBM,IAAKL,EAAG,IAAID,EAAK;EACvB,IAAIK,MAAO,KAAKC,MAAO,GAAG,OAAOd,EAAM,QAAQE,GAAIQ,CAAI;EACvD,EAAM,MAAM,wBAAwB;GAClC,EAAM,QAAQR,GAAIQ,CAAI;GACtB,KAAK,IAAMX,KAASH,EAAcI,GAAOE,CAAE,GAAG;IAC5C,IAAM,IAAIF,EAAM,IAAID,CAAK;IACzB,AAAK,KACLC,EAAM,QAAQD,GAAOY,EAA2B,EAAE,MAAME,GAAIC,GAAIR,EAAsBC,GAAG,CAAC,CAAC,CAAC;GAC9F;EACF,CAAC;CACH;AACF"}
@@ -1,6 +1,4 @@
1
- import { mat3 as e } from "../renderer/math/mat3.js";
2
- import { poseFrameOf as t } from "../core/geometry/poseFrame.js";
3
- import { rotateAboutPoint as n } from "@weasel-js/geom";
1
+ import { mat3 as e, poseFrameOf as t, rotateAboutPoint as n } from "@weasel-js/geom";
4
2
  //#region src/canvas/poseRotation.ts
5
3
  function r(t, r, i) {
6
4
  return e.fromAffine(n(t, r, i));
@@ -1 +1 @@
1
- {"version":3,"file":"poseRotation.js","names":["rotationMatrixAbout","mat3","rotateAboutPoint","cx","cy","rotation","rotateAroundAABBCenter","x","width","y","height","wrapWithPoseRotation","cmds","frame","poseFrameOf","pose"],"sources":["../../src/canvas/poseRotation.ts"],"sourcesContent":["/**\n * Pose rotation helpers — extracted from `SceneCanvas` so the kit can apply\n * the auto-rotation wrap around EVERY per-node `drawOne` (consumer-supplied\n * or default), not only around the default painter's output.\n *\n * Without this, consumers who supply a custom `drawOne` get no rotation\n * visualization even though selection chrome (which reads `pose.rotation`\n * directly) does rotate — the rect sits still while its chrome spins.\n *\n * `wrapWithPoseRotation` is applied by `wrapNodeOutput` in both scene walks —\n * `buildSceneLayer` (main canvas) and `buildSceneViewCommands` (detached\n * renders) — and directly by `usePreviewGhostLayer.buildSubtree` (in-flight\n * preview), so every code path produces rotated geometry uniformly.\n */\nimport type { DrawCommand } from '../renderer';\nimport { poseFrameOf } from 'core/geometry/poseFrame';\nimport { rotateAboutPoint } from '@weasel-js/geom';\nimport { mat3, type GlMat3 } from '../renderer/math/mat3';\n\n/** Rotation by `rotation` about `(cx, cy)` as the render-tree's column-major\n * 3×3 affine. Composes on the kernel's `rotateAboutPoint` (single owner of the\n * rotate-about-point math); this only reshapes 6→9 for the WebGL upload. */\nexport function rotationMatrixAbout(cx: number, cy: number, rotation: number): GlMat3 {\n return mat3.fromAffine(rotateAboutPoint(cx, cy, rotation));\n}\n\n/** Rotation matrix about the AABB center of `(x, y, width, height)`. The pivot\n * matches `poseRotationOf` (the shared rotation convention). */\nexport function rotateAroundAABBCenter(\n x: number, y: number, width: number, height: number, rotation: number,\n): GlMat3 {\n return rotationMatrixAbout(x + width / 2, y + height / 2, rotation);\n}\n\n/** Wrap a per-node draw-command list in a group carrying the pose's frame\n * (`poseFrameOf`): its `rotation`, its `transform`, or both, about the AABB\n * center, matching the rotation-handle math, `pathInWorld`, and picking so\n * chrome and geometry stay aligned.\n *\n * No-ops when `cmds` is empty, when the pose has neither field, or when any\n * of the AABB fields are missing (the wrap requires a center to turn about).\n * Painters / consumers that need different semantics (e.g. pivot at origin)\n * should still wrap themselves. */\nexport function wrapWithPoseRotation(\n cmds: DrawCommand[],\n pose: unknown,\n): DrawCommand[] {\n if (cmds.length === 0) return cmds;\n const frame = poseFrameOf(pose);\n if (!frame) return cmds;\n return [{ kind: 'group', transform: mat3.fromAffine(frame), children: cmds }];\n}\n"],"mappings":";;;;AAsBA,SAAgBA,EAAoB,GAAY,GAAY,GAA0B;CACpF,OAAOC,EAAK,WAAWC,EAAiBC,GAAIC,GAAIC,CAAQ,CAAC;AAC3D;AAIA,SAAgBC,EACd,GAAW,GAAW,GAAe,GAAgB,GAC7C;CACR,OAAON,EAAoBO,IAAIC,IAAQ,GAAGC,IAAIC,IAAS,GAAGL,CAAQ;AACpE;AAWA,SAAgBM,EACd,GACA,GACe;CACf,IAAIC,EAAK,WAAW,GAAG,OAAOA;CAC9B,IAAMC,IAAQC,EAAYC,CAAI;CAE9B,OADKF,IACE,CAAC;EAAE,MAAM;EAAS,WAAWZ,EAAK,WAAWY,CAAK;EAAG,UAAUD;CAAK,CAAC,IADzDA;AAErB"}
1
+ {"version":3,"file":"poseRotation.js","names":["rotationMatrixAbout","mat3","rotateAboutPoint","cx","cy","rotation","rotateAroundAABBCenter","x","width","y","height","wrapWithPoseRotation","cmds","frame","poseFrameOf","pose"],"sources":["../../src/canvas/poseRotation.ts"],"sourcesContent":["/**\n * Pose rotation helpers. The kit applies the rotation wrap around EVERY\n * per-node `drawOne` (consumer-supplied or default), so a custom painter's\n * output turns with its selection chrome.\n */\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { poseFrameOf } from '@weasel-js/geom';\nimport { rotateAboutPoint, mat3, type GlMat3 } from '@weasel-js/geom';\n\n/** Rotation by `rotation` about `(cx, cy)` as the render-tree's column-major\n * 3×3 affine. */\nexport function rotationMatrixAbout(cx: number, cy: number, rotation: number): GlMat3 {\n return mat3.fromAffine(rotateAboutPoint(cx, cy, rotation));\n}\n\n/** Rotation matrix about the AABB center of `(x, y, width, height)`. The pivot\n * matches `poseRotationOf` (the shared rotation convention). */\nexport function rotateAroundAABBCenter(\n x: number, y: number, width: number, height: number, rotation: number,\n): GlMat3 {\n return rotationMatrixAbout(x + width / 2, y + height / 2, rotation);\n}\n\n/** Wrap a per-node draw-command list in a group carrying the pose's frame\n * (`poseFrameOf`): its `rotation`, its `transform`, or both, about the AABB\n * center. No-ops when `cmds` is empty, when the pose has neither field, or\n * when any of the AABB fields are missing. */\nexport function wrapWithPoseRotation(\n cmds: DrawCommand[],\n pose: unknown,\n): DrawCommand[] {\n if (cmds.length === 0) return cmds;\n const frame = poseFrameOf(pose);\n if (!frame) return cmds;\n return [{ kind: 'group', transform: mat3.fromAffine(frame), children: cmds }];\n}\n"],"mappings":";;AAWA,SAAgBA,EAAoB,GAAY,GAAY,GAA0B;CACpF,OAAOC,EAAK,WAAWC,EAAiBC,GAAIC,GAAIC,CAAQ,CAAC;AAC3D;AAIA,SAAgBC,EACd,GAAW,GAAW,GAAe,GAAgB,GAC7C;CACR,OAAON,EAAoBO,IAAIC,IAAQ,GAAGC,IAAIC,IAAS,GAAGL,CAAQ;AACpE;AAMA,SAAgBM,EACd,GACA,GACe;CACf,IAAIC,EAAK,WAAW,GAAG,OAAOA;CAC9B,IAAMC,IAAQC,EAAYC,CAAI;CAE9B,OADKF,IACE,CAAC;EAAE,MAAM;EAAS,WAAWZ,EAAK,WAAWY,CAAK;EAAG,UAAUD;CAAK,CAAC,IADzDA;AAErB"}
@@ -0,0 +1,22 @@
1
+ //#region src/canvas/rasterReadback.ts
2
+ function e(e, r, i) {
3
+ let a = t(e, r, i);
4
+ return n(a), a;
5
+ }
6
+ function t(e, t, n) {
7
+ let r = t * 4, i = new Uint8ClampedArray(e.length);
8
+ for (let t = 0; t < n; t++) i.set(e.subarray((n - 1 - t) * r, (n - t) * r), t * r);
9
+ return i;
10
+ }
11
+ function n(e) {
12
+ for (let t = 0; t < e.length; t += 4) {
13
+ let n = e[t + 3];
14
+ if (n === 0 || n === 255) continue;
15
+ let r = 255 / n;
16
+ e[t] = e[t] * r, e[t + 1] = e[t + 1] * r, e[t + 2] = e[t + 2] * r;
17
+ }
18
+ }
19
+ //#endregion
20
+ export { e as straightTopDown };
21
+
22
+ //# sourceMappingURL=rasterReadback.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rasterReadback.js","names":["straightTopDown","data","flipRows","raw","width","height","unpremultiply","rowBytes","out","y","i","a","inv"],"sources":["../../src/canvas/rasterReadback.ts"],"sourcesContent":["/** A GL readback (bottom-up, premultiplied RGBA) as image bytes: top-down\n * rows of straight RGBA. */\nexport function straightTopDown(raw: Uint8Array, width: number, height: number): Uint8ClampedArray {\n const data = flipRows(raw, width, height);\n unpremultiply(data);\n return data;\n}\n\n/** Flip GL's bottom-up readback rows into top-down image order. */\nfunction flipRows(raw: Uint8Array, width: number, height: number): Uint8ClampedArray {\n const rowBytes = width * 4;\n const out = new Uint8ClampedArray(raw.length);\n for (let y = 0; y < height; y++) {\n out.set(raw.subarray((height - 1 - y) * rowBytes, (height - y) * rowBytes), y * rowBytes);\n }\n return out;\n}\n\n/** Convert premultiplied RGBA to straight RGBA in place. */\nfunction unpremultiply(data: Uint8ClampedArray): void {\n for (let i = 0; i < data.length; i += 4) {\n const a = data[i + 3];\n if (a === 0 || a === 255) continue;\n const inv = 255 / a;\n data[i] = data[i] * inv;\n data[i + 1] = data[i + 1] * inv;\n data[i + 2] = data[i + 2] * inv;\n }\n}\n"],"mappings":";AAEA,SAAgBA,EAAgB,GAAiB,GAAe,GAAmC;CACjG,IAAMC,IAAOC,EAASC,GAAKC,GAAOC,CAAM;CAExC,OADAC,EAAcL,CAAI,GACXA;AACT;AAGA,SAASC,EAAS,GAAiB,GAAe,GAAmC;CACnF,IAAMK,IAAWH,IAAQ,GACnBI,IAAM,IAAI,kBAAkBL,EAAI,MAAM;CAC5C,KAAK,IAAIM,IAAI,GAAGA,IAAIJ,GAAQ,KAC1B,EAAI,IAAIF,EAAI,UAAUE,IAAS,IAAII,KAAKF,IAAWF,IAASI,KAAKF,CAAQ,GAAGE,IAAIF,CAAQ;CAE1F,OAAOC;AACT;AAGA,SAASF,EAAc,GAA+B;CACpD,KAAK,IAAII,IAAI,GAAGA,IAAIT,EAAK,QAAQ,KAAK,GAAG;EACvC,IAAMU,IAAIV,EAAKS,IAAI;EACnB,IAAIC,MAAM,KAAKA,MAAM,KAAK;EAC1B,IAAMC,IAAM,MAAMD;EAGlB,AAFA,EAAKD,KAAKT,EAAKS,KAAKE,GACpB,EAAKF,IAAI,KAAKT,EAAKS,IAAI,KAAKE,GAC5B,EAAKF,IAAI,KAAKT,EAAKS,IAAI,KAAKE;CAC9B;AACF"}
@@ -1,19 +1,19 @@
1
- import { mat3 as e } from "../renderer/math/mat3.js";
2
- import { renderSceneToPixels as t } from "./renderSceneToPixels.js";
3
- import { buildDebugOverlayCommands as n } from "../debug/createDebugOverlayLayer.js";
1
+ import { renderSceneToPixels as e } from "./renderSceneToPixels.js";
2
+ import { buildDebugOverlayCommands as t } from "../debug/createDebugOverlayLayer.js";
3
+ import { mat3 as n } from "@weasel-js/geom";
4
4
  //#region src/canvas/renderDebugSnapshot.ts
5
- function r(e) {
6
- return t(i(e));
5
+ function r(t) {
6
+ return e(i(t));
7
7
  }
8
- function i(t) {
9
- let { view: r, size: i, debug: a, config: o, pixelRatio: s = 1, ...c } = t, l = n(a, o, r, i);
8
+ function i(e) {
9
+ let { view: r, size: i, debug: a, config: o, pixelRatio: s = 1, ...c } = e, l = t(a, o, r, i), u = i.width / Math.abs(r.scale.x), d = i.height / Math.abs(r.scale.y);
10
10
  return {
11
11
  ...c,
12
12
  sourceRect: {
13
- x: r.x,
14
- y: r.y,
15
- width: i.width / r.scale.x,
16
- height: i.height / r.scale.y
13
+ x: r.scale.x < 0 ? r.x - u : r.x,
14
+ y: r.scale.y < 0 ? r.y - d : r.y,
15
+ width: u,
16
+ height: d
17
17
  },
18
18
  scale: {
19
19
  x: r.scale.x * s,
@@ -21,7 +21,7 @@ function i(t) {
21
21
  },
22
22
  overlay: s === 1 ? l : [{
23
23
  kind: "group",
24
- transform: e.scaled(e.identity(), s, s),
24
+ transform: n.scaled(n.identity(), s, s),
25
25
  children: l
26
26
  }]
27
27
  };
@@ -1 +1 @@
1
- {"version":3,"file":"renderDebugSnapshot.js","names":["renderDebugSnapshot","renderSceneToPixels","debugSnapshotArgs","args","rest","overlay","buildDebugOverlayCommands","debug","config","view","size","pixelRatio","mat3"],"sources":["../../src/canvas/renderDebugSnapshot.ts"],"sourcesContent":["/**\n * `renderDebugSnapshot` — the canvas as its debug overlay showed it, scene and\n * overlay in one raster, for attaching to a bug report.\n */\nimport { renderSceneToPixels, type RasterImage, type RenderSceneToPixelsArgs } from './renderSceneToPixels';\nimport { buildDebugOverlayCommands } from '../debug/createDebugOverlayLayer';\nimport type { DebugConfig, DebugSnapshot } from '../debug/types';\nimport type { View } from '../core/viewport/view';\nimport { mat3 } from '../renderer/math/mat3';\n\n/** The canvas to reproduce — its camera, its size, and what its debug overlay\n * had recorded — plus how to rasterize the scene under it. */\nexport interface RenderDebugSnapshotArgs<TData, TLayer extends string, TPose>\n extends Omit<RenderSceneToPixelsArgs<TData, TLayer, TPose>, 'sourceRect' | 'scale' | 'overlay'> {\n /** The camera the canvas was looking through. */\n view: View;\n /** The canvas's size in CSS pixels. */\n size: { width: number; height: number };\n /** Output pixels per CSS pixel. Default 1; pass `devicePixelRatio` for what\n * the screen showed. */\n pixelRatio?: number;\n /** What the overlay draws — a canvas's `getDebug()?.snapshot()`. */\n debug: DebugSnapshot;\n /** Which overlay features to draw, as on `<Canvas debug>`. The frame panel\n * shows the recorded paint cost but no rate: a still image has no frames. */\n config: DebugConfig;\n}\n\n/**\n * Rasterize the scene through `view` at `size` and paint the debug overlay\n * over it, the way the canvas composed them. Built on `renderSceneToPixels`,\n * so the scene pixels are the screen's pixels at that resolution, and\n * synchronous like it: `await warmRender({ render: debugSnapshotArgs(args) })`\n * first. Encode the result with `rasterToPng` to attach it somewhere.\n */\nexport function renderDebugSnapshot<TData, TLayer extends string, TPose>(\n args: RenderDebugSnapshotArgs<TData, TLayer, TPose>,\n): RasterImage {\n return renderSceneToPixels(debugSnapshotArgs(args));\n}\n\n/** What {@link renderDebugSnapshot} hands `renderSceneToPixels`: the source\n * rect and scale that reproduce the canvas, with the overlay composed on top. */\nexport function debugSnapshotArgs<TData, TLayer extends string, TPose>(\n args: RenderDebugSnapshotArgs<TData, TLayer, TPose>,\n): RenderSceneToPixelsArgs<TData, TLayer, TPose> {\n const { view, size, debug, config, pixelRatio = 1, ...rest } = args;\n const overlay = buildDebugOverlayCommands(debug, config, view, size);\n return {\n ...rest,\n sourceRect: { x: view.x, y: view.y, width: size.width / view.scale.x, height: size.height / view.scale.y },\n scale: { x: view.scale.x * pixelRatio, y: view.scale.y * pixelRatio },\n overlay: pixelRatio === 1\n ? overlay\n : [{ kind: 'group', transform: mat3.scaled(mat3.identity(), pixelRatio, pixelRatio), children: overlay }],\n };\n}\n"],"mappings":";;;;AAmCA,SAAgBA,EACd,GACa;CACb,OAAOC,EAAoBC,EAAkBC,CAAI,CAAC;AACpD;AAIA,SAAgBD,EACd,GAC+C;CAC/C,IAAM,EAAE,SAAM,SAAM,UAAO,WAAQ,gBAAa,GAAG,GAAGE,MAASD,GACzDE,IAAUC,EAA0BC,GAAOC,GAAQC,GAAMC,CAAI;CACnE,OAAO;EACL,GAAGN;EACH,YAAY;GAAE,GAAGK,EAAK;GAAG,GAAGA,EAAK;GAAG,OAAOC,EAAK,QAAQD,EAAK,MAAM;GAAG,QAAQC,EAAK,SAASD,EAAK,MAAM;EAAE;EACzG,OAAO;GAAE,GAAGA,EAAK,MAAM,IAAIE;GAAY,GAAGF,EAAK,MAAM,IAAIE;EAAW;EACpE,SAASA,MAAe,IACpBN,IACA,CAAC;GAAE,MAAM;GAAS,WAAWO,EAAK,OAAOA,EAAK,SAAS,GAAGD,GAAYA,CAAU;GAAG,UAAUN;EAAQ,CAAC;CAC5G;AACF"}
1
+ {"version":3,"file":"renderDebugSnapshot.js","names":["renderDebugSnapshot","renderSceneToPixels","debugSnapshotArgs","args","rest","overlay","buildDebugOverlayCommands","debug","config","view","size","width","height","pixelRatio","mat3"],"sources":["../../src/canvas/renderDebugSnapshot.ts"],"sourcesContent":["/**\n * `renderDebugSnapshot` — the canvas as its debug overlay showed it, scene and\n * overlay in one raster, for attaching to a bug report.\n */\nimport { renderSceneToPixels, type RasterImage, type RenderSceneToPixelsArgs } from './renderSceneToPixels';\nimport { buildDebugOverlayCommands } from '../debug/createDebugOverlayLayer';\nimport type { DebugConfig, DebugSnapshot } from '../debug/types';\nimport type { View } from '../core/viewport/view';\nimport { mat3 } from '@weasel-js/geom';\n\n/** The canvas to reproduce — its camera, its size, and what its debug overlay\n * had recorded — plus how to rasterize the scene under it. */\nexport interface RenderDebugSnapshotArgs<TData, TLayer extends string, TPose>\n extends Omit<RenderSceneToPixelsArgs<TData, TLayer, TPose>, 'sourceRect' | 'scale' | 'overlay'> {\n /** The camera the canvas was looking through. */\n view: View;\n /** The canvas's size in CSS pixels. */\n size: { width: number; height: number };\n /** Output pixels per CSS pixel. Default 1; pass `devicePixelRatio` for what\n * the screen showed. */\n pixelRatio?: number;\n /** What the overlay draws — a canvas's `getDebug()?.snapshot()`. */\n debug: DebugSnapshot;\n /** Which overlay features to draw, as on `<Canvas debug>`. The frame panel\n * shows the recorded paint cost but no rate: a still image has no frames. */\n config: DebugConfig;\n}\n\n/**\n * Rasterize the scene through `view` at `size` and paint the debug overlay\n * over it, the way the canvas composed them. Built on `renderSceneToPixels`,\n * so the scene pixels are the screen's pixels at that resolution, and\n * synchronous like it: `await warmRender({ render: debugSnapshotArgs(args) })`\n * first. Encode the result with `rasterToPng` to attach it somewhere.\n */\nexport function renderDebugSnapshot<TData, TLayer extends string, TPose>(\n args: RenderDebugSnapshotArgs<TData, TLayer, TPose>,\n): RasterImage {\n return renderSceneToPixels(debugSnapshotArgs(args));\n}\n\n/** What {@link renderDebugSnapshot} hands `renderSceneToPixels`: the source\n * rect and scale that reproduce the canvas, with the overlay composed on top. */\nexport function debugSnapshotArgs<TData, TLayer extends string, TPose>(\n args: RenderDebugSnapshotArgs<TData, TLayer, TPose>,\n): RenderSceneToPixelsArgs<TData, TLayer, TPose> {\n const { view, size, debug, config, pixelRatio = 1, ...rest } = args;\n const overlay = buildDebugOverlayCommands(debug, config, view, size);\n const width = size.width / Math.abs(view.scale.x);\n const height = size.height / Math.abs(view.scale.y);\n return {\n ...rest,\n sourceRect: {\n x: view.scale.x < 0 ? view.x - width : view.x,\n y: view.scale.y < 0 ? view.y - height : view.y,\n width,\n height,\n },\n scale: { x: view.scale.x * pixelRatio, y: view.scale.y * pixelRatio },\n overlay: pixelRatio === 1\n ? overlay\n : [{ kind: 'group', transform: mat3.scaled(mat3.identity(), pixelRatio, pixelRatio), children: overlay }],\n };\n}\n"],"mappings":";;;;AAmCA,SAAgBA,EACd,GACa;CACb,OAAOC,EAAoBC,EAAkBC,CAAI,CAAC;AACpD;AAIA,SAAgBD,EACd,GAC+C;CAC/C,IAAM,EAAE,SAAM,SAAM,UAAO,WAAQ,gBAAa,GAAG,GAAGE,MAASD,GACzDE,IAAUC,EAA0BC,GAAOC,GAAQC,GAAMC,CAAI,GAC7DC,IAAQD,EAAK,QAAQ,KAAK,IAAID,EAAK,MAAM,CAAC,GAC1CG,IAASF,EAAK,SAAS,KAAK,IAAID,EAAK,MAAM,CAAC;CAClD,OAAO;EACL,GAAGL;EACH,YAAY;GACV,GAAGK,EAAK,MAAM,IAAI,IAAIA,EAAK,IAAIE,IAAQF,EAAK;GAC5C,GAAGA,EAAK,MAAM,IAAI,IAAIA,EAAK,IAAIG,IAASH,EAAK;GAC7C;GACA;EACF;EACA,OAAO;GAAE,GAAGA,EAAK,MAAM,IAAII;GAAY,GAAGJ,EAAK,MAAM,IAAII;EAAW;EACpE,SAASA,MAAe,IACpBR,IACA,CAAC;GAAE,MAAM;GAAS,WAAWS,EAAK,OAAOA,EAAK,SAAS,GAAGD,GAAYA,CAAU;GAAG,UAAUR;EAAQ,CAAC;CAC5G;AACF"}
@@ -1,17 +1,17 @@
1
1
  //#region src/canvas/renderNeeds.ts
2
2
  function e(e) {
3
3
  let t = /* @__PURE__ */ new Map(), n = /* @__PURE__ */ new Set(), r = (e) => {
4
- e && n.add(e.fill ?? "solid");
4
+ e && n.add(e.kind ?? "solid");
5
5
  }, i = (e) => {
6
6
  for (let n of e) if (n.kind === "group") i(n.children);
7
- else if (n.kind === "path") r(n.fill), r(n.stroke?.paint);
7
+ else if (n.kind === "path") r(n.fill?.paint), r(n.stroke?.paint);
8
8
  else if (n.kind === "text") for (let e of n.runs) {
9
9
  let n = `${e.fontFamily}|${e.fontWeight}|${e.fontStyle}`;
10
10
  t.has(n) || t.set(n, {
11
11
  family: e.fontFamily,
12
12
  weight: e.fontWeight,
13
13
  style: e.fontStyle
14
- }), r(e.fill), r(e.stroke?.paint);
14
+ }), r(e.fill?.paint), r(e.stroke?.paint);
15
15
  }
16
16
  };
17
17
  return i(e), {
@@ -1 +1 @@
1
- {"version":3,"file":"renderNeeds.js","names":["renderNeeds","fonts","kinds","paint","p","walk","c","list","r","key","commands"],"sources":["../../src/canvas/renderNeeds.ts"],"sourcesContent":["import type { FillStyle } from '@weasel-js/paint';\nimport type { FontRequest } from '@weasel-js/font';\nimport type { DrawCommand } from '../renderer/DrawCommand';\n\n/** What drawing a command list loads on demand: the faces its text is set in\n * and the paint kinds its fills and strokes name. */\nexport interface RenderNeeds {\n /** Each `(family, weight, style)` a text run is set in, once, in the order\n * met. */\n fonts: FontRequest[];\n /** Each paint kind a fill or stroke names, once, in the order met —\n * registered ones included. */\n paintKinds: string[];\n}\n\n/**\n * The fonts and paint kinds `commands` draw with, read off the commands\n * themselves: text runs, path fills and strokes, run fills and strokes, and\n * everything under a group. What `warmRender({ render })` loads, and nothing\n * more. Images, sprites and shaders load nothing on demand, so they add\n * nothing.\n */\nexport function renderNeeds(commands: readonly DrawCommand[]): RenderNeeds {\n const fonts = new Map<string, FontRequest>();\n const kinds = new Set<string>();\n const paint = (p: FillStyle | null | undefined) => {\n if (p) kinds.add(p.fill ?? 'solid');\n };\n const walk = (list: readonly DrawCommand[]) => {\n for (const c of list) {\n if (c.kind === 'group') walk(c.children);\n else if (c.kind === 'path') {\n paint(c.fill);\n paint(c.stroke?.paint);\n } else if (c.kind === 'text') {\n for (const r of c.runs) {\n const key = `${r.fontFamily}|${r.fontWeight}|${r.fontStyle}`;\n if (!fonts.has(key)) fonts.set(key, { family: r.fontFamily, weight: r.fontWeight, style: r.fontStyle });\n paint(r.fill);\n paint(r.stroke?.paint);\n }\n }\n }\n };\n walk(commands);\n return { fonts: [...fonts.values()], paintKinds: [...kinds] };\n}\n"],"mappings":";AAsBA,SAAgBA,EAAY,GAA+C;CACzE,IAAMC,oBAAQ,IAAI,IAAyB,GACrCC,oBAAQ,IAAI,IAAY,GACxBC,KAAS,MAAoC;EACjD,AAAIC,KAAGF,EAAM,IAAIE,EAAE,QAAQ,OAAO;CACpC,GACMC,KAAQ,MAAiC;EAC7C,KAAK,IAAMC,KAAKC,GACd,IAAID,EAAE,SAAS,SAAS,EAAKA,EAAE,QAAQ;OAClC,IAAIA,EAAE,SAAS,QAElB,AADAH,EAAMG,EAAE,IAAI,GACZH,EAAMG,EAAE,QAAQ,KAAK;OAChB,IAAIA,EAAE,SAAS,QACpB,KAAK,IAAME,KAAKF,EAAE,MAAM;GACtB,IAAMG,IAAM,GAAGD,EAAE,WAAW,GAAGA,EAAE,WAAW,GAAGA,EAAE;GAGjD,AAFKP,EAAM,IAAIQ,CAAG,KAAGR,EAAM,IAAIQ,GAAK;IAAE,QAAQD,EAAE;IAAY,QAAQA,EAAE;IAAY,OAAOA,EAAE;GAAU,CAAC,GACtGL,EAAMK,EAAE,IAAI,GACZL,EAAMK,EAAE,QAAQ,KAAK;EACvB;CAGN;CAEA,OADAH,EAAKK,CAAQ,GACN;EAAE,OAAO,CAAC,GAAGT,EAAM,OAAO,CAAC;EAAG,YAAY,CAAC,GAAGC,CAAK;CAAE;AAC9D"}
1
+ {"version":3,"file":"renderNeeds.js","names":["renderNeeds","fonts","kinds","paint","p","walk","c","list","r","key","commands"],"sources":["../../src/canvas/renderNeeds.ts"],"sourcesContent":["import type { Paint } from '@weasel-js/paint';\nimport type { FontRequest } from '@weasel-js/font';\nimport type { DrawCommand } from '@weasel-js/renderer';\n\n/** What drawing a command list loads on demand: the faces its text is set in\n * and the paint kinds its fills and strokes name. */\nexport interface RenderNeeds {\n /** Each `(family, weight, style)` a text run is set in, once, in the order\n * met. */\n fonts: FontRequest[];\n /** Each paint kind a fill or stroke names, once, in the order met —\n * registered ones included. */\n paintKinds: string[];\n}\n\n/**\n * The fonts and paint kinds `commands` draw with, read off the commands\n * themselves: text runs, path fills and strokes, run fills and strokes, and\n * everything under a group. What `warmRender({ render })` loads, and nothing\n * more. Images, sprites and shaders load nothing on demand, so they add\n * nothing.\n */\nexport function renderNeeds(commands: readonly DrawCommand[]): RenderNeeds {\n const fonts = new Map<string, FontRequest>();\n const kinds = new Set<string>();\n const paint = (p: Paint | null | undefined) => {\n if (p) kinds.add(p.kind ?? 'solid');\n };\n const walk = (list: readonly DrawCommand[]) => {\n for (const c of list) {\n if (c.kind === 'group') walk(c.children);\n else if (c.kind === 'path') {\n paint(c.fill?.paint);\n paint(c.stroke?.paint);\n } else if (c.kind === 'text') {\n for (const r of c.runs) {\n const key = `${r.fontFamily}|${r.fontWeight}|${r.fontStyle}`;\n if (!fonts.has(key)) fonts.set(key, { family: r.fontFamily, weight: r.fontWeight, style: r.fontStyle });\n paint(r.fill?.paint);\n paint(r.stroke?.paint);\n }\n }\n }\n };\n walk(commands);\n return { fonts: [...fonts.values()], paintKinds: [...kinds] };\n}\n"],"mappings":";AAsBA,SAAgBA,EAAY,GAA+C;CACzE,IAAMC,oBAAQ,IAAI,IAAyB,GACrCC,oBAAQ,IAAI,IAAY,GACxBC,KAAS,MAAgC;EAC7C,AAAIC,KAAGF,EAAM,IAAIE,EAAE,QAAQ,OAAO;CACpC,GACMC,KAAQ,MAAiC;EAC7C,KAAK,IAAMC,KAAKC,GACd,IAAID,EAAE,SAAS,SAAS,EAAKA,EAAE,QAAQ;OAClC,IAAIA,EAAE,SAAS,QAElB,AADAH,EAAMG,EAAE,MAAM,KAAK,GACnBH,EAAMG,EAAE,QAAQ,KAAK;OAChB,IAAIA,EAAE,SAAS,QACpB,KAAK,IAAME,KAAKF,EAAE,MAAM;GACtB,IAAMG,IAAM,GAAGD,EAAE,WAAW,GAAGA,EAAE,WAAW,GAAGA,EAAE;GAGjD,AAFKP,EAAM,IAAIQ,CAAG,KAAGR,EAAM,IAAIQ,GAAK;IAAE,QAAQD,EAAE;IAAY,QAAQA,EAAE;IAAY,OAAOA,EAAE;GAAU,CAAC,GACtGL,EAAMK,EAAE,MAAM,KAAK,GACnBL,EAAMK,EAAE,QAAQ,KAAK;EACvB;CAGN;CAEA,OADAH,EAAKK,CAAQ,GACN;EAAE,OAAO,CAAC,GAAGT,EAAM,OAAO,CAAC;EAAG,YAAY,CAAC,GAAGC,CAAK;CAAE;AAC9D"}