@weasel-js/core 1.6.1 → 1.7.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 (1005) hide show
  1. package/CHANGELOG.md +1006 -0
  2. package/README.md +28 -9
  3. package/dist/WeaselProvider.js +15 -0
  4. package/dist/WeaselProvider.js.map +1 -0
  5. package/dist/affordances/composeAffordanceLayer.js +224 -0
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -0
  7. package/dist/affordances/cornerResize.js +69 -0
  8. package/dist/affordances/cornerResize.js.map +1 -0
  9. package/dist/affordances/hitAffordanceRegions.js +138 -0
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -0
  11. package/dist/affordances/pathAnchors.js +66 -0
  12. package/dist/affordances/pathAnchors.js.map +1 -0
  13. package/dist/affordances/rotationHandle.js +103 -0
  14. package/dist/affordances/rotationHandle.js.map +1 -0
  15. package/dist/animation/behaviors/momentum.js +118 -0
  16. package/dist/animation/behaviors/momentum.js.map +1 -0
  17. package/dist/animation/colorHelpers.js +135 -0
  18. package/dist/animation/colorHelpers.js.map +1 -0
  19. package/dist/animation/colorRegistry.js +37 -0
  20. package/dist/animation/colorRegistry.js.map +1 -0
  21. package/dist/animation/index.js +20 -0
  22. package/dist/animation/loop.js +62 -0
  23. package/dist/animation/loop.js.map +1 -0
  24. package/dist/animation/observe.js +23 -0
  25. package/dist/animation/observe.js.map +1 -0
  26. package/dist/animation/poseHelpers.js +50 -0
  27. package/dist/animation/poseHelpers.js.map +1 -0
  28. package/dist/animation/reflow.js +121 -0
  29. package/dist/animation/reflow.js.map +1 -0
  30. package/dist/animation/rig/bindRig.js +74 -0
  31. package/dist/animation/rig/bindRig.js.map +1 -0
  32. package/dist/animation/rig/blendPoses.js +43 -0
  33. package/dist/animation/rig/blendPoses.js.map +1 -0
  34. package/dist/animation/rig/mirrorPose.js +19 -0
  35. package/dist/animation/rig/mirrorPose.js.map +1 -0
  36. package/dist/animation/rig/resolveSkeleton.js +33 -0
  37. package/dist/animation/rig/resolveSkeleton.js.map +1 -0
  38. package/dist/animation/rig/solveIk.js +103 -0
  39. package/dist/animation/rig/solveIk.js.map +1 -0
  40. package/dist/animation/rig/types.js +12 -0
  41. package/dist/animation/rig/types.js.map +1 -0
  42. package/dist/animation/rig/useRig.js +23 -0
  43. package/dist/animation/rig/useRig.js.map +1 -0
  44. package/dist/animation/slew.js +27 -0
  45. package/dist/animation/slew.js.map +1 -0
  46. package/dist/animation/stagger.js +138 -0
  47. package/dist/animation/stagger.js.map +1 -0
  48. package/dist/animation/timeline/booking.js +106 -0
  49. package/dist/animation/timeline/booking.js.map +1 -0
  50. package/dist/animation/timeline/createTimeline.js +116 -0
  51. package/dist/animation/timeline/createTimeline.js.map +1 -0
  52. package/dist/animation/timeline/sampleTrack.js +29 -0
  53. package/dist/animation/timeline/sampleTrack.js.map +1 -0
  54. package/dist/animation/useAnimator.js +329 -0
  55. package/dist/animation/useAnimator.js.map +1 -0
  56. package/dist/animation/wrappers/animateLifecycle.js +40 -0
  57. package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
  58. package/dist/animation/wrappers/animateOnSetPose.js +44 -0
  59. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
  60. package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
  61. package/dist/{builtins-HWyuLzE-.d.ts → builtins-BSUfH8nU.d.ts} +1301 -508
  62. package/dist/canvas/Canvas.js +608 -0
  63. package/dist/canvas/Canvas.js.map +1 -0
  64. package/dist/canvas/CanvasView.js +255 -0
  65. package/dist/canvas/CanvasView.js.map +1 -0
  66. package/dist/canvas/CursorCoordsHud.js +75 -0
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -0
  68. package/dist/canvas/DrawCanvas.js +67 -0
  69. package/dist/canvas/DrawCanvas.js.map +1 -0
  70. package/dist/canvas/MinimapCanvas.js +139 -0
  71. package/dist/canvas/MinimapCanvas.js.map +1 -0
  72. package/dist/canvas/ModalityHud.js +66 -0
  73. package/dist/canvas/ModalityHud.js.map +1 -0
  74. package/dist/canvas/NodeShape.js +391 -0
  75. package/dist/canvas/NodeShape.js.map +1 -0
  76. package/dist/canvas/PickHud.js +93 -0
  77. package/dist/canvas/PickHud.js.map +1 -0
  78. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
  79. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
  81. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
  82. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
  83. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
  84. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
  85. package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
  91. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
  92. package/dist/canvas/SceneCanvas/features.js +97 -0
  93. package/dist/canvas/SceneCanvas/features.js.map +1 -0
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
  96. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
  97. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
  98. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
  99. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
  101. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
  102. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
  103. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
  104. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
  105. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
  106. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
  107. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
  108. package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
  109. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
  110. package/dist/canvas/SceneCanvas.js +992 -0
  111. package/dist/canvas/SceneCanvas.js.map +1 -0
  112. package/dist/canvas/SceneViewCanvas.js +54 -0
  113. package/dist/canvas/SceneViewCanvas.js.map +1 -0
  114. package/dist/canvas/accentColor.js +9 -0
  115. package/dist/canvas/accentColor.js.map +1 -0
  116. package/dist/canvas/affordanceAt.js +63 -0
  117. package/dist/canvas/affordanceAt.js.map +1 -0
  118. package/dist/canvas/buildSceneTree.js +65 -0
  119. package/dist/canvas/buildSceneTree.js.map +1 -0
  120. package/dist/canvas/canvasRenderer.js +89 -0
  121. package/dist/canvas/canvasRenderer.js.map +1 -0
  122. package/dist/canvas/colorOverrides.js +16 -0
  123. package/dist/canvas/colorOverrides.js.map +1 -0
  124. package/dist/canvas/defaultDrawOne.js +43 -0
  125. package/dist/canvas/defaultDrawOne.js.map +1 -0
  126. package/dist/canvas/deps/areaSelect.js +19 -0
  127. package/dist/canvas/deps/areaSelect.js.map +1 -0
  128. package/dist/canvas/deps/debug.js +9 -0
  129. package/dist/canvas/deps/debug.js.map +1 -0
  130. package/dist/canvas/deps/dispatcher.js +11 -0
  131. package/dist/canvas/deps/dispatcher.js.map +1 -0
  132. package/dist/canvas/deps/editAnchors.js +101 -0
  133. package/dist/canvas/deps/editAnchors.js.map +1 -0
  134. package/dist/canvas/deps/geometryProjection.js +11 -0
  135. package/dist/canvas/deps/geometryProjection.js.map +1 -0
  136. package/dist/canvas/deps/hitTestArea.js +51 -0
  137. package/dist/canvas/deps/hitTestArea.js.map +1 -0
  138. package/dist/canvas/deps/ingestion.js +31 -0
  139. package/dist/canvas/deps/ingestion.js.map +1 -0
  140. package/dist/canvas/deps/insert.js +116 -0
  141. package/dist/canvas/deps/insert.js.map +1 -0
  142. package/dist/canvas/deps/lassoSelect.js +20 -0
  143. package/dist/canvas/deps/lassoSelect.js.map +1 -0
  144. package/dist/canvas/deps/layout.js +34 -0
  145. package/dist/canvas/deps/layout.js.map +1 -0
  146. package/dist/canvas/deps/nodeAtPoint.js +19 -0
  147. package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
  148. package/dist/canvas/deps/poseComposition.js +11 -0
  149. package/dist/canvas/deps/poseComposition.js.map +1 -0
  150. package/dist/canvas/deps/poseDescriptor.js +12 -0
  151. package/dist/canvas/deps/poseDescriptor.js.map +1 -0
  152. package/dist/canvas/deps/resizePolicy.js +35 -0
  153. package/dist/canvas/deps/resizePolicy.js.map +1 -0
  154. package/dist/canvas/deps/slice.js +99 -0
  155. package/dist/canvas/deps/slice.js.map +1 -0
  156. package/dist/canvas/deps/snap.js +11 -0
  157. package/dist/canvas/deps/snap.js.map +1 -0
  158. package/dist/canvas/deps/textEdit.js +21 -0
  159. package/dist/canvas/deps/textEdit.js.map +1 -0
  160. package/dist/canvas/deps/view.js +43 -0
  161. package/dist/canvas/deps/view.js.map +1 -0
  162. package/dist/canvas/derivedPath.js +47 -0
  163. package/dist/canvas/derivedPath.js.map +1 -0
  164. package/dist/canvas/drawEnvelope.js +22 -0
  165. package/dist/canvas/drawEnvelope.js.map +1 -0
  166. package/dist/canvas/getNodeAtPoint.js +18 -0
  167. package/dist/canvas/getNodeAtPoint.js.map +1 -0
  168. package/dist/canvas/hostAnchor.js +29 -0
  169. package/dist/canvas/hostAnchor.js.map +1 -0
  170. package/dist/canvas/hud.module.js +18 -0
  171. package/dist/canvas/hud.module.js.map +1 -0
  172. package/dist/canvas/insertPreviewExtent.js +103 -0
  173. package/dist/canvas/insertPreviewExtent.js.map +1 -0
  174. package/dist/canvas/kitRequirements.js +177 -0
  175. package/dist/canvas/kitRequirements.js.map +1 -0
  176. package/dist/canvas/layerOrder.js +66 -0
  177. package/dist/canvas/layerOrder.js.map +1 -0
  178. package/dist/canvas/layerSlots.js +14 -0
  179. package/dist/canvas/layerSlots.js.map +1 -0
  180. package/dist/canvas/minimapMath.js +80 -0
  181. package/dist/canvas/minimapMath.js.map +1 -0
  182. package/dist/canvas/mountedCanvases.js +20 -0
  183. package/dist/canvas/mountedCanvases.js.map +1 -0
  184. package/dist/canvas/overlayRoleStrokes.js +17 -0
  185. package/dist/canvas/overlayRoleStrokes.js.map +1 -0
  186. package/dist/canvas/paintCull.js +20 -0
  187. package/dist/canvas/paintCull.js.map +1 -0
  188. package/dist/canvas/pickWalk.js +158 -0
  189. package/dist/canvas/pickWalk.js.map +1 -0
  190. package/dist/canvas/planeClips.js +30 -0
  191. package/dist/canvas/planeClips.js.map +1 -0
  192. package/dist/canvas/poseRotation.js +35 -0
  193. package/dist/canvas/poseRotation.js.map +1 -0
  194. package/dist/canvas/rasterToPng.js +21 -0
  195. package/dist/canvas/rasterToPng.js.map +1 -0
  196. package/dist/canvas/renderDebugSnapshot.js +32 -0
  197. package/dist/canvas/renderDebugSnapshot.js.map +1 -0
  198. package/dist/canvas/renderNeeds.js +25 -0
  199. package/dist/canvas/renderNeeds.js.map +1 -0
  200. package/dist/canvas/renderSceneToPixels.js +143 -0
  201. package/dist/canvas/renderSceneToPixels.js.map +1 -0
  202. package/dist/canvas/sceneAdapter.js +270 -0
  203. package/dist/canvas/sceneAdapter.js.map +1 -0
  204. package/dist/canvas/sceneLayerPaint.js +37 -0
  205. package/dist/canvas/sceneLayerPaint.js.map +1 -0
  206. package/dist/canvas/sceneSlotWiring.js +20 -0
  207. package/dist/canvas/sceneSlotWiring.js.map +1 -0
  208. package/dist/canvas/sceneViewRender.js +72 -0
  209. package/dist/canvas/sceneViewRender.js.map +1 -0
  210. package/dist/canvas/slopsDebugLayer.js +61 -0
  211. package/dist/canvas/slopsDebugLayer.js.map +1 -0
  212. package/dist/canvas/surfaceContribution.js +15 -0
  213. package/dist/canvas/surfaceContribution.js.map +1 -0
  214. package/dist/canvas/toolPreview.js +39 -0
  215. package/dist/canvas/toolPreview.js.map +1 -0
  216. package/dist/canvas/useCanvasRenderer.js +11 -0
  217. package/dist/canvas/useCanvasRenderer.js.map +1 -0
  218. package/dist/canvas/useFrameLoop.js +60 -0
  219. package/dist/canvas/useFrameLoop.js.map +1 -0
  220. package/dist/canvas/useHostAnchor.js +71 -0
  221. package/dist/canvas/useHostAnchor.js.map +1 -0
  222. package/dist/canvas/useLateContentRedraw.js +21 -0
  223. package/dist/canvas/useLateContentRedraw.js.map +1 -0
  224. package/dist/canvas/useRedrawOn.js +21 -0
  225. package/dist/canvas/useRedrawOn.js.map +1 -0
  226. package/dist/canvas/useViewHelpers.js +120 -0
  227. package/dist/canvas/useViewHelpers.js.map +1 -0
  228. package/dist/canvas/viewInputs.js +17 -0
  229. package/dist/canvas/viewInputs.js.map +1 -0
  230. package/dist/canvas/viewRegistry.js +61 -0
  231. package/dist/canvas/viewRegistry.js.map +1 -0
  232. package/dist/canvas/wrapNodeOutput.js +14 -0
  233. package/dist/canvas/wrapNodeOutput.js.map +1 -0
  234. package/dist/clipboard.d.ts +10 -5
  235. package/dist/clipboard.js +3 -5
  236. package/dist/clone.d.ts +3 -3
  237. package/dist/clone.js +2 -5
  238. package/dist/core/adapters/arrayAdapter.js +85 -0
  239. package/dist/core/adapters/arrayAdapter.js.map +1 -0
  240. package/dist/core/adapters/useArrayAdapter.js +13 -0
  241. package/dist/core/adapters/useArrayAdapter.js.map +1 -0
  242. package/dist/core/applyOps.js +12 -0
  243. package/dist/core/applyOps.js.map +1 -0
  244. package/dist/core/device/index.js +4 -0
  245. package/dist/core/device/targets.js +17 -0
  246. package/dist/core/device/targets.js.map +1 -0
  247. package/dist/core/device/useDeviceProfile.js +75 -0
  248. package/dist/core/device/useDeviceProfile.js.map +1 -0
  249. package/dist/core/fillInPoseFrame.js +102 -0
  250. package/dist/core/fillInPoseFrame.js.map +1 -0
  251. package/dist/core/geometry/poseDescriptor.js +98 -0
  252. package/dist/core/geometry/poseDescriptor.js.map +1 -0
  253. package/dist/core/geometry/poseRotation.js +58 -0
  254. package/dist/core/geometry/poseRotation.js.map +1 -0
  255. package/dist/core/geometry/regionHit.js +102 -0
  256. package/dist/core/geometry/regionHit.js.map +1 -0
  257. package/dist/core/geometry/unionBounds.js +60 -0
  258. package/dist/core/geometry/unionBounds.js.map +1 -0
  259. package/dist/core/gradient.js +136 -0
  260. package/dist/core/gradient.js.map +1 -0
  261. package/dist/core/isPlainObject.js +11 -0
  262. package/dist/core/isPlainObject.js.map +1 -0
  263. package/dist/core/layers/render.js +150 -0
  264. package/dist/core/layers/render.js.map +1 -0
  265. package/dist/core/markerInset.js +24 -0
  266. package/dist/core/markerInset.js.map +1 -0
  267. package/dist/core/mixed.js +6 -0
  268. package/dist/core/mixed.js.map +1 -0
  269. package/dist/core/ops/arrange.js +31 -0
  270. package/dist/core/ops/arrange.js.map +1 -0
  271. package/dist/core/ops/create.js +32 -0
  272. package/dist/core/ops/create.js.map +1 -0
  273. package/dist/core/ops/createHistory.js +20 -0
  274. package/dist/core/ops/createHistory.js.map +1 -0
  275. package/dist/core/ops/delete.js +89 -0
  276. package/dist/core/ops/delete.js.map +1 -0
  277. package/dist/core/ops/registry.js +17 -0
  278. package/dist/core/ops/registry.js.map +1 -0
  279. package/dist/core/ops/reorder/algorithms.js +55 -0
  280. package/dist/core/ops/reorder/algorithms.js.map +1 -0
  281. package/dist/core/ops/reorder/index.js +140 -0
  282. package/dist/core/ops/reorder/index.js.map +1 -0
  283. package/dist/core/ops/reparent.js +52 -0
  284. package/dist/core/ops/reparent.js.map +1 -0
  285. package/dist/core/ops/select.js +34 -0
  286. package/dist/core/ops/select.js.map +1 -0
  287. package/dist/core/ops/setData.js +34 -0
  288. package/dist/core/ops/setData.js.map +1 -0
  289. package/dist/core/ops/setLayer.js +34 -0
  290. package/dist/core/ops/setLayer.js.map +1 -0
  291. package/dist/core/ops/setLayout.js +31 -0
  292. package/dist/core/ops/setLayout.js.map +1 -0
  293. package/dist/core/ops/setPath.js +57 -0
  294. package/dist/core/ops/setPath.js.map +1 -0
  295. package/dist/core/ops/setText.js +34 -0
  296. package/dist/core/ops/setText.js.map +1 -0
  297. package/dist/core/ops/slot.js +37 -0
  298. package/dist/core/ops/slot.js.map +1 -0
  299. package/dist/core/ops/transform.js +42 -0
  300. package/dist/core/ops/transform.js.map +1 -0
  301. package/dist/core/paintKinds.js +156 -0
  302. package/dist/core/paintKinds.js.map +1 -0
  303. package/dist/core/scene/NodeProperties.js +20 -0
  304. package/dist/core/scene/NodeProperties.js.map +1 -0
  305. package/dist/core/scene/NodeRouting.js +24 -0
  306. package/dist/core/scene/NodeRouting.js.map +1 -0
  307. package/dist/core/scene/arrivals.js +12 -0
  308. package/dist/core/scene/arrivals.js.map +1 -0
  309. package/dist/core/scene/composeFrame.js +29 -0
  310. package/dist/core/scene/composeFrame.js.map +1 -0
  311. package/dist/core/scene/depMemo.js +18 -0
  312. package/dist/core/scene/depMemo.js.map +1 -0
  313. package/dist/core/scene/dependents.js +66 -0
  314. package/dist/core/scene/dependents.js.map +1 -0
  315. package/dist/core/scene/derivedPath.js +31 -0
  316. package/dist/core/scene/derivedPath.js.map +1 -0
  317. package/dist/core/scene/effectivePose.js +78 -0
  318. package/dist/core/scene/effectivePose.js.map +1 -0
  319. package/dist/core/scene/kitRegistry.js +33 -0
  320. package/dist/core/scene/kitRegistry.js.map +1 -0
  321. package/dist/core/scene/layoutPass.js +96 -0
  322. package/dist/core/scene/layoutPass.js.map +1 -0
  323. package/dist/core/scene/nodeFnFields.js +83 -0
  324. package/dist/core/scene/nodeFnFields.js.map +1 -0
  325. package/dist/core/scene/nodeMemo.js +28 -0
  326. package/dist/core/scene/nodeMemo.js.map +1 -0
  327. package/dist/core/scene/poseFeed.js +87 -0
  328. package/dist/core/scene/poseFeed.js.map +1 -0
  329. package/dist/core/scene/poseOverrides.js +52 -0
  330. package/dist/core/scene/poseOverrides.js.map +1 -0
  331. package/dist/core/scene/poseSnapshot.js +54 -0
  332. package/dist/core/scene/poseSnapshot.js.map +1 -0
  333. package/dist/core/scene/scene.js +1271 -0
  334. package/dist/core/scene/scene.js.map +1 -0
  335. package/dist/core/scene/types.js +6 -0
  336. package/dist/core/scene/types.js.map +1 -0
  337. package/dist/core/scene/useScene.js +32 -0
  338. package/dist/core/scene/useScene.js.map +1 -0
  339. package/dist/core/selection/chromeState.js +31 -0
  340. package/dist/core/selection/chromeState.js.map +1 -0
  341. package/dist/core/selection/selectionTarget.js +6 -0
  342. package/dist/core/selection/selectionTarget.js.map +1 -0
  343. package/dist/core/selection/useSelection.js +71 -0
  344. package/dist/core/selection/useSelection.js.map +1 -0
  345. package/dist/core/shapeKinds.js +54 -0
  346. package/dist/core/shapeKinds.js.map +1 -0
  347. package/dist/core/strokeMarkerShapes.js +139 -0
  348. package/dist/core/strokeMarkerShapes.js.map +1 -0
  349. package/dist/core/strokeMarkers.js +28 -0
  350. package/dist/core/strokeMarkers.js.map +1 -0
  351. package/dist/core/stylus/stylus.js +39 -0
  352. package/dist/core/stylus/stylus.js.map +1 -0
  353. package/dist/core/stylus/usePointerStylus.js +51 -0
  354. package/dist/core/stylus/usePointerStylus.js.map +1 -0
  355. package/dist/core/usePaintKinds.js +17 -0
  356. package/dist/core/usePaintKinds.js.map +1 -0
  357. package/dist/core/viewport/clampView.js +24 -0
  358. package/dist/core/viewport/clampView.js.map +1 -0
  359. package/dist/core/viewport/clientToWorld.js +8 -0
  360. package/dist/core/viewport/clientToWorld.js.map +1 -0
  361. package/dist/core/viewport/createVelocityTracker.js +39 -0
  362. package/dist/core/viewport/createVelocityTracker.js.map +1 -0
  363. package/dist/core/viewport/fitToBounds.js +18 -0
  364. package/dist/core/viewport/fitToBounds.js.map +1 -0
  365. package/dist/core/viewport/fitViewToBounds.js +36 -0
  366. package/dist/core/viewport/fitViewToBounds.js.map +1 -0
  367. package/dist/core/viewport/interpolateView.js +34 -0
  368. package/dist/core/viewport/interpolateView.js.map +1 -0
  369. package/dist/core/viewport/meanScale.js +8 -0
  370. package/dist/core/viewport/meanScale.js.map +1 -0
  371. package/dist/core/viewport/parallax.js +111 -0
  372. package/dist/core/viewport/parallax.js.map +1 -0
  373. package/dist/core/viewport/pxExtent.js +42 -0
  374. package/dist/core/viewport/pxExtent.js.map +1 -0
  375. package/dist/core/viewport/sceneNodeClientRect.js +18 -0
  376. package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
  377. package/dist/core/viewport/screenSlop.js +27 -0
  378. package/dist/core/viewport/screenSlop.js.map +1 -0
  379. package/dist/core/viewport/useAutoCenter.js +32 -0
  380. package/dist/core/viewport/useAutoCenter.js.map +1 -0
  381. package/dist/core/viewport/useCanvasSize.js +29 -0
  382. package/dist/core/viewport/useCanvasSize.js.map +1 -0
  383. package/dist/core/viewport/useDecayLoop.js +63 -0
  384. package/dist/core/viewport/useDecayLoop.js.map +1 -0
  385. package/dist/core/viewport/useVelocityTracker.js +10 -0
  386. package/dist/core/viewport/useVelocityTracker.js.map +1 -0
  387. package/dist/core/viewport/useViewAnimation.js +63 -0
  388. package/dist/core/viewport/useViewAnimation.js.map +1 -0
  389. package/dist/core/viewport/view.js +37 -0
  390. package/dist/core/viewport/view.js.map +1 -0
  391. package/dist/core/viewport/viewTransform.js +11 -0
  392. package/dist/core/viewport/viewTransform.js.map +1 -0
  393. package/dist/core/viewport/viewportWorldRect.js +13 -0
  394. package/dist/core/viewport/viewportWorldRect.js.map +1 -0
  395. package/dist/core/viewport/wheelHandler.js +30 -0
  396. package/dist/core/viewport/wheelHandler.js.map +1 -0
  397. package/dist/core/viewport/zoomAt.js +22 -0
  398. package/dist/core/viewport/zoomAt.js.map +1 -0
  399. package/dist/core/viewport/zoomBounds.js +20 -0
  400. package/dist/core/viewport/zoomBounds.js.map +1 -0
  401. package/dist/{pointSnapToGrid-7mCcm6qG.d.ts → cornerHandles-CDcZOV8h.d.ts} +54 -71
  402. package/dist/debug/createDebugOverlayLayer.js +358 -0
  403. package/dist/debug/createDebugOverlayLayer.js.map +1 -0
  404. package/dist/debug/createDebugSink.js +83 -0
  405. package/dist/debug/createDebugSink.js.map +1 -0
  406. package/dist/debug/defaultTheme.js +31 -0
  407. package/dist/debug/defaultTheme.js.map +1 -0
  408. package/dist/debug/flag.js +41 -0
  409. package/dist/debug/flag.js.map +1 -0
  410. package/dist/debug/frameStats.js +16 -0
  411. package/dist/debug/frameStats.js.map +1 -0
  412. package/dist/debug/parseDebugFlags.js +32 -0
  413. package/dist/debug/parseDebugFlags.js.map +1 -0
  414. package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
  415. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
  416. package/dist/features/chrome-caps/conditions.js +36 -0
  417. package/dist/features/chrome-caps/conditions.js.map +1 -0
  418. package/dist/features/chrome-caps/defaults.js +26 -0
  419. package/dist/features/chrome-caps/defaults.js.map +1 -0
  420. package/dist/features/chrome-caps/index.js +7 -0
  421. package/dist/features/chrome-caps/resolve.js +23 -0
  422. package/dist/features/chrome-caps/resolve.js.map +1 -0
  423. package/dist/features/chrome-caps/useHoverTracking.js +27 -0
  424. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
  425. package/dist/features/cursor/paintedCursorLayer.js +60 -0
  426. package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
  427. package/dist/features/focus/gateLayer.js +14 -0
  428. package/dist/features/focus/gateLayer.js.map +1 -0
  429. package/dist/features/focus/useCanvasFocus.js +29 -0
  430. package/dist/features/focus/useCanvasFocus.js.map +1 -0
  431. package/dist/features/groups/children.js +23 -0
  432. package/dist/features/groups/children.js.map +1 -0
  433. package/dist/features/groups/composePose.js +67 -0
  434. package/dist/features/groups/composePose.js.map +1 -0
  435. package/dist/features/groups/nestedHit.js +40 -0
  436. package/dist/features/groups/nestedHit.js.map +1 -0
  437. package/dist/features/groups/unionOfChildren.js +15 -0
  438. package/dist/features/groups/unionOfChildren.js.map +1 -0
  439. package/dist/features/images/imageCache.js +94 -0
  440. package/dist/features/images/imageCache.js.map +1 -0
  441. package/dist/features/ingestion/contentHandlers.js +37 -0
  442. package/dist/features/ingestion/contentHandlers.js.map +1 -0
  443. package/dist/features/ingestion/imageHandler.js +45 -0
  444. package/dist/features/ingestion/imageHandler.js.map +1 -0
  445. package/dist/features/ingestion/index.js +8 -0
  446. package/dist/features/ingestion/openFilePicker.js +15 -0
  447. package/dist/features/ingestion/openFilePicker.js.map +1 -0
  448. package/dist/features/ingestion/registerKitHandlers.js +26 -0
  449. package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
  450. package/dist/features/ingestion/svgHandler.js +58 -0
  451. package/dist/features/ingestion/svgHandler.js.map +1 -0
  452. package/dist/features/ingestion/weaselJsonHandler.js +39 -0
  453. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
  454. package/dist/features/longPress/longPressFeedback.js +96 -0
  455. package/dist/features/longPress/longPressFeedback.js.map +1 -0
  456. package/dist/features/meshPaint/bake.js +79 -0
  457. package/dist/features/meshPaint/bake.js.map +1 -0
  458. package/dist/features/meshPaint/bakeCache.js +59 -0
  459. package/dist/features/meshPaint/bakeCache.js.map +1 -0
  460. package/dist/features/meshPaint/handles.js +86 -0
  461. package/dist/features/meshPaint/handles.js.map +1 -0
  462. package/dist/features/meshPaint/lazyKind.js +1298 -0
  463. package/dist/features/meshPaint/lazyKind.js.map +1 -0
  464. package/dist/features/meshPaint/meshPaint.js +236 -0
  465. package/dist/features/meshPaint/meshPaint.js.map +1 -0
  466. package/dist/features/meshPaint/meshShader.js +6 -0
  467. package/dist/features/meshPaint/meshShader.js.map +1 -0
  468. package/dist/features/meshPaint/register.js +7 -0
  469. package/dist/features/meshPaint/register.js.map +1 -0
  470. package/dist/features/meshPaint/surface.js +110 -0
  471. package/dist/features/meshPaint/surface.js.map +1 -0
  472. package/dist/features/minimap/actions.js +53 -0
  473. package/dist/features/minimap/actions.js.map +1 -0
  474. package/dist/features/minimap/createMinimapContribution.js +96 -0
  475. package/dist/features/minimap/createMinimapContribution.js.map +1 -0
  476. package/dist/features/minimap/layers.js +103 -0
  477. package/dist/features/minimap/layers.js.map +1 -0
  478. package/dist/features/modes/modeLayers.js +113 -0
  479. package/dist/features/modes/modeLayers.js.map +1 -0
  480. package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
  481. package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
  482. package/dist/features/parallax/createParallaxLayer.js +26 -0
  483. package/dist/features/parallax/createParallaxLayer.js.map +1 -0
  484. package/dist/features/parallax/createParallaxPlane.js +26 -0
  485. package/dist/features/parallax/createParallaxPlane.js.map +1 -0
  486. package/dist/features/paths/anchorEdits.js +156 -0
  487. package/dist/features/paths/anchorEdits.js.map +1 -0
  488. package/dist/features/paths/anchors.js +154 -0
  489. package/dist/features/paths/anchors.js.map +1 -0
  490. package/dist/features/paths/booleans.js +2 -0
  491. package/dist/features/paths/index.js +15 -0
  492. package/dist/features/paths/markerCommands.js +116 -0
  493. package/dist/features/paths/markerCommands.js.map +1 -0
  494. package/dist/features/paths/markerSites.js +59 -0
  495. package/dist/features/paths/markerSites.js.map +1 -0
  496. package/dist/features/paths/markers.js +95 -0
  497. package/dist/features/paths/markers.js.map +1 -0
  498. package/dist/features/paths/nearestAnchor.js +36 -0
  499. package/dist/features/paths/nearestAnchor.js.map +1 -0
  500. package/dist/features/paths/originProjection.js +16 -0
  501. package/dist/features/paths/originProjection.js.map +1 -0
  502. package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
  503. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
  504. package/dist/features/paths/pathInWorld.js +41 -0
  505. package/dist/features/paths/pathInWorld.js.map +1 -0
  506. package/dist/features/paths/pathLayer.js +44 -0
  507. package/dist/features/paths/pathLayer.js.map +1 -0
  508. package/dist/features/paths/penPreviewLayer.js +220 -0
  509. package/dist/features/paths/penPreviewLayer.js.map +1 -0
  510. package/dist/features/paths/poseDescriptor.js +44 -0
  511. package/dist/features/paths/poseDescriptor.js.map +1 -0
  512. package/dist/features/paths/tessellate/stroke.js +230 -0
  513. package/dist/features/paths/tessellate/stroke.js.map +1 -0
  514. package/dist/features/patterns/index.js +23 -0
  515. package/dist/features/patterns/index.js.map +1 -0
  516. package/dist/features/patterns/patterns-builtin.js +38 -0
  517. package/dist/features/patterns/patterns-builtin.js.map +1 -0
  518. package/dist/features/patterns/resolveSpec.js +57 -0
  519. package/dist/features/patterns/resolveSpec.js.map +1 -0
  520. package/dist/features/patterns/tileGeometry.js +158 -0
  521. package/dist/features/patterns/tileGeometry.js.map +1 -0
  522. package/dist/features/pointer/PointerContext.js +45 -0
  523. package/dist/features/pointer/PointerContext.js.map +1 -0
  524. package/dist/features/poseRun/usePoseRun.js +70 -0
  525. package/dist/features/poseRun/usePoseRun.js.map +1 -0
  526. package/dist/features/selection/SelectionContext.js +46 -0
  527. package/dist/features/selection/SelectionContext.js.map +1 -0
  528. package/dist/features/selection/overlay.js +442 -0
  529. package/dist/features/selection/overlay.js.map +1 -0
  530. package/dist/features/simulation/createSimulation.js +61 -0
  531. package/dist/features/simulation/createSimulation.js.map +1 -0
  532. package/dist/features/simulation/types.js +6 -0
  533. package/dist/features/simulation/types.js.map +1 -0
  534. package/dist/features/simulation/useSimulation.js +74 -0
  535. package/dist/features/simulation/useSimulation.js.map +1 -0
  536. package/dist/features/text/domRuns.js +258 -0
  537. package/dist/features/text/domRuns.js.map +1 -0
  538. package/dist/features/text/fitTextPose.js +38 -0
  539. package/dist/features/text/fitTextPose.js.map +1 -0
  540. package/dist/features/text/hitTest.js +45 -0
  541. package/dist/features/text/hitTest.js.map +1 -0
  542. package/dist/features/text/renderLabel.js +14 -0
  543. package/dist/features/text/renderLabel.js.map +1 -0
  544. package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
  545. package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
  546. package/dist/features/text/runs/flagRange.js +53 -0
  547. package/dist/features/text/runs/flagRange.js.map +1 -0
  548. package/dist/features/text/runs/rangeStyle.js +135 -0
  549. package/dist/features/text/runs/rangeStyle.js.map +1 -0
  550. package/dist/features/text/textCommand.js +59 -0
  551. package/dist/features/text/textCommand.js.map +1 -0
  552. package/dist/features/text/textLayer.js +35 -0
  553. package/dist/features/text/textLayer.js.map +1 -0
  554. package/dist/features/text/textToPath.js +181 -0
  555. package/dist/features/text/textToPath.js.map +1 -0
  556. package/dist/features/text/useSceneTextEdit.js +138 -0
  557. package/dist/features/text/useSceneTextEdit.js.map +1 -0
  558. package/dist/features/text/useTextEdit.js +465 -0
  559. package/dist/features/text/useTextEdit.js.map +1 -0
  560. package/dist/features/tiling/createTiledLayer.js +63 -0
  561. package/dist/features/tiling/createTiledLayer.js.map +1 -0
  562. package/dist/features/tiling/tiledProject.js +14 -0
  563. package/dist/features/tiling/tiledProject.js.map +1 -0
  564. package/dist/features/viewports/viewResolver.js +59 -0
  565. package/dist/features/viewports/viewResolver.js.map +1 -0
  566. package/dist/features/viewports/viewportLayer.js +58 -0
  567. package/dist/features/viewports/viewportLayer.js.map +1 -0
  568. package/dist/icons/ArrowIcon.js +23 -0
  569. package/dist/icons/ArrowIcon.js.map +1 -0
  570. package/dist/icons/EllipseIcon.js +21 -0
  571. package/dist/icons/EllipseIcon.js.map +1 -0
  572. package/dist/icons/EyedropperIcon.js +49 -0
  573. package/dist/icons/EyedropperIcon.js.map +1 -0
  574. package/dist/icons/HandIcon.js +59 -0
  575. package/dist/icons/HandIcon.js.map +1 -0
  576. package/dist/icons/ImageIcon.js +34 -0
  577. package/dist/icons/ImageIcon.js.map +1 -0
  578. package/dist/icons/LassoIcon.js +22 -0
  579. package/dist/icons/LassoIcon.js.map +1 -0
  580. package/dist/icons/LineIcon.js +22 -0
  581. package/dist/icons/LineIcon.js.map +1 -0
  582. package/dist/icons/PenIcon.js +36 -0
  583. package/dist/icons/PenIcon.js.map +1 -0
  584. package/dist/icons/PencilIcon.js +25 -0
  585. package/dist/icons/PencilIcon.js.map +1 -0
  586. package/dist/icons/PolygonIcon.js +19 -0
  587. package/dist/icons/PolygonIcon.js.map +1 -0
  588. package/dist/icons/RectIcon.js +37 -0
  589. package/dist/icons/RectIcon.js.map +1 -0
  590. package/dist/icons/SelectIcon.js +20 -0
  591. package/dist/icons/SelectIcon.js.map +1 -0
  592. package/dist/icons/StarIcon.js +19 -0
  593. package/dist/icons/StarIcon.js.map +1 -0
  594. package/dist/icons/TextIcon.js +19 -0
  595. package/dist/icons/TextIcon.js.map +1 -0
  596. package/dist/icons/UnknownIcon.js +33 -0
  597. package/dist/icons/UnknownIcon.js.map +1 -0
  598. package/dist/icons/_base.js +12 -0
  599. package/dist/icons/_base.js.map +1 -0
  600. package/dist/index.css +2 -86
  601. package/dist/index.d.ts +2349 -2609
  602. package/dist/index.js +312 -13
  603. package/dist/input/keyState.js +76 -0
  604. package/dist/input/keyState.js.map +1 -0
  605. package/dist/input/useKeyState.js +22 -0
  606. package/dist/input/useKeyState.js.map +1 -0
  607. package/dist/interactions/actions/actionShortcuts.js +32 -0
  608. package/dist/interactions/actions/actionShortcuts.js.map +1 -0
  609. package/dist/interactions/actions/align/align.js +81 -0
  610. package/dist/interactions/actions/align/align.js.map +1 -0
  611. package/dist/interactions/actions/booleans/booleans.js +120 -0
  612. package/dist/interactions/actions/booleans/booleans.js.map +1 -0
  613. package/dist/interactions/actions/booleans/useBooleans.js +20 -0
  614. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
  615. package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
  616. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
  617. package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
  618. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
  619. package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
  620. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
  621. package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
  622. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
  623. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
  624. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
  625. package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
  626. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
  627. package/dist/interactions/actions/defaults/align.js +71 -0
  628. package/dist/interactions/actions/defaults/align.js.map +1 -0
  629. package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
  630. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
  631. package/dist/interactions/actions/defaults/areaSelect.js +75 -0
  632. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
  633. package/dist/interactions/actions/defaults/booleans.js +52 -0
  634. package/dist/interactions/actions/defaults/booleans.js.map +1 -0
  635. package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
  636. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
  637. package/dist/interactions/actions/defaults/clearSelection.js +19 -0
  638. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
  639. package/dist/interactions/actions/defaults/clipboard.js +78 -0
  640. package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
  641. package/dist/interactions/actions/defaults/clone.js +96 -0
  642. package/dist/interactions/actions/defaults/clone.js.map +1 -0
  643. package/dist/interactions/actions/defaults/createOutlines.js +47 -0
  644. package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
  645. package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
  646. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
  647. package/dist/interactions/actions/defaults/delete.js +61 -0
  648. package/dist/interactions/actions/defaults/delete.js.map +1 -0
  649. package/dist/interactions/actions/defaults/distribute.js +66 -0
  650. package/dist/interactions/actions/defaults/distribute.js.map +1 -0
  651. package/dist/interactions/actions/defaults/duplicate.js +83 -0
  652. package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
  653. package/dist/interactions/actions/defaults/editAnchors.js +100 -0
  654. package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
  655. package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
  656. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
  657. package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
  658. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
  659. package/dist/interactions/actions/defaults/escape.js +26 -0
  660. package/dist/interactions/actions/defaults/escape.js.map +1 -0
  661. package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
  662. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
  663. package/dist/interactions/actions/defaults/flip.js +119 -0
  664. package/dist/interactions/actions/defaults/flip.js.map +1 -0
  665. package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
  666. package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
  667. package/dist/interactions/actions/defaults/group.js +131 -0
  668. package/dist/interactions/actions/defaults/group.js.map +1 -0
  669. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
  670. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
  671. package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
  672. package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
  673. package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
  674. package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
  675. package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
  676. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
  677. package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
  678. package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
  679. package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
  680. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
  681. package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
  682. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
  683. package/dist/interactions/actions/defaults/ingest.js +58 -0
  684. package/dist/interactions/actions/defaults/ingest.js.map +1 -0
  685. package/dist/interactions/actions/defaults/insert.js +288 -0
  686. package/dist/interactions/actions/defaults/insert.js.map +1 -0
  687. package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
  688. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
  689. package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
  690. package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
  691. package/dist/interactions/actions/defaults/move.js +656 -0
  692. package/dist/interactions/actions/defaults/move.js.map +1 -0
  693. package/dist/interactions/actions/defaults/nudge.js +110 -0
  694. package/dist/interactions/actions/defaults/nudge.js.map +1 -0
  695. package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
  696. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
  697. package/dist/interactions/actions/defaults/reorder.js +143 -0
  698. package/dist/interactions/actions/defaults/reorder.js.map +1 -0
  699. package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
  700. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
  701. package/dist/interactions/actions/defaults/resize.js +332 -0
  702. package/dist/interactions/actions/defaults/resize.js.map +1 -0
  703. package/dist/interactions/actions/defaults/rotate.js +181 -0
  704. package/dist/interactions/actions/defaults/rotate.js.map +1 -0
  705. package/dist/interactions/actions/defaults/selectAll.js +27 -0
  706. package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
  707. package/dist/interactions/actions/defaults/setFill.js +27 -0
  708. package/dist/interactions/actions/defaults/setFill.js.map +1 -0
  709. package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
  710. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
  711. package/dist/interactions/actions/defaults/setStroke.js +36 -0
  712. package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
  713. package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
  714. package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
  715. package/dist/interactions/actions/defaults/slice.js +39 -0
  716. package/dist/interactions/actions/defaults/slice.js.map +1 -0
  717. package/dist/interactions/actions/defaults/sliceOps.js +60 -0
  718. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
  719. package/dist/interactions/actions/defaults/toolActivate.js +35 -0
  720. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
  721. package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
  722. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
  723. package/dist/interactions/actions/defaults/undoRedo.js +51 -0
  724. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
  725. package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
  726. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
  727. package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
  728. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
  729. package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
  730. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
  731. package/dist/interactions/actions/distribute/distribute.js +42 -0
  732. package/dist/interactions/actions/distribute/distribute.js.map +1 -0
  733. package/dist/interactions/actions/distribute/plan.js +29 -0
  734. package/dist/interactions/actions/distribute/plan.js.map +1 -0
  735. package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
  736. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
  737. package/dist/interactions/actions/edit-anchors/handles.js +43 -0
  738. package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
  739. package/dist/interactions/actions/flip/helpers.js +35 -0
  740. package/dist/interactions/actions/flip/helpers.js.map +1 -0
  741. package/dist/interactions/actions/geometryProjection.js +18 -0
  742. package/dist/interactions/actions/geometryProjection.js.map +1 -0
  743. package/dist/interactions/actions/gestureLifecycle.js +44 -0
  744. package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
  745. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
  746. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
  747. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
  748. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
  749. package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
  750. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
  751. package/dist/interactions/actions/move/gestureAdapter.js +37 -0
  752. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
  753. package/dist/interactions/actions/outlines/createOutlines.js +84 -0
  754. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
  755. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
  756. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
  757. package/dist/interactions/actions/planeInput.js +168 -0
  758. package/dist/interactions/actions/planeInput.js.map +1 -0
  759. package/dist/interactions/actions/poseDescriptorDep.js +9 -0
  760. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
  761. package/dist/interactions/actions/poseFrame.js +38 -0
  762. package/dist/interactions/actions/poseFrame.js.map +1 -0
  763. package/dist/interactions/actions/previewOverrides.js +25 -0
  764. package/dist/interactions/actions/previewOverrides.js.map +1 -0
  765. package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
  766. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
  767. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
  768. package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
  769. package/dist/interactions/actions/resize/behaviors/index.js +8 -0
  770. package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
  771. package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
  772. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
  773. package/dist/interactions/actions/resize/cornerHandles.js +72 -0
  774. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
  775. package/dist/interactions/actions/resolveOverlays.js +60 -0
  776. package/dist/interactions/actions/resolveOverlays.js.map +1 -0
  777. package/dist/interactions/actions/resolvePreviews.js +61 -0
  778. package/dist/interactions/actions/resolvePreviews.js.map +1 -0
  779. package/dist/interactions/actions/rotate/geometry.js +46 -0
  780. package/dist/interactions/actions/rotate/geometry.js.map +1 -0
  781. package/dist/interactions/actions/rotate/handle.js +27 -0
  782. package/dist/interactions/actions/rotate/handle.js.map +1 -0
  783. package/dist/interactions/actions/spatialReference.js +42 -0
  784. package/dist/interactions/actions/spatialReference.js.map +1 -0
  785. package/dist/interactions/actions/useStandardActions.js +142 -0
  786. package/dist/interactions/actions/useStandardActions.js.map +1 -0
  787. package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
  788. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
  789. package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
  790. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
  791. package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
  792. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
  793. package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
  794. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
  795. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
  796. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
  797. package/dist/interactions/gestures/shared/originProjection.js +42 -0
  798. package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
  799. package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
  800. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
  801. package/dist/interactions/gestures/shared/snap.js +24 -0
  802. package/dist/interactions/gestures/shared/snap.js.map +1 -0
  803. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
  804. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
  805. package/dist/layout/arrivals.js +36 -0
  806. package/dist/layout/arrivals.js.map +1 -0
  807. package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
  808. package/dist/math.d.ts +4 -5
  809. package/dist/math.js +6 -4
  810. package/dist/mesh.d.ts +268 -0
  811. package/dist/mesh.js +7 -0
  812. package/dist/move.d.ts +7 -48
  813. package/dist/move.js +3 -142
  814. package/dist/originProjection-BSn4xiEy.d.ts +57 -0
  815. package/dist/patterns-builtin.js +3 -3
  816. package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
  817. package/dist/registerProgram-ateHDGjw.d.ts +193 -0
  818. package/dist/renderer/DrawCommand.js +6 -0
  819. package/dist/renderer/DrawCommand.js.map +1 -0
  820. package/dist/renderer/WeaselRenderer.js +328 -0
  821. package/dist/renderer/WeaselRenderer.js.map +1 -0
  822. package/dist/renderer/cache/GLImageCache.js +64 -0
  823. package/dist/renderer/cache/GLImageCache.js.map +1 -0
  824. package/dist/renderer/cache/GLMeshCache.js +102 -0
  825. package/dist/renderer/cache/GLMeshCache.js.map +1 -0
  826. package/dist/renderer/cache/GLTextureCache.js +51 -0
  827. package/dist/renderer/cache/GLTextureCache.js.map +1 -0
  828. package/dist/renderer/cache/GradientRampAtlas.js +82 -0
  829. package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
  830. package/dist/renderer/cache/cache.js +13 -0
  831. package/dist/renderer/cache/cache.js.map +1 -0
  832. package/dist/renderer/cache/markerCommandCache.js +59 -0
  833. package/dist/renderer/cache/markerCommandCache.js.map +1 -0
  834. package/dist/renderer/cache/outlineMeshCache.js +15 -0
  835. package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
  836. package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
  837. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
  838. package/dist/renderer/cache/strokeMeshCache.js +44 -0
  839. package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
  840. package/dist/renderer/cullDrawCommands.js +89 -0
  841. package/dist/renderer/cullDrawCommands.js.map +1 -0
  842. package/dist/renderer/draw.js +1109 -0
  843. package/dist/renderer/draw.js.map +1 -0
  844. package/dist/renderer/drawBatch.js +168 -0
  845. package/dist/renderer/drawBatch.js.map +1 -0
  846. package/dist/renderer/effects/EffectTargets.js +45 -0
  847. package/dist/renderer/effects/EffectTargets.js.map +1 -0
  848. package/dist/renderer/effects/builtins.js +31 -0
  849. package/dist/renderer/effects/builtins.js.map +1 -0
  850. package/dist/renderer/effects/composite.js +9 -0
  851. package/dist/renderer/effects/composite.js.map +1 -0
  852. package/dist/renderer/effects/effectPrelude.js +10 -0
  853. package/dist/renderer/effects/effectPrelude.js.map +1 -0
  854. package/dist/renderer/effects/types.js +10 -0
  855. package/dist/renderer/effects/types.js.map +1 -0
  856. package/dist/renderer/index.js +19 -0
  857. package/dist/renderer/math/color.js +341 -0
  858. package/dist/renderer/math/color.js.map +1 -0
  859. package/dist/renderer/math/mat3.js +71 -0
  860. package/dist/renderer/math/mat3.js.map +1 -0
  861. package/dist/renderer/math/patternSpace.js +22 -0
  862. package/dist/renderer/math/patternSpace.js.map +1 -0
  863. package/dist/renderer/math/viewToMat3.js +19 -0
  864. package/dist/renderer/math/viewToMat3.js.map +1 -0
  865. package/dist/renderer/paintResources.js +18 -0
  866. package/dist/renderer/paintResources.js.map +1 -0
  867. package/dist/renderer/paintScratch.js +37 -0
  868. package/dist/renderer/paintScratch.js.map +1 -0
  869. package/dist/renderer/shaders/ShaderProgram.js +74 -0
  870. package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
  871. package/dist/renderer/shaders/batchFill.js +118 -0
  872. package/dist/renderer/shaders/batchFill.js.map +1 -0
  873. package/dist/renderer/shaders/customPrelude.js +34 -0
  874. package/dist/renderer/shaders/customPrelude.js.map +1 -0
  875. package/dist/renderer/shaders/extractUniformNames.js +184 -0
  876. package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
  877. package/dist/renderer/shaders/glyphPaint.js +61 -0
  878. package/dist/renderer/shaders/glyphPaint.js.map +1 -0
  879. package/dist/renderer/shaders/gradFill.js +30 -0
  880. package/dist/renderer/shaders/gradFill.js.map +1 -0
  881. package/dist/renderer/shaders/imageFill.js +14 -0
  882. package/dist/renderer/shaders/imageFill.js.map +1 -0
  883. package/dist/renderer/shaders/pathFill.js +13 -0
  884. package/dist/renderer/shaders/pathFill.js.map +1 -0
  885. package/dist/renderer/shaders/patternFill.js +24 -0
  886. package/dist/renderer/shaders/patternFill.js.map +1 -0
  887. package/dist/renderer/shaders/registerProgram.js +18 -0
  888. package/dist/renderer/shaders/registerProgram.js.map +1 -0
  889. package/dist/renderer/spriteSheet.js +14 -0
  890. package/dist/renderer/spriteSheet.js.map +1 -0
  891. package/dist/renderer/state/GroupState.js +77 -0
  892. package/dist/renderer/state/GroupState.js.map +1 -0
  893. package/dist/renderer/syntheticItalic.js +6 -0
  894. package/dist/renderer/syntheticItalic.js.map +1 -0
  895. package/dist/renderer/textures/registerTexture.js +14 -0
  896. package/dist/renderer/textures/registerTexture.js.map +1 -0
  897. package/dist/renderer.d.ts +18 -20
  898. package/dist/renderer.js +18 -13
  899. package/dist/resize.d.ts +10 -46
  900. package/dist/resize.js +7 -5
  901. package/dist/routing.d.ts +1 -1
  902. package/dist/routing.js +2 -3
  903. package/dist/scheduling/useVisibleRaf.js +69 -0
  904. package/dist/scheduling/useVisibleRaf.js.map +1 -0
  905. package/dist/test-hook/createTestHook.js +39 -0
  906. package/dist/test-hook/createTestHook.js.map +1 -0
  907. package/dist/test-hook/install.js +12 -0
  908. package/dist/test-hook/install.js.map +1 -0
  909. package/dist/test-seams-fYf6m5pu.d.ts +356 -0
  910. package/dist/test-seams.d.ts +6 -0
  911. package/dist/test-seams.js +3 -0
  912. package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
  913. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
  914. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
  915. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
  916. package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
  917. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
  918. package/dist/tools/builtin/hand/useHandTool.js +31 -0
  919. package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
  920. package/dist/tools/builtin/image/useImageTool.js +41 -0
  921. package/dist/tools/builtin/image/useImageTool.js.map +1 -0
  922. package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
  923. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
  924. package/dist/tools/builtin/line/useLineTool.js +33 -0
  925. package/dist/tools/builtin/line/useLineTool.js.map +1 -0
  926. package/dist/tools/builtin/pen/usePenTool.js +414 -0
  927. package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
  928. package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
  929. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
  930. package/dist/tools/builtin/pickTopMostHit.js +45 -0
  931. package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
  932. package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
  933. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
  934. package/dist/tools/builtin/rect/useRectTool.js +32 -0
  935. package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
  936. package/dist/tools/builtin/select/selectionContributions.js +109 -0
  937. package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
  938. package/dist/tools/builtin/select/useSelectTool.js +162 -0
  939. package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
  940. package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
  941. package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
  942. package/dist/tools/builtin/slice/useSliceTool.js +263 -0
  943. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
  944. package/dist/tools/builtin/star/useStarTool.js +82 -0
  945. package/dist/tools/builtin/star/useStarTool.js.map +1 -0
  946. package/dist/tools/builtin/text/useTextTool.js +177 -0
  947. package/dist/tools/builtin/text/useTextTool.js.map +1 -0
  948. package/dist/tools/overlayBinding.js +8 -0
  949. package/dist/tools/overlayBinding.js.map +1 -0
  950. package/dist/tools/prefs.js +47 -0
  951. package/dist/tools/prefs.js.map +1 -0
  952. package/dist/tools/useKeybindings.js +66 -0
  953. package/dist/tools/useKeybindings.js.map +1 -0
  954. package/dist/{types-CxC8P6W0.d.ts → types-CA54-mAZ.d.ts} +188 -17
  955. package/dist/{types-D_74YlWs.d.ts → types-DSjd6W3n.d.ts} +35 -12
  956. package/dist/util/color.js +26 -0
  957. package/dist/util/color.js.map +1 -0
  958. package/dist/util/constrainTo45.js +17 -0
  959. package/dist/util/constrainTo45.js.map +1 -0
  960. package/dist/util/paint.js +72 -0
  961. package/dist/util/paint.js.map +1 -0
  962. package/dist/version.js +6 -0
  963. package/dist/version.js.map +1 -0
  964. package/package.json +31 -18
  965. package/dist/chunk-44EWMJV2.js +0 -128
  966. package/dist/chunk-44EWMJV2.js.map +0 -1
  967. package/dist/chunk-4RJP2N2L.js +0 -143
  968. package/dist/chunk-4RJP2N2L.js.map +0 -1
  969. package/dist/chunk-BJN5ZRIJ.js +0 -167
  970. package/dist/chunk-BJN5ZRIJ.js.map +0 -1
  971. package/dist/chunk-D4AAWR64.js +0 -28
  972. package/dist/chunk-D4AAWR64.js.map +0 -1
  973. package/dist/chunk-DOBSZOPR.js +0 -29
  974. package/dist/chunk-DOBSZOPR.js.map +0 -1
  975. package/dist/chunk-H6N2JSZ3.js +0 -248
  976. package/dist/chunk-H6N2JSZ3.js.map +0 -1
  977. package/dist/chunk-HPFJUUTF.js +0 -167
  978. package/dist/chunk-HPFJUUTF.js.map +0 -1
  979. package/dist/chunk-L5YNZYEG.js +0 -648
  980. package/dist/chunk-L5YNZYEG.js.map +0 -1
  981. package/dist/chunk-MZAIDI6D.js +0 -32492
  982. package/dist/chunk-MZAIDI6D.js.map +0 -1
  983. package/dist/chunk-PNNZSYRD.js +0 -318
  984. package/dist/chunk-PNNZSYRD.js.map +0 -1
  985. package/dist/chunk-RMR4QMM6.js +0 -250
  986. package/dist/chunk-RMR4QMM6.js.map +0 -1
  987. package/dist/clipboard.js.map +0 -1
  988. package/dist/clone.js.map +0 -1
  989. package/dist/grid-BXdz8GF2.d.ts +0 -158
  990. package/dist/index.css.map +0 -1
  991. package/dist/index.js.map +0 -1
  992. package/dist/insert.d.ts +0 -37
  993. package/dist/insert.js +0 -81
  994. package/dist/insert.js.map +0 -1
  995. package/dist/math.js.map +0 -1
  996. package/dist/move.js.map +0 -1
  997. package/dist/options-CzjxFoYZ.d.ts +0 -67
  998. package/dist/path-JEV2c5If.d.ts +0 -48
  999. package/dist/patterns-builtin.js.map +0 -1
  1000. package/dist/renderer.css +0 -86
  1001. package/dist/renderer.css.map +0 -1
  1002. package/dist/renderer.js.map +0 -1
  1003. package/dist/resize.js.map +0 -1
  1004. package/dist/routing.js.map +0 -1
  1005. package/dist/types-D2tTKEU0.d.ts +0 -18
@@ -0,0 +1,78 @@
1
+ import { dropPoseKeyedMemoSlots as e, nodeMemo as t } from "./nodeMemo.js";
2
+ import { recordDeps as n, sameDeps as r } from "./depMemo.js";
3
+ import { dependencyIdsOf as i } from "./dependents.js";
4
+ import { resolveDerivedPath as a } from "./derivedPath.js";
5
+ //#region src/core/scene/effectivePose.ts
6
+ var o = {
7
+ effective: "kit:derivedPose",
8
+ document: "kit:derivedPose:document"
9
+ }, s = {
10
+ effective: void 0,
11
+ document: "kit:derivedPath:document"
12
+ }, c = /* @__PURE__ */ new Set(), l = 0;
13
+ function u(e, t) {
14
+ return d(e, t, "effective");
15
+ }
16
+ function d(n, a, s) {
17
+ let u = a.derivePose;
18
+ if (u === void 0) return null;
19
+ let d = i(a, n.childrenOf);
20
+ if (d.length === 0) return null;
21
+ if (c.has(a.id)) return l++, null;
22
+ c.add(a.id);
23
+ let p = l;
24
+ try {
25
+ let i = (e) => m(n, e, s), c = !1, h = t(a, o[s], a.pose, () => (c = !0, f(a, u, d.map(i), {
26
+ nodes: [],
27
+ poses: [],
28
+ value: null
29
+ })));
30
+ return !c && !r(h, d, i) && f(a, u, d.map(i), h), l !== p && e(a), h.value;
31
+ } finally {
32
+ c.delete(a.id);
33
+ }
34
+ }
35
+ function f(e, t, r, i) {
36
+ return i.value = t(e, r), n(i, r), i;
37
+ }
38
+ function p(e, t) {
39
+ return m(e, t, "effective");
40
+ }
41
+ function m(e, t, n) {
42
+ let r = e.get(t);
43
+ if (r !== void 0) return new h(e, r, n);
44
+ }
45
+ var h = class {
46
+ source;
47
+ posed;
48
+ reading;
49
+ node;
50
+ pose;
51
+ constructor(e, t, n) {
52
+ this.source = e, this.posed = t, this.reading = n, this.node = t, this.pose = g(e, t, n);
53
+ }
54
+ get path() {
55
+ let { source: e, reading: t } = this;
56
+ return a(this.posed, (n) => m(e, n, t), (t) => e.childrenOf(t), s[t]);
57
+ }
58
+ };
59
+ function g(e, t, n) {
60
+ if (n === "effective") {
61
+ let n = e.overrides.get(t.id)?.pose;
62
+ if (n !== void 0) return n;
63
+ }
64
+ return d(e, t, n) ?? t.pose;
65
+ }
66
+ function _(e, t) {
67
+ return g(e, t, "document");
68
+ }
69
+ function v(e, t) {
70
+ return g(e, t, "effective");
71
+ }
72
+ function y(e) {
73
+ return e.dependsOn !== "children" || e.derivePose === void 0;
74
+ }
75
+ //#endregion
76
+ export { y as definesFrame, p as derivedDepOf, u as derivedPose, _ as documentPose, v as effectivePose };
77
+
78
+ //# sourceMappingURL=effectivePose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effectivePose.js","names":["POSE_SLOT","PATH_SLOT","resolving","cycleHits","derivedPose","derivedPoseIn","source","node","derive","ids","dependencyIdsOf","hitsBefore","depOf","depIn","id","reading","computed","record","nodeMemo","run","sameDeps","dropPoseKeyedMemoSlots","deps","recordDeps","into","derivedDepOf","SceneDep","posed","poseIn","resolveDerivedPath","depId","override","documentPose","effectivePose","definesFrame"],"sources":["../../../src/core/scene/effectivePose.ts"],"sourcesContent":["/**\n * `effectivePose` — the pose to draw, pick and measure a node at.\n *\n * Three answers, in order: the ephemeral override a gesture published, the\n * pose the node derives from its dependencies, or the pose the document\n * stores. Reading `node.pose` directly is how the render and hit-test paths\n * came to disagree about where a node is, and a derived pose widens that gap\n * from \"mid-drag\" to \"always\".\n */\nimport { recordDeps, sameDeps, type DepRecord } from './depMemo';\nimport { dependencyIdsOf } from './dependents';\nimport { resolveDerivedPath } from './derivedPath';\nimport { dropPoseKeyedMemoSlots, nodeMemo } from './nodeMemo';\nimport type { Path } from '@weasel-js/geom';\nimport type { DerivedDep, Node, NodeId, PoseOverrides } from './types';\n\n/**\n * Which pose a resolution answers: `effective` honors overrides all the way\n * down the dependency chain, `document` ignores them all the way down. Each\n * reading memoizes in its own slots — the memo key is the node and its\n * authored pose, which is the same for both.\n */\ntype Reading = 'effective' | 'document';\n\nconst POSE_SLOT: Record<Reading, string> = {\n effective: 'kit:derivedPose',\n document: 'kit:derivedPose:document',\n};\nconst PATH_SLOT: Record<Reading, string | undefined> = {\n effective: undefined,\n document: 'kit:derivedPath:document',\n};\n\n/** The subset of a node this module reads. Structural so a `Node` satisfies\n * it without importing the full generic shape. */\nexport interface PosedNode<TPose> {\n id: NodeId;\n kind?: 'leaf' | 'container';\n pose: TPose;\n /** Read only by the memo, which keys on its reference alongside the pose. */\n data?: unknown;\n dependsOn?: readonly NodeId[] | 'children';\n derivePose?: (\n node: never,\n deps: readonly (DerivedDep<TPose> | undefined)[],\n ) => TPose | null;\n /** Read only when something asks a dependency for its `path`. */\n derivePath?: (\n node: never,\n deps: readonly (DerivedDep<TPose> | undefined)[],\n ) => Path | null;\n}\n\n/** What resolving a pose needs: the overrides, and enough of the scene to\n * reach a node's dependencies. A `Scene` satisfies it. */\nexport interface PoseSource<TPose> {\n readonly overrides: Pick<PoseOverrides<TPose>, 'get'>;\n get(id: NodeId): PosedNode<TPose> | undefined;\n childrenOf(id: NodeId): readonly NodeId[];\n}\n\n/** A cached derived pose, with what it was derived from. */\ninterface PoseMemo<TPose> extends DepRecord<TPose> {\n value: TPose | null;\n}\n\n/** Ids whose derivation is on the stack. A dependency graph is meant to be\n * acyclic and `dependsOn` is unvalidated, so a cycle resolves to the authored\n * pose at whichever node closes it rather than overflowing the stack. */\nconst resolving = new Set<NodeId>();\n\n/** Bumped each time the guard above fires. A derivation that closed a cycle\n * answered from a fallback rather than from its dependencies, so its value is\n * an artifact of which node was asked first and must not be cached. */\nlet cycleHits = 0;\n\n/**\n * The pose `node` computes from its dependencies, or `null` when it derives\n * nothing — it has no `derivePose`, nothing to derive from, or its\n * `derivePose` returned `null`.\n *\n * A dependency is read through {@link effectivePose}, so a group of groups\n * resolves bottom-up and a dragged dependency's override reaches the\n * derivation the same frame it is published.\n */\nexport function derivedPose<TPose>(\n source: PoseSource<TPose>,\n node: PosedNode<TPose>,\n): TPose | null {\n return derivedPoseIn(source, node, 'effective');\n}\n\nfunction derivedPoseIn<TPose>(\n source: PoseSource<TPose>,\n node: PosedNode<TPose>,\n reading: Reading,\n): TPose | null {\n const derive = node.derivePose;\n if (derive === undefined) return null;\n const ids = dependencyIdsOf(node, source.childrenOf);\n if (ids.length === 0) return null;\n if (resolving.has(node.id)) {\n cycleHits++;\n return null;\n }\n resolving.add(node.id);\n const hitsBefore = cycleHits;\n try {\n const depOf = (id: NodeId) => depIn(source, id, reading);\n // Keyed on the authored pose, which is what `dropPoseKeyedMemoSlots`\n // clears. That key only sees a change someone pushed, so the record also\n // carries what the derivation read and re-checks it by value on a hit —\n // see `depMemo.ts`.\n let computed = false;\n const record = nodeMemo<PoseMemo<TPose>>(node, POSE_SLOT[reading], node.pose, () => {\n computed = true;\n return run(node, derive, ids.map(depOf), { nodes: [], poses: [], value: null });\n });\n // Mutating the record in place is what updates the memo slot, which holds\n // this object.\n if (!computed && !sameDeps(record, ids, depOf)) {\n run(node, derive, ids.map(depOf), record);\n }\n if (cycleHits !== hitsBefore) dropPoseKeyedMemoSlots(node);\n return record.value;\n } finally {\n resolving.delete(node.id);\n }\n}\n\n/** Run `derivePose` against `deps` and record what it was run against. */\nfunction run<TPose>(\n node: PosedNode<TPose>,\n derive: NonNullable<PosedNode<TPose>['derivePose']>,\n deps: readonly (DerivedDep<TPose> | undefined)[],\n into: PoseMemo<TPose>,\n): PoseMemo<TPose> {\n into.value = derive(node as never, deps);\n recordDeps(into, deps);\n return into;\n}\n\n/**\n * `id` as a derivation sees it: the node, the pose it is painted at, and the\n * path it derives.\n *\n * The pose is resolved eagerly — every derivation reads it — and the path\n * lazily, because most do not and resolving a route costs a router run. Both\n * resolve *through* this function, so a dependency that is itself derived is\n * resolved before it is read.\n */\nexport function derivedDepOf<TPose>(\n source: PoseSource<TPose>,\n id: NodeId,\n): DerivedDep<TPose> | undefined {\n return depIn(source, id, 'effective');\n}\n\nfunction depIn<TPose>(\n source: PoseSource<TPose>,\n id: NodeId,\n reading: Reading,\n): DerivedDep<TPose> | undefined {\n const node = source.get(id);\n if (node === undefined) return undefined;\n return new SceneDep(source, node, reading);\n}\n\n/**\n * A class rather than an object literal with a `get path()`: one of these is\n * built per dependency per derived node per frame, and an own accessor costs\n * an order of magnitude more to define than a prototype one does to inherit.\n */\nclass SceneDep<TPose> implements DerivedDep<TPose> {\n readonly node: Node<unknown, string, TPose>;\n readonly pose: TPose;\n\n constructor(\n private readonly source: PoseSource<TPose>,\n private readonly posed: PosedNode<TPose>,\n private readonly reading: Reading,\n ) {\n this.node = posed as unknown as Node<unknown, string, TPose>;\n this.pose = poseIn(source, posed, reading);\n }\n\n get path(): Path | null {\n const { source, reading } = this;\n return resolveDerivedPath(\n this.posed,\n (depId) => depIn(source, depId, reading),\n (depId) => source.childrenOf(depId),\n PATH_SLOT[reading],\n );\n }\n}\n\nfunction poseIn<TPose>(\n source: PoseSource<TPose>,\n node: PosedNode<TPose>,\n reading: Reading,\n): TPose {\n if (reading === 'effective') {\n const override = source.overrides.get(node.id)?.pose;\n if (override !== undefined) return override;\n }\n return derivedPoseIn(source, node, reading) ?? node.pose;\n}\n\n/**\n * The pose the *document* says `node` is at: derived when it derives, else\n * authored. `effectivePose` minus the override step, at every link of the\n * dependency chain — a derived node's document pose holds still while\n * something it derives from is being dragged.\n *\n * For a reader that must not see an in-flight gesture — an action capturing\n * the `from` of a transform op, a placement computed against a sibling, the\n * minimap's framing. A derived pose belongs here and an override does not:\n * derivation is what the document means, an override is what one gesture is\n * currently showing.\n */\nexport function documentPose<TPose>(\n source: PoseSource<TPose>,\n node: PosedNode<TPose>,\n): TPose {\n return poseIn(source, node, 'document');\n}\n\n/**\n * The pose to draw, pick and measure `node` at.\n *\n * The one rule. Every pose a reader acts on comes from here: the three render\n * walks, the pick walk, the adapters tools and actions commit through.\n */\nexport function effectivePose<TPose>(\n source: PoseSource<TPose>,\n node: PosedNode<TPose>,\n): TPose {\n return poseIn(source, node, 'effective');\n}\n\n/**\n * Whether `node`'s pose is a frame its children are expressed in, under a\n * composing strategy.\n *\n * A container that derives its pose from its children cannot be one: moving\n * the frame to cover the children would move the children, and a `RectPose`\n * frame's origin is its corner, so no envelope leaves them in place. Such a\n * container is an envelope instead — its children are stored in its own\n * frame — and the composition fold passes over it.\n */\nexport function definesFrame(node: { dependsOn?: unknown; derivePose?: unknown }): boolean {\n return !(node.dependsOn === 'children' && node.derivePose !== undefined);\n}\n"],"mappings":";;;;;AAwBA,IAAMA,IAAqC;CACzC,WAAW;CACX,UAAU;AACZ,GACMC,IAAiD;CACrD,WAAW,KAAA;CACX,UAAU;AACZ,GAsCMC,oBAAY,IAAI,IAAY,GAK9BC,IAAY;AAWhB,SAAgBC,EACd,GACA,GACc;CACd,OAAOC,EAAcC,GAAQC,GAAM,WAAW;AAChD;AAEA,SAASF,EACP,GACA,GACA,GACc;CACd,IAAMG,IAASD,EAAK;CACpB,IAAIC,MAAW,KAAA,GAAW,OAAO;CACjC,IAAMC,IAAMC,EAAgBH,GAAMD,EAAO,UAAU;CACnD,IAAIG,EAAI,WAAW,GAAG,OAAO;CAC7B,IAAIP,EAAU,IAAIK,EAAK,EAAE,GAEvB,OADA,KACO;CAET,EAAU,IAAIA,EAAK,EAAE;CACrB,IAAMI,IAAaR;CACnB,IAAI;EACF,IAAMS,KAAS,MAAeC,EAAMP,GAAQQ,GAAIC,CAAO,GAKnDC,IAAW,IACTC,IAASC,EAA0BX,GAAMP,EAAUe,IAAUR,EAAK,aACtE,IAAW,IACJY,EAAIZ,GAAMC,GAAQC,EAAI,IAAIG,CAAK,GAAG;GAAE,OAAO,CAAC;GAAG,OAAO,CAAC;GAAG,OAAO;EAAK,CAAC,EAC/E;EAOD,OAJI,CAACI,KAAY,CAACI,EAASH,GAAQR,GAAKG,CAAK,KAC3CO,EAAIZ,GAAMC,GAAQC,EAAI,IAAIG,CAAK,GAAGK,CAAM,GAEtCd,MAAcQ,KAAYU,EAAuBd,CAAI,GAClDU,EAAO;CAChB,UAAU;EACR,EAAU,OAAOV,EAAK,EAAE;CAC1B;AACF;AAGA,SAASY,EACP,GACA,GACA,GACA,GACiB;CAGjB,OAFA,EAAK,QAAQX,EAAOD,GAAee,CAAI,GACvCC,EAAWC,GAAMF,CAAI,GACdE;AACT;AAWA,SAAgBC,EACd,GACA,GAC+B;CAC/B,OAAOZ,EAAMP,GAAQQ,GAAI,WAAW;AACtC;AAEA,SAASD,EACP,GACA,GACA,GAC+B;CAC/B,IAAMN,IAAOD,EAAO,IAAIQ,CAAE;CAC1B,IAAIP,MAAS,KAAA,GACb,OAAO,IAAImB,EAASpB,GAAQC,GAAMQ,CAAO;AAC3C;AAOA,IAAMW,IAAN,MAAmD;CAK9B;CACA;CACA;CANnB;CACA;CAEA,YACE,GACA,GACA,GACA;EAEA,AALiB,KAAA,SAAApB,GACA,KAAA,QAAAqB,GACA,KAAA,UAAAZ,GAEjB,KAAK,OAAOY,GACZ,KAAK,OAAOC,EAAOtB,GAAQqB,GAAOZ,CAAO;CAC3C;CAEA,IAAI,OAAoB;EACtB,IAAM,EAAE,WAAQ,eAAY;EAC5B,OAAOc,EACL,KAAK,QACJ,MAAUhB,EAAMP,GAAQwB,GAAOf,CAAO,IACtC,MAAUT,EAAO,WAAWwB,CAAK,GAClC7B,EAAUc,EACZ;CACF;AACF;AAEA,SAASa,EACP,GACA,GACA,GACO;CACP,IAAIb,MAAY,aAAa;EAC3B,IAAMgB,IAAWzB,EAAO,UAAU,IAAIC,EAAK,EAAE,CAAC,EAAE;EAChD,IAAIwB,MAAa,KAAA,GAAW,OAAOA;CACrC;CACA,OAAO1B,EAAcC,GAAQC,GAAMQ,CAAO,KAAKR,EAAK;AACtD;AAcA,SAAgByB,EACd,GACA,GACO;CACP,OAAOJ,EAAOtB,GAAQC,GAAM,UAAU;AACxC;AAQA,SAAgB0B,EACd,GACA,GACO;CACP,OAAOL,EAAOtB,GAAQC,GAAM,WAAW;AACzC;AAYA,SAAgB2B,EAAa,GAA8D;CACzF,OAAS3B,EAAK,cAAc,cAAcA,EAAK,eAAe,KAAA;AAChE"}
@@ -0,0 +1,33 @@
1
+ import { unionAABB as e } from "../geometry/unionBounds.js";
2
+ //#region src/core/scene/kitRegistry.ts
3
+ var t = "kit:unionOfChildren";
4
+ function n(t, n) {
5
+ let i = [];
6
+ for (let e of n) {
7
+ if (e === void 0) continue;
8
+ let t = r(e.pose);
9
+ if (t === null) return null;
10
+ i.push(t);
11
+ }
12
+ if (i.length === 0) return null;
13
+ let a = e(i);
14
+ return a === null ? null : a;
15
+ }
16
+ function r(e) {
17
+ if (typeof e != "object" || !e) return null;
18
+ let t = e;
19
+ return typeof t.x == "number" && typeof t.y == "number" && typeof t.width == "number" && typeof t.height == "number" ? e : null;
20
+ }
21
+ function i(e) {
22
+ return {
23
+ ...e,
24
+ derivePose: {
25
+ [t]: n,
26
+ ...e.derivePose
27
+ }
28
+ };
29
+ }
30
+ //#endregion
31
+ export { t as UNION_OF_CHILDREN, r as asRectPose, n as unionOfChildren, i as withKitRegistry };
32
+
33
+ //# sourceMappingURL=kitRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kitRegistry.js","names":["UNION_OF_CHILDREN","unionOfChildren","poses","d","deps","rect","asRectPose","union","unionAABB","pose","p","withKitRegistry","registry"],"sources":["../../../src/core/scene/kitRegistry.ts"],"sourcesContent":["/**\n * The `SceneRegistry` entries the kit owns.\n *\n * A registry-keyed function has to be resolvable by key in whatever scene\n * loads a snapshot, so a function the *kit* attaches to a node cannot live in\n * the consumer's registry alone — a document saved with a grouped container\n * would come back with a dead key. `createScene` merges these under the\n * consumer's, which stays the winner on a key collision.\n */\nimport { unionAABB } from '../geometry/unionBounds';\nimport type { RectPose, SceneRegistry } from './types';\n\n/** Registry key for {@link unionOfChildren}. */\nexport const UNION_OF_CHILDREN = 'kit:unionOfChildren';\n\n/**\n * A container's pose as the envelope of what it holds — `unionAABB`, so a\n * rotated member contributes the extent of its ink rather than its unrotated\n * box. Paired with `dependsOn: 'children'`, this is what makes a group's\n * bounds track its members instead of freezing at the moment it was made.\n *\n * Its members and its result share one frame: a container deriving its pose\n * from its children defines none of its own (see `definesFrame`), so the same\n * union is right under any composition strategy.\n *\n * Returns `null` for an emptied container, which falls back to its authored\n * pose — the group stays where the last member left it rather than collapsing\n * to a zero box at the origin.\n *\n * Reads members as rect poses, and only as rect poses: a scene whose poses are\n * shaped otherwise gets `null` here and its container keeps its authored pose,\n * because this entry is registered into every scene and the scene layer holds\n * no descriptor to read another shape with. To make such a container track its\n * members, register `unionOfChildrenVia(itsDescriptor)` under\n * {@link UNION_OF_CHILDREN} — the consumer's entry wins the collision.\n */\nexport function unionOfChildren<TPose>(\n _node: unknown,\n deps: readonly ({ pose: TPose } | undefined)[],\n): TPose | null {\n const poses: RectPose[] = [];\n for (const d of deps) {\n if (d === undefined) continue;\n const rect = asRectPose(d.pose);\n if (rect === null) return null;\n poses.push(rect);\n }\n if (poses.length === 0) return null;\n const union = unionAABB(poses);\n // Sound by the check above: every member read as a rect, so the union is one\n // too, and a scene holding rect poses is a scene whose `TPose` is one.\n return union === null ? null : (union as unknown as TPose);\n}\n\n/** `pose` as a rect, or `null` when it is some other shape entirely. */\nexport function asRectPose(pose: unknown): RectPose | null {\n if (pose === null || typeof pose !== 'object') return null;\n const p = pose as Partial<RectPose>;\n const rect = typeof p.x === 'number' && typeof p.y === 'number'\n && typeof p.width === 'number' && typeof p.height === 'number';\n return rect ? (pose as RectPose) : null;\n}\n\n/** Merge the kit's own entries under a consumer registry. */\nexport function withKitRegistry<TPose>(registry: SceneRegistry<TPose>): SceneRegistry<TPose> {\n return {\n ...registry,\n derivePose: {\n [UNION_OF_CHILDREN]: unionOfChildren as NonNullable<\n SceneRegistry<TPose>['derivePose']\n >[string],\n ...registry.derivePose,\n },\n };\n}\n"],"mappings":";;AAaA,IAAaA,IAAoB;AAuBjC,SAAgBC,EACd,GACA,GACc;CACd,IAAMC,IAAoB,CAAC;CAC3B,KAAK,IAAMC,KAAKC,GAAM;EACpB,IAAID,MAAM,KAAA,GAAW;EACrB,IAAME,IAAOC,EAAWH,EAAE,IAAI;EAC9B,IAAIE,MAAS,MAAM,OAAO;EAC1B,EAAM,KAAKA,CAAI;CACjB;CACA,IAAIH,EAAM,WAAW,GAAG,OAAO;CAC/B,IAAMK,IAAQC,EAAUN,CAAK;CAG7B,OAAOK,MAAU,OAAO,OAAQA;AAClC;AAGA,SAAgBD,EAAW,GAAgC;CACzD,IAAqB,OAAOG,KAAS,aAAjCA,GAA2C,OAAO;CACtD,IAAMC,IAAID;CAGV,OAFa,OAAOC,EAAE,KAAM,YAAY,OAAOA,EAAE,KAAM,YAClD,OAAOA,EAAE,SAAU,YAAY,OAAOA,EAAE,UAAW,WACzCD,IAAoB;AACrC;AAGA,SAAgBE,EAAuB,GAAsD;CAC3F,OAAO;EACL,GAAGC;EACH,YAAY;IACTZ,IAAoBC;GAGrB,GAAGW,EAAS;EACd;CACF;AACF"}
@@ -0,0 +1,96 @@
1
+ import { IDENTITY_POSE_COMPOSITION as e, composeWorldPose as t, rebaseLocalPose as n } from "./composeFrame.js";
2
+ import { samePoseValue as r } from "./poseSnapshot.js";
3
+ import { definesFrame as i, documentPose as a } from "./effectivePose.js";
4
+ import { asRectPose as o } from "./kitRegistry.js";
5
+ //#region src/core/scene/layoutPass.ts
6
+ function s(t) {
7
+ return {
8
+ bounds: t?.bounds ?? ((e) => {
9
+ let t = o(e);
10
+ return t === null ? null : {
11
+ x: t.x,
12
+ y: t.y,
13
+ width: t.width,
14
+ height: t.height
15
+ };
16
+ }),
17
+ remap: t?.remap ?? ((e, t, n) => ({
18
+ ...e,
19
+ ...n
20
+ })),
21
+ composition: t?.composition ?? e
22
+ };
23
+ }
24
+ function c(e, t, n, r) {
25
+ let i = e.bounds(n, t), a = e.bounds(r, t);
26
+ return i === null || a === null ? i !== a : i.width !== a.width || i.height !== a.height;
27
+ }
28
+ var l = 16;
29
+ function u(e, o, s, u, d, f = /* @__PURE__ */ new Map()) {
30
+ let p = /* @__PURE__ */ new Map(), m = (t) => p.get(t) ?? a(e, e.get(t)), h = {
31
+ getPose: (e) => m(e),
32
+ getParent: (t) => e.get(t)?.parent ?? null,
33
+ definesFrame: (t) => {
34
+ let n = e.get(t);
35
+ return n === void 0 || i(n);
36
+ }
37
+ }, { compose: g, decompose: _ } = d.composition, v = (e) => t(h, e, g), y = [.../* @__PURE__ */ new Set([...s.keys(), ...u])], b = /* @__PURE__ */ new Map(), x = (t, n) => {
38
+ let i = e.get(t), a = m(t);
39
+ r(a, n) || (p.set(t, n), t !== S && i.kind === "container" && o(t) !== null && c(d, t, a, n) && y.push(t));
40
+ }, S = null, C = (t) => {
41
+ let n = v(t), r = d.bounds(n, t);
42
+ if (r === null) return null;
43
+ let i = e.childrenOf(t).map((e) => ({
44
+ id: e,
45
+ pose: v(e)
46
+ }));
47
+ return {
48
+ world: n,
49
+ container: {
50
+ id: t,
51
+ bounds: r
52
+ },
53
+ children: i
54
+ };
55
+ }, w = (t, r, i) => {
56
+ if (i.bounds) {
57
+ let a = e.get(t), o = d.remap(r.world, r.container.bounds, i.bounds, t);
58
+ x(t, n(h, o, a.parent, g, _));
59
+ }
60
+ for (let [r, a] of i.poses) {
61
+ let i = r;
62
+ e.get(i)?.parent === t && x(i, n(h, a, t, g, _));
63
+ }
64
+ };
65
+ for (; y.length > 0;) {
66
+ let t = y.shift();
67
+ S = t;
68
+ let n = (b.get(t) ?? 0) + 1;
69
+ if (b.set(t, n), n > l) continue;
70
+ let r = o(t);
71
+ if (r === null || e.get(t) === void 0) continue;
72
+ let i = n === 1 ? s.get(t) : void 0, a = n === 1 ? f.get(t) : void 0, c = !1;
73
+ if (a !== void 0 && r.depart) {
74
+ let e = C(t);
75
+ if (e === null) continue;
76
+ let n = new Set(i ?? []), o = e.children.filter((e) => !n.has(e.id));
77
+ w(t, e, r.depart(e.container, o, new Set(a))), c = !0;
78
+ }
79
+ if (i !== void 0 && r.arrive) {
80
+ let e = C(t);
81
+ if (e === null) continue;
82
+ let n = r.arrive(e.container, e.children, new Set(i));
83
+ if (n === null) return null;
84
+ w(t, e, n);
85
+ } else if (!c || i !== void 0) {
86
+ let e = C(t);
87
+ if (e === null) continue;
88
+ w(t, e, { poses: r.childPoses(e.container, e.children) });
89
+ }
90
+ }
91
+ return p;
92
+ }
93
+ //#endregion
94
+ export { c as resized, s as resolveLayoutFrame, u as runLayoutPass };
95
+
96
+ //# sourceMappingURL=layoutPass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layoutPass.js","names":["resolveLayoutFrame","frame","r","asRectPose","pose","to","IDENTITY_POSE_COMPOSITION","resized","a","from","id","b","MAX_PASSES","runLayoutPass","out","poseOf","documentPose","source","pa","node","definesFrame","world","composeWorldPose","compose","queue","arrivals","changed","passes","write","before","samePoseValue","current","layoutOf","frameOf","containerId","bounds","children","cid","apply","result","sized","at","rebaseLocalPose","decompose","layout","joined","left","departures","arranged","joinedSet","staying","c"],"sources":["../../../src/core/scene/layoutPass.ts"],"sourcesContent":["/**\n * The one computation behind a scene's container layouts: given the\n * containers one edit changed, the pose writes their layouts ask for.\n *\n * A container that lost children and whose strategy has `depart` rearranges\n * the rest through it (and may shrink). One that gained children and whose\n * strategy has `arrive` then places them through it (and may refuse, or\n * grow). Any other changed container — one that reordered children, was\n * resized, or gained or lost children with neither hook — is put back in its\n * resting arrangement, `childPoses`.\n *\n * `LayoutStrategy` is world-framed, so each pose is composed to world before\n * a strategy sees it and each result is rebased into its node's parent frame\n * after. A child already where the strategy puts it is left out, so a pass\n * that changes nothing writes nothing. A container this pass resizes is\n * arranged in turn, so nested layouts settle in the same edit.\n */\nimport {\n IDENTITY_POSE_COMPOSITION,\n composeWorldPose,\n rebaseLocalPose,\n type PoseAdapter,\n type PoseComposition,\n} from './composeFrame';\nimport type { ContainerBounds, LayoutArrival, LayoutChild, LayoutStrategy } from '../../layout/types';\nimport { definesFrame, documentPose, type PoseSource, type PosedNode } from './effectivePose';\nimport { asRectPose } from './kitRegistry';\nimport { samePoseValue } from './poseSnapshot';\nimport type { LayoutFrame, NodeId } from './types';\n\n/** What the pass reads a scene through. */\nexport interface LayoutPassSource<TPose> extends PoseSource<TPose> {\n get(id: NodeId): (PosedNode<TPose> & { parent: NodeId | null }) | undefined;\n}\n\n/** How the pass measures and resizes poses, with every default filled. */\nexport interface ResolvedLayoutFrame<TPose> {\n bounds(pose: TPose, id: NodeId): ContainerBounds | null;\n remap(pose: TPose, from: ContainerBounds, to: ContainerBounds, id: NodeId): TPose;\n composition: PoseComposition<TPose>;\n}\n\n/** The pose writes one edit's layouts ask for, or `null` when a strategy\n * refused the children that joined it. */\nexport type LayoutPassResult<TPose> = Map<NodeId, TPose> | null;\n\nexport function resolveLayoutFrame<TPose>(frame: LayoutFrame<TPose> | undefined): ResolvedLayoutFrame<TPose> {\n return {\n bounds: frame?.bounds ?? ((pose) => {\n const r = asRectPose(pose);\n return r === null ? null : { x: r.x, y: r.y, width: r.width, height: r.height };\n }),\n remap: frame?.remap ?? ((pose, _from, to) => ({ ...(pose as object), ...to }) as TPose),\n composition: frame?.composition ?? (IDENTITY_POSE_COMPOSITION as PoseComposition<TPose>),\n };\n}\n\n/** Whether a node going from `from` to `to` changed size. */\nexport function resized<TPose>(frame: ResolvedLayoutFrame<TPose>, id: NodeId, from: TPose, to: TPose): boolean {\n const a = frame.bounds(from, id);\n const b = frame.bounds(to, id);\n if (a === null || b === null) return a !== b;\n return a.width !== b.width || a.height !== b.height;\n}\n\n/** How many times one pass may arrange a container before giving up on it —\n * only nested layouts that keep resizing each other get close. */\nconst MAX_PASSES = 16;\n\nexport function runLayoutPass<TPose>(\n source: LayoutPassSource<TPose>,\n layoutOf: (id: NodeId) => LayoutStrategy<TPose> | null,\n arrivals: ReadonlyMap<NodeId, readonly NodeId[]>,\n changed: ReadonlySet<NodeId>,\n frame: ResolvedLayoutFrame<TPose>,\n departures: ReadonlyMap<NodeId, readonly NodeId[]> = new Map(),\n): LayoutPassResult<TPose> {\n // Poses already decided in this pass, so a container resized here is the\n // frame its children are rebased into.\n const out = new Map<NodeId, TPose>();\n const poseOf = (id: NodeId): TPose => out.get(id) ?? documentPose(source, source.get(id)!);\n const pa: PoseAdapter<TPose> = {\n getPose: (id) => poseOf(id as NodeId),\n getParent: (id) => source.get(id as NodeId)?.parent ?? null,\n definesFrame: (id) => {\n const node = source.get(id as NodeId);\n return node === undefined || definesFrame(node);\n },\n };\n const { compose, decompose } = frame.composition;\n const world = (id: NodeId): TPose => composeWorldPose(pa, id, compose);\n\n const queue: NodeId[] = [...new Set<NodeId>([...arrivals.keys(), ...changed])];\n const passes = new Map<NodeId, number>();\n const write = (id: NodeId, pose: TPose): void => {\n const node = source.get(id)!;\n const before = poseOf(id);\n if (samePoseValue(before, pose)) return;\n out.set(id, pose);\n // A container its own `depart` or `arrive` resized is arranged already.\n if (id !== current && node.kind === 'container' && layoutOf(id) !== null\n && resized(frame, id, before, pose)) queue.push(id);\n };\n let current: NodeId | null = null;\n\n /** The container and its children as the strategy sees them, in world,\n * with every write this pass has made so far folded in. */\n const frameOf = (containerId: NodeId) => {\n const pose = world(containerId);\n const bounds = frame.bounds(pose, containerId);\n if (bounds === null) return null;\n const children: LayoutChild<TPose>[] = source.childrenOf(containerId).map((cid) => ({\n id: cid as string,\n pose: world(cid),\n }));\n return { world: pose, container: { id: containerId as string, bounds }, children };\n };\n const apply = (\n containerId: NodeId,\n at: NonNullable<ReturnType<typeof frameOf>>,\n result: LayoutArrival<TPose>,\n ): void => {\n if (result.bounds) {\n const node = source.get(containerId)!;\n const sized = frame.remap(at.world, at.container.bounds, result.bounds, containerId);\n write(containerId, rebaseLocalPose(pa, sized, node.parent, compose, decompose));\n }\n for (const [cid, pose] of result.poses) {\n const id = cid as NodeId;\n if (source.get(id)?.parent !== containerId) continue;\n write(id, rebaseLocalPose(pa, pose, containerId, compose, decompose));\n }\n };\n\n while (queue.length > 0) {\n const containerId = queue.shift()!;\n current = containerId;\n const n = (passes.get(containerId) ?? 0) + 1;\n passes.set(containerId, n);\n if (n > MAX_PASSES) continue;\n const layout = layoutOf(containerId);\n if (layout === null || source.get(containerId) === undefined) continue;\n const joined = n === 1 ? arrivals.get(containerId) : undefined;\n const left = n === 1 ? departures.get(containerId) : undefined;\n let arranged = false;\n if (left !== undefined && layout.depart) {\n const at = frameOf(containerId);\n if (at === null) continue;\n const joinedSet = new Set<string>(joined ?? []);\n const staying = at.children.filter((c) => !joinedSet.has(c.id));\n apply(containerId, at, layout.depart(at.container, staying, new Set<string>(left)));\n arranged = true;\n }\n if (joined !== undefined && layout.arrive) {\n const at = frameOf(containerId);\n if (at === null) continue;\n const result = layout.arrive(at.container, at.children, new Set<string>(joined));\n if (result === null) return null;\n apply(containerId, at, result);\n } else if (!arranged || joined !== undefined) {\n const at = frameOf(containerId);\n if (at === null) continue;\n apply(containerId, at, { poses: layout.childPoses(at.container, at.children) });\n }\n }\n return out;\n}\n"],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ //#region src/core/scene/nodeFnFields.ts
2
+ var e = [
3
+ {
4
+ field: "clipFromPose",
5
+ opKey: "clipKey",
6
+ jsonKey: "clipFromPoseKey",
7
+ containersOnly: !0,
8
+ lost: "clip"
9
+ },
10
+ {
11
+ field: "derivePath",
12
+ opKey: "derivePathKey",
13
+ jsonKey: "derivePathKey",
14
+ containersOnly: !1,
15
+ lost: "derived path"
16
+ },
17
+ {
18
+ field: "derivePose",
19
+ opKey: "derivePoseKey",
20
+ jsonKey: "derivePoseKey",
21
+ containersOnly: !1,
22
+ lost: "derived pose"
23
+ },
24
+ {
25
+ field: "layout",
26
+ opKey: "layoutKey",
27
+ jsonKey: "layoutKey",
28
+ containersOnly: !0,
29
+ lost: "layout"
30
+ }
31
+ ];
32
+ function t(t) {
33
+ return e.map((e) => {
34
+ let n = t[e.field], r = /* @__PURE__ */ new Map();
35
+ if (n) for (let [e, t] of Object.entries(n)) r.set(t, e);
36
+ let i = /* @__PURE__ */ new Map(), a = (t) => !e.containersOnly || t.kind === "container";
37
+ return {
38
+ spec: e,
39
+ keyOf: (e) => r.get(e),
40
+ fnOf: (e) => n?.[e],
41
+ read: (t) => a(t) ? t[e.field] : void 0,
42
+ write: (t, n) => {
43
+ a(t) && (t[e.field] = n);
44
+ },
45
+ pending: i
46
+ };
47
+ });
48
+ }
49
+ function n(e, t, n, r, i) {
50
+ let a = e.fnOf(n);
51
+ if (a === void 0) {
52
+ i("scene", `${r}: ${e.spec.opKey} "${n}" not in this scene's registry — node "${t.id}" restored without its ${e.spec.lost}. Register a function with this key in the registry option to restore it.`);
53
+ return;
54
+ }
55
+ e.write(t, a), e.pending.set(t.id, a);
56
+ }
57
+ function r(e, t, n, r) {
58
+ let i = {};
59
+ for (let a of e) {
60
+ let e = a.read(t);
61
+ if (e === void 0) continue;
62
+ let o = a.keyOf(e);
63
+ if (o === void 0) {
64
+ r?.(a);
65
+ continue;
66
+ }
67
+ i[a.spec[n]] = o;
68
+ }
69
+ return i;
70
+ }
71
+ function i(t) {
72
+ let n = t, r = {};
73
+ for (let i of e) {
74
+ if (i.containersOnly && t.kind !== "container") continue;
75
+ let e = n[i.field];
76
+ e !== void 0 && (r[i.field] = e);
77
+ }
78
+ return r;
79
+ }
80
+ //#endregion
81
+ export { e as NODE_FN_FIELDS, t as createNodeFnFields, i as fnFieldsOfNode, r as fnKeysOf, n as restoreFn };
82
+
83
+ //# sourceMappingURL=nodeFnFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeFnFields.js","names":["NODE_FN_FIELDS","createNodeFnFields","table","registry","spec","reverse","key","fn","pending","applies","node","restoreFn","field","site","fnKeysOf","out","fields","which","fnFieldsOfNode","src"],"sources":["../../../src/core/scene/nodeFnFields.ts"],"sourcesContent":["/**\n * The registry-keyed function fields a node can carry, as a table.\n *\n * `clipFromPose`, `derivePath` and `derivePose` are live functions on a node,\n * and a function travels through neither a serializable op payload nor a JSON\n * snapshot. Each one therefore needs the same six things: a function→key\n * reverse map, a side-channel cache the `kit:add` redo path re-attaches from,\n * a name in the op payload, a name in the snapshot, a registry lookup on\n * restore, and a prune when history evicts the entry that could reach it.\n *\n * The first two fields were written out twice, and `types.ts` said in a\n * comment that a third should be the point it stopped being copied per field.\n * This is that point.\n */\nimport type { NodeId, SceneRegistry } from './types';\n\n/** A node's function field, opaque here: the table moves these around by\n * reference and never calls one. Each field's real signature lives on `Node`.\n * A container's `layout` is an object rather than a function, and rides the\n * same table for the same reason — it travels by reference, not as data. */\nexport type NodeFn = ((...args: never[]) => unknown) | object;\n\n/** A node as this module reads it — a bag with the three fields on it. The\n * full `Node` type would make the table generic in `TData`/`TLayer` for no\n * gain; nothing here looks at either. */\nexport type FnBearingNode = { id: NodeId; kind: 'leaf' | 'container' } & {\n [K in NodeFnFieldName]?: NodeFn;\n};\n\nexport type NodeFnFieldName = 'clipFromPose' | 'derivePath' | 'derivePose' | 'layout';\n\nexport interface NodeFnFieldSpec {\n /** The field's name on `Node` — and, deliberately, its name in\n * `SceneRegistry` too, so one string indexes both. */\n readonly field: NodeFnFieldName;\n /** Its key in the `kit:add` and `kit:remove` op payloads. `clipFromPose`'s\n * is the short one because a persisted history already carries that name. */\n readonly opKey: string;\n /** Its key in a `SerializedNode`. */\n readonly jsonKey: string;\n /** True for a field only a `ContainerNode` can carry. */\n readonly containersOnly: boolean;\n /** What a node loses when its key is not in the registry, for the warning. */\n readonly lost: string;\n}\n\nexport const NODE_FN_FIELDS: readonly NodeFnFieldSpec[] = [\n {\n field: 'clipFromPose',\n opKey: 'clipKey',\n jsonKey: 'clipFromPoseKey',\n containersOnly: true,\n lost: 'clip',\n },\n {\n field: 'derivePath',\n opKey: 'derivePathKey',\n jsonKey: 'derivePathKey',\n containersOnly: false,\n lost: 'derived path',\n },\n {\n field: 'derivePose',\n opKey: 'derivePoseKey',\n jsonKey: 'derivePoseKey',\n containersOnly: false,\n lost: 'derived pose',\n },\n {\n field: 'layout',\n opKey: 'layoutKey',\n jsonKey: 'layoutKey',\n containersOnly: true,\n lost: 'layout',\n },\n];\n\n/** One field's per-scene state. */\nexport interface NodeFnField {\n readonly spec: NodeFnFieldSpec;\n /** `fn → registry key`, for writing a payload or a snapshot. */\n keyOf(fn: NodeFn): string | undefined;\n /** `registry key → fn`, for restoring one. */\n fnOf(key: string): NodeFn | undefined;\n /** The function on `node`, or `undefined` — including when the field is\n * container-only and `node` is a leaf. */\n read(node: FnBearingNode): NodeFn | undefined;\n /** Attach `fn` to `node`, ignoring a container-only field on a leaf. */\n write(node: FnBearingNode, fn: NodeFn): void;\n /** The redo side-channel: `kit:add` replays without the original spec, so\n * the function it should re-attach is cached here by node id. */\n readonly pending: Map<NodeId, NodeFn>;\n}\n\nexport function createNodeFnFields<TPose>(registry: SceneRegistry<TPose>): readonly NodeFnField[] {\n return NODE_FN_FIELDS.map((spec) => {\n const table = registry[spec.field] as Readonly<Record<string, NodeFn>> | undefined;\n const reverse = new Map<NodeFn, string>();\n if (table) for (const [key, fn] of Object.entries(table)) reverse.set(fn, key);\n const pending = new Map<NodeId, NodeFn>();\n const applies = (node: FnBearingNode): boolean =>\n !spec.containersOnly || node.kind === 'container';\n return {\n spec,\n keyOf: (fn) => reverse.get(fn),\n fnOf: (key) => table?.[key],\n read: (node) => (applies(node) ? node[spec.field] : undefined),\n write: (node, fn) => {\n if (applies(node)) node[spec.field] = fn;\n },\n pending,\n };\n });\n}\n\n/**\n * Attach the function `key` names to `node`, seeding the redo cache so later\n * undo/redo cycles behave like the live path. Warns and leaves the field\n * unset when the key is not in this scene's registry — a snapshot outliving\n * the code that registered its functions must still load.\n */\nexport function restoreFn(\n field: NodeFnField,\n node: FnBearingNode,\n key: string,\n site: string,\n warn: (channel: string, message: string) => void,\n): void {\n const fn = field.fnOf(key);\n if (fn === undefined) {\n warn(\n 'scene',\n `${site}: ${field.spec.opKey} \"${key}\" not in this scene's registry — node \"${node.id}\" ` +\n `restored without its ${field.spec.lost}. Register a function with this key in the ` +\n `registry option to restore it.`,\n );\n return;\n }\n field.write(node, fn);\n field.pending.set(node.id, fn);\n}\n\n/** The `{ clipKey?, derivePathKey?, … }` an op payload or a snapshot carries\n * for `node`. Empty when the node has no keyed function on it. */\nexport function fnKeysOf(\n fields: readonly NodeFnField[],\n node: FnBearingNode,\n which: 'opKey' | 'jsonKey',\n onUnregistered?: (field: NodeFnField) => never,\n): Record<string, string> {\n const out: Record<string, string> = {};\n for (const field of fields) {\n const fn = field.read(node);\n if (fn === undefined) continue;\n const key = field.keyOf(fn);\n if (key === undefined) {\n onUnregistered?.(field);\n continue;\n }\n out[field.spec[which]] = key;\n }\n return out;\n}\n\n/**\n * The function fields to carry from a live node into an `AddNodeSpec`. An\n * insert that drops them brings an edge back as a static path that never\n * follows its endpoints again, and a clipped container back with nothing\n * clipped.\n */\nexport function fnFieldsOfNode<T extends { kind: 'leaf' | 'container' }>(\n node: T,\n): Partial<Pick<T, Extract<NodeFnFieldName, keyof T>>> {\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const spec of NODE_FN_FIELDS) {\n if (spec.containersOnly && node.kind !== 'container') continue;\n const fn = src[spec.field];\n if (fn !== undefined) out[spec.field] = fn;\n }\n return out as Partial<Pick<T, Extract<NodeFnFieldName, keyof T>>>;\n}\n"],"mappings":";AA8CA,IAAaA,IAA6C;CACxD;EACE,OAAO;EACP,OAAO;EACP,SAAS;EACT,gBAAgB;EAChB,MAAM;CACR;CACA;EACE,OAAO;EACP,OAAO;EACP,SAAS;EACT,gBAAgB;EAChB,MAAM;CACR;CACA;EACE,OAAO;EACP,OAAO;EACP,SAAS;EACT,gBAAgB;EAChB,MAAM;CACR;CACA;EACE,OAAO;EACP,OAAO;EACP,SAAS;EACT,gBAAgB;EAChB,MAAM;CACR;AACF;AAmBA,SAAgBC,EAA0B,GAAwD;CAChG,OAAOD,EAAe,KAAK,MAAS;EAClC,IAAME,IAAQC,EAASC,EAAK,QACtBC,oBAAU,IAAI,IAAoB;EACxC,IAAIH,GAAO,KAAK,IAAM,CAACI,GAAKC,MAAO,OAAO,QAAQL,CAAK,GAAG,EAAQ,IAAIK,GAAID,CAAG;EAC7E,IAAME,oBAAU,IAAI,IAAoB,GAClCC,KAAW,MACf,CAACL,EAAK,kBAAkBM,EAAK,SAAS;EACxC,OAAO;GACL;GACA,QAAQ,MAAOL,EAAQ,IAAIE,CAAE;GAC7B,OAAO,MAAQL,IAAQI;GACvB,OAAO,MAAUG,EAAQC,CAAI,IAAIA,EAAKN,EAAK,SAAS,KAAA;GACpD,QAAQ,GAAM,MAAO;IACnB,AAAIK,EAAQC,CAAI,MAAG,EAAKN,EAAK,SAASG;GACxC;GACA;EACF;CACF,CAAC;AACH;AAQA,SAAgBI,EACd,GACA,GACA,GACA,GACA,GACM;CACN,IAAMJ,IAAKK,EAAM,KAAKN,CAAG;CACzB,IAAIC,MAAO,KAAA,GAAW;EACpB,EACE,SACA,GAAGM,EAAK,IAAID,EAAM,KAAK,MAAM,IAAIN,EAAI,yCAAyCI,EAAK,GAAG,yBAC5DE,EAAM,KAAK,KAAK,0EAE5C;EACA;CACF;CAEA,AADAA,EAAM,MAAMF,GAAMH,CAAE,GACpBK,EAAM,QAAQ,IAAIF,EAAK,IAAIH,CAAE;AAC/B;AAIA,SAAgBO,EACd,GACA,GACA,GACA,GACwB;CACxB,IAAMC,IAA8B,CAAC;CACrC,KAAK,IAAMH,KAASI,GAAQ;EAC1B,IAAMT,IAAKK,EAAM,KAAKF,CAAI;EAC1B,IAAIH,MAAO,KAAA,GAAW;EACtB,IAAMD,IAAMM,EAAM,MAAML,CAAE;EAC1B,IAAID,MAAQ,KAAA,GAAW;GACrB,IAAiBM,CAAK;GACtB;EACF;EACA,EAAIA,EAAM,KAAKK,MAAUX;CAC3B;CACA,OAAOS;AACT;AAQA,SAAgBG,EACd,GACqD;CACrD,IAAMC,IAAMT,GACNK,IAA+B,CAAC;CACtC,KAAK,IAAMX,KAAQJ,GAAgB;EACjC,IAAII,EAAK,kBAAkBM,EAAK,SAAS,aAAa;EACtD,IAAMH,IAAKY,EAAIf,EAAK;EACpB,AAAIG,MAAO,KAAA,MAAW,EAAIH,EAAK,SAASG;CAC1C;CACA,OAAOQ;AACT"}
@@ -0,0 +1,28 @@
1
+ //#region src/core/scene/nodeMemo.ts
2
+ var e = /* @__PURE__ */ new WeakMap(), t = 0;
3
+ function n(n, r, i, a) {
4
+ let o = e.get(n);
5
+ o === void 0 ? (o = {
6
+ generation: t,
7
+ slots: /* @__PURE__ */ new Map()
8
+ }, e.set(n, o)) : o.generation !== t && (o.generation = t, o.slots.clear());
9
+ let s = n.data, c = o.slots.get(r);
10
+ if (c !== void 0 && c.pose === i && c.data === s) return c.value;
11
+ let l = a();
12
+ return c === void 0 ? o.slots.set(r, {
13
+ pose: i,
14
+ data: s,
15
+ value: l
16
+ }) : (c.pose = i, c.data = s, c.value = l), l;
17
+ }
18
+ function r() {
19
+ t++;
20
+ }
21
+ function i(t) {
22
+ let n = e.get(t);
23
+ if (n !== void 0) for (let [e, t] of n.slots) t.pose !== void 0 && n.slots.delete(e);
24
+ }
25
+ //#endregion
26
+ export { r as bumpNodeMemoGeneration, i as dropPoseKeyedMemoSlots, n as nodeMemo };
27
+
28
+ //# sourceMappingURL=nodeMemo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeMemo.js","names":["MEMO","generation","nodeMemo","record","node","data","hit","slot","pose","value","derive","bumpNodeMemoGeneration","dropPoseKeyedMemoSlots","entry"],"sources":["../../../src/core/scene/nodeMemo.ts"],"sourcesContent":["/**\n * `nodeMemo` — memoize anything derived from a node, keyed on the node's\n * identity plus the `pose` / `data` references the scene swaps on every edit.\n *\n * **Why this key works.** The scene mutates node objects in place but\n * *replaces* `pose` and `data` with new references — see the `kit:setPose` /\n * `kit:setData` ops in `core/scene/scene.ts`, which do `node.pose = p.to` /\n * `node.data = p.to`. So the node object is a stable identity, and those two\n * references are an exact freshness signal for anything derived per node: no\n * deep compare, no dirty flag, no subscription. The whole memo is three\n * reference comparisons.\n *\n * The assumption it rests on is the other side of that contract: nobody\n * mutates `node.data` (or `node.pose`) in place without replacing the\n * reference. A consumer who violates it sees a stale derivation until the next\n * real edit.\n *\n * **What the key does not cover** is ambient state that `derive` reads — a\n * registry, a font set, a decode cache. Those change what `derive` would\n * return with no change to the node at all, which is the one failure a\n * `(pose, data)` key cannot see. {@link bumpNodeMemoGeneration} is the escape\n * hatch: whoever owns the ambient state bumps, and every slot on every node is\n * dropped. Derivations that read ambient state with *no* such signal (an async\n * image decode landing, say) must not be memoized here at all.\n *\n * Consumers: `canvas/NodeShape.ts` memoizes the painter match and the\n * silhouette path this way.\n */\n\n/** One memoized derivation: the references it was derived against, plus the\n * value. Presence in the slot map is what \"computed\" means — a `null` or\n * `undefined` value is a real answer and stays cached. */\ninterface MemoSlot {\n /** Reference-compared against the caller's `pose` argument. */\n pose: unknown;\n /** Reference-compared against `node.data` at call time. */\n data: unknown;\n value: unknown;\n}\n\ninterface NodeMemoRecord {\n /** `generation` at the time the slots were filled. */\n generation: number;\n slots: Map<string, MemoSlot>;\n}\n\nconst MEMO = new WeakMap<object, NodeMemoRecord>();\n\n/** Bumped whenever ambient state a derivation reads has changed. Entries\n * stamped with an older value are dropped rather than served stale. */\nlet generation = 0;\n\n/** A node, as far as the memo is concerned: an object identity that may carry\n * a `data` reference. Deliberately not `Node<…>` — the memo doesn't read\n * anything else, and typing it loosely keeps `core/scene` from depending on\n * the full node shape for a three-comparison cache. */\ntype MemoizableNode = { data?: unknown };\n\n/**\n * Return the value `derive` produces for `node`, recomputing only when the\n * node's `data` reference, the given `pose` reference, or the global\n * generation has changed since the last call for this `slot`.\n *\n * `slot` names the derivation. A node has more than one derived value — the\n * painter match, the silhouette, draw commands, text layout — and they\n * invalidate on the same signals but must not overwrite each other.\n *\n * `pose` is a **parameter rather than a read off the node**, because callers\n * legitimately derive against a pose that isn't `node.pose`: a preview or\n * ghost pose mid-drag. Those miss and recompute, as they should, and must not\n * poison the entry for the node's real pose. Pass `undefined` for derivations\n * that don't depend on the pose at all (the painter match is one) — it\n * compares equal to itself, leaving `data` as the only key.\n *\n * `data` is read off the node rather than passed: no caller has had a reason\n * to derive against data the node doesn't hold.\n */\nexport function nodeMemo<T>(\n node: MemoizableNode,\n slot: string,\n pose: unknown,\n derive: () => T,\n): T {\n let record = MEMO.get(node);\n if (record === undefined) {\n record = { generation, slots: new Map() };\n MEMO.set(node, record);\n } else if (record.generation !== generation) {\n record.generation = generation;\n record.slots.clear();\n }\n\n const data = node.data;\n const hit = record.slots.get(slot);\n if (hit !== undefined && hit.pose === pose && hit.data === data) {\n return hit.value as T;\n }\n\n const value = derive();\n // Reuse the slot object when there is one: this runs per node per frame, and\n // the entry churn is the only allocation the memo would otherwise add.\n if (hit !== undefined) {\n hit.pose = pose;\n hit.data = data;\n hit.value = value;\n } else {\n record.slots.set(slot, { pose, data, value });\n }\n return value;\n}\n\n/**\n * Drop every memoized slot on every node.\n *\n * For owners of ambient state that changes what a `derive` would return: the\n * shape-painter registry calls this when a painter is registered or disposed,\n * since a cache keyed only on `(pose, data)` would keep answering with the\n * painter that matched before.\n *\n * Cheap — it bumps a counter; records are re-stamped lazily on next access,\n * and unreachable nodes stay collectable via the `WeakMap`.\n */\nexport function bumpNodeMemoGeneration(): void {\n generation++;\n}\n\n/**\n * Drop the slots of `node` that were keyed on a pose, keeping the ones that\n * weren't (the painter match passes `undefined`, and re-matching it is a\n * registry scan).\n *\n * For per-frame pose overrides, which mutate one buffer in place rather than\n * replacing the reference: the `(pose, data)` key cannot see that, so the\n * override's `commit()` calls this for each node it holds.\n * {@link bumpNodeMemoGeneration} is the wrong tool there — it would drop every\n * static node's slots too, every frame.\n */\nexport function dropPoseKeyedMemoSlots(node: MemoizableNode): void {\n const record = MEMO.get(node);\n if (record === undefined) return;\n for (const [slot, entry] of record.slots) {\n if (entry.pose !== undefined) record.slots.delete(slot);\n }\n}\n"],"mappings":";AA8CA,IAAMA,oBAAO,IAAI,QAAgC,GAI7CC,IAAa;AA2BjB,SAAgBC,EACd,GACA,GACA,GACA,GACG;CACH,IAAIC,IAASH,EAAK,IAAII,CAAI;CAC1B,AAAID,MAAW,KAAA,KACb,IAAS;EAAE;EAAY,uBAAO,IAAI,IAAI;CAAE,GACxCH,EAAK,IAAII,GAAMD,CAAM,KACZA,EAAO,eAAeF,MAC/B,EAAO,aAAaA,GACpBE,EAAO,MAAM,MAAM;CAGrB,IAAME,IAAOD,EAAK,MACZE,IAAMH,EAAO,MAAM,IAAII,CAAI;CACjC,IAAID,MAAQ,KAAA,KAAaA,EAAI,SAASE,KAAQF,EAAI,SAASD,GACzD,OAAOC,EAAI;CAGb,IAAMG,IAAQC,EAAO;CAUrB,OAPIJ,MAAQ,KAAA,IAKVH,EAAO,MAAM,IAAII,GAAM;EAAE;EAAM;EAAM;CAAM,CAAC,KAJ5C,EAAI,OAAOC,GACX,EAAI,OAAOH,GACX,EAAI,QAAQI,IAIPA;AACT;AAaA,SAAgBE,IAA+B;CAC7C;AACF;AAaA,SAAgBC,EAAuB,GAA4B;CACjE,IAAMT,IAASH,EAAK,IAAII,CAAI;CAC5B,IAAID,MAAW,KAAA,GACf,KAAK,IAAM,CAACI,GAAMM,MAAUV,EAAO,OACjC,AAAIU,EAAM,SAAS,KAAA,KAAWV,EAAO,MAAM,OAAOI,CAAI;AAE1D"}
@@ -0,0 +1,87 @@
1
+ import { effectivePose as e } from "./effectivePose.js";
2
+ //#region src/core/scene/poseFeed.ts
3
+ var t = Object.freeze([]);
4
+ function n(n) {
5
+ let r = null, i = -1, a = -1, o = t, s = /* @__PURE__ */ new Set(), c = () => {
6
+ for (let e of s) e();
7
+ }, l = null, u = () => {
8
+ let t = r, i = [], a = [], o = [], s = /* @__PURE__ */ new Map();
9
+ for (let [r, o] of n.nodes) {
10
+ let c = e(n, o);
11
+ s.set(r, {
12
+ pose: c,
13
+ data: o.data,
14
+ layer: o.layer
15
+ });
16
+ let l = t.get(r);
17
+ l === void 0 ? i.push({
18
+ node: o,
19
+ pose: c
20
+ }) : (l.pose !== c || l.data !== o.data || l.layer !== o.layer) && a.push({
21
+ node: o,
22
+ pose: c
23
+ });
24
+ }
25
+ for (let e of t.keys()) s.has(e) || o.push(e);
26
+ return r = s, {
27
+ added: i,
28
+ removed: o,
29
+ changed: a
30
+ };
31
+ }, d = () => (r = /* @__PURE__ */ new Map(), i = n.getVersion(), a = n.overrides.getGeneration(), o = n.overrides.ids(), {
32
+ ...u(),
33
+ removed: t,
34
+ changed: t,
35
+ reset: !0
36
+ });
37
+ return {
38
+ subscribe(e) {
39
+ if (s.add(e), l === null) {
40
+ let e = n.subscribe(c), t = n.overrides.subscribe(c);
41
+ l = () => {
42
+ e(), t();
43
+ };
44
+ }
45
+ return () => {
46
+ s.delete(e), s.size === 0 && l !== null && (l(), l = null);
47
+ };
48
+ },
49
+ read() {
50
+ if (r === null) return d();
51
+ let s = n.getVersion(), c = n.overrides.getGeneration(), l = s !== i, f = c !== a;
52
+ if (!l && !f) return {
53
+ added: t,
54
+ removed: t,
55
+ changed: t,
56
+ reset: !1
57
+ };
58
+ let p = l ? u() : {
59
+ added: [],
60
+ removed: [],
61
+ changed: []
62
+ };
63
+ if (i = s, f) {
64
+ let t = n.overrides.ids(), r = new Set(t);
65
+ for (let e of o) r.add(e);
66
+ let i = new Set(p.changed.map((e) => e.node.id));
67
+ for (let t of r) {
68
+ if (i.has(t)) continue;
69
+ let r = n.get(t);
70
+ r !== void 0 && p.changed.push({
71
+ node: r,
72
+ pose: e(n, r)
73
+ });
74
+ }
75
+ a = c, o = t;
76
+ }
77
+ return {
78
+ ...p,
79
+ reset: !1
80
+ };
81
+ }
82
+ };
83
+ }
84
+ //#endregion
85
+ export { n as createPoseFeed };
86
+
87
+ //# sourceMappingURL=poseFeed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poseFeed.js","names":["EMPTY","createPoseFeed","seen","seenVersion","seenGeneration","seenOverridden","listeners","notify","fn","unwire","walk","prev","added","changed","removed","next","id","node","scene","pose","effectivePose","before","resetTo","offScene","offOverrides","version","generation","committedMoved","overridesMoved","base","now","touched","already","n"],"sources":["../../../src/core/scene/poseFeed.ts"],"sourcesContent":["import { effectivePose } from './effectivePose';\nimport type { Node, NodeId, Scene } from './types';\n\n/** A node and the pose a renderer should draw it at. `node.pose` beside it is\n * still the committed pose, so a host has both without a second channel. */\nexport interface FeedNode<TData, TLayer extends string, TPose> {\n node: Node<TData, TLayer, TPose>;\n pose: TPose;\n}\n\n/** What changed since the last `read()`. A node whose effective pose, data or\n * layer reference moved is `changed`; `reset` means every node is in `added`. */\nexport interface FeedDelta<TData, TLayer extends string, TPose> {\n added: readonly FeedNode<TData, TLayer, TPose>[];\n removed: readonly NodeId[];\n changed: readonly FeedNode<TData, TLayer, TPose>[];\n /** Discard the object map and rebuild. */\n reset: boolean;\n}\n\n/** A pull-based change feed over a scene. `subscribe` says something moved;\n * `read` says what, relative to the previous read. */\nexport interface PoseFeed<TData, TLayer extends string, TPose> {\n subscribe(fn: () => void): () => void;\n read(): FeedDelta<TData, TLayer, TPose>;\n}\n\nconst EMPTY = Object.freeze([]) as readonly never[];\n\n/** The three references a node carries that a renderer cares about. The node\n * object is mutated in place, so it is these — not the node — that move. */\ninterface Snapshot<TData, TLayer extends string, TPose> {\n pose: TPose;\n data: TData;\n layer: TLayer;\n}\n\n/** A {@link PoseFeed} over `scene`, reporting effective poses (committed pose\n * under any override). The first `read()` is a reset listing every node. */\nexport function createPoseFeed<TData, TLayer extends string, TPose>(\n scene: Scene<TData, TLayer, TPose>,\n): PoseFeed<TData, TLayer, TPose> {\n let seen: Map<NodeId, Snapshot<TData, TLayer, TPose>> | null = null;\n let seenVersion = -1;\n let seenGeneration = -1;\n let seenOverridden: readonly NodeId[] = EMPTY;\n\n const listeners = new Set<() => void>();\n const notify = () => {\n for (const fn of listeners) fn();\n };\n let unwire: (() => void) | null = null;\n\n const walk = (): {\n added: FeedNode<TData, TLayer, TPose>[];\n removed: NodeId[];\n changed: FeedNode<TData, TLayer, TPose>[];\n } => {\n const prev = seen!;\n const added: FeedNode<TData, TLayer, TPose>[] = [];\n const changed: FeedNode<TData, TLayer, TPose>[] = [];\n const removed: NodeId[] = [];\n const next = new Map<NodeId, Snapshot<TData, TLayer, TPose>>();\n\n for (const [id, node] of scene.nodes) {\n const pose = effectivePose(scene, node);\n next.set(id, { pose, data: node.data, layer: node.layer });\n const before = prev.get(id);\n if (before === undefined) added.push({ node, pose });\n else if (before.pose !== pose || before.data !== node.data || before.layer !== node.layer) {\n changed.push({ node, pose });\n }\n }\n for (const id of prev.keys()) if (!next.has(id)) removed.push(id);\n\n seen = next;\n return { added, removed, changed };\n };\n\n const resetTo = (): FeedDelta<TData, TLayer, TPose> => {\n // An empty `seen` makes the walk report every node as added, and fills the\n // snapshot map in the same pass.\n seen = new Map();\n seenVersion = scene.getVersion();\n seenGeneration = scene.overrides.getGeneration();\n seenOverridden = scene.overrides.ids();\n return { ...walk(), removed: EMPTY, changed: EMPTY, reset: true };\n };\n\n return {\n subscribe(fn) {\n listeners.add(fn);\n if (unwire === null) {\n const offScene = scene.subscribe(notify);\n const offOverrides = scene.overrides.subscribe(notify);\n unwire = () => {\n offScene();\n offOverrides();\n };\n }\n return () => {\n listeners.delete(fn);\n if (listeners.size === 0 && unwire !== null) {\n unwire();\n unwire = null;\n }\n };\n },\n read() {\n if (seen === null) return resetTo();\n\n const version = scene.getVersion();\n const generation = scene.overrides.getGeneration();\n const committedMoved = version !== seenVersion;\n const overridesMoved = generation !== seenGeneration;\n\n if (!committedMoved && !overridesMoved) {\n return { added: EMPTY, removed: EMPTY, changed: EMPTY, reset: false };\n }\n\n const base = committedMoved\n ? walk()\n : {\n added: [] as FeedNode<TData, TLayer, TPose>[],\n removed: [] as NodeId[],\n changed: [] as FeedNode<TData, TLayer, TPose>[],\n };\n seenVersion = version;\n\n if (overridesMoved) {\n const now = scene.overrides.ids();\n const touched = new Set<NodeId>(now);\n for (const id of seenOverridden) touched.add(id); // a cleared override moved too\n const already = new Set(base.changed.map((n) => n.node.id));\n for (const id of touched) {\n if (already.has(id)) continue;\n const node = scene.get(id);\n if (node !== undefined) base.changed.push({ node, pose: effectivePose(scene, node) });\n }\n seenGeneration = generation;\n seenOverridden = now;\n }\n\n return { ...base, reset: false };\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ import { dropPoseKeyedMemoSlots as e } from "./nodeMemo.js";
2
+ //#region src/core/scene/poseOverrides.ts
3
+ function t(t, n) {
4
+ let r = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Set(), a = 0;
5
+ function o(r) {
6
+ let i = t(r);
7
+ i && e(i), n?.(r);
8
+ }
9
+ function s() {
10
+ a++;
11
+ for (let e of i) e();
12
+ }
13
+ return {
14
+ set(e, t) {
15
+ r.set(e, t), o(e), s();
16
+ },
17
+ get(e) {
18
+ return r.get(e);
19
+ },
20
+ has(e) {
21
+ return r.has(e);
22
+ },
23
+ ids() {
24
+ return [...r.keys()];
25
+ },
26
+ clear(e) {
27
+ r.delete(e) && (o(e), s());
28
+ },
29
+ clearAll() {
30
+ if (r.size !== 0) {
31
+ for (let e of r.keys()) o(e);
32
+ r.clear(), s();
33
+ }
34
+ },
35
+ commit() {
36
+ for (let e of r.keys()) o(e);
37
+ s();
38
+ },
39
+ subscribe(e) {
40
+ return i.add(e), () => {
41
+ i.delete(e);
42
+ };
43
+ },
44
+ getGeneration() {
45
+ return a;
46
+ }
47
+ };
48
+ }
49
+ //#endregion
50
+ export { t as createPoseOverrides };
51
+
52
+ //# sourceMappingURL=poseOverrides.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poseOverrides.js","names":["createPoseOverrides","entries","listeners","generation","invalidate","node","getNode","id","dropPoseKeyedMemoSlots","onInvalidate","published","listener","entry","fn"],"sources":["../../../src/core/scene/poseOverrides.ts"],"sourcesContent":["import { dropPoseKeyedMemoSlots } from './nodeMemo';\nimport type { NodeId, PoseOverride, PoseOverrides } from './types';\n\n/**\n * Build a {@link PoseOverrides} map.\n *\n * `getNode` resolves an id to the node object the painter memo is keyed on —\n * the only thing this module needs from the scene, and the reason it doesn't\n * import one. `onInvalidate` lets the scene invalidate derived nodes from the\n * same chokepoint.\n */\nexport function createPoseOverrides<TPose>(\n getNode: (id: NodeId) => { data?: unknown } | undefined,\n onInvalidate?: (id: NodeId) => void,\n): PoseOverrides<TPose> {\n const entries = new Map<NodeId, PoseOverride<TPose>>();\n const listeners = new Set<() => void>();\n let generation = 0;\n\n function invalidate(id: NodeId): void {\n const node = getNode(id);\n if (node) dropPoseKeyedMemoSlots(node);\n onInvalidate?.(id);\n }\n\n function published(): void {\n generation++;\n for (const listener of listeners) listener();\n }\n\n return {\n set(id, entry) {\n entries.set(id, entry);\n invalidate(id);\n published();\n },\n get(id) {\n return entries.get(id);\n },\n has(id) {\n return entries.has(id);\n },\n ids() {\n return [...entries.keys()];\n },\n clear(id) {\n if (!entries.delete(id)) return;\n invalidate(id);\n published();\n },\n clearAll() {\n if (entries.size === 0) return;\n for (const id of entries.keys()) invalidate(id);\n entries.clear();\n published();\n },\n commit() {\n for (const id of entries.keys()) invalidate(id);\n published();\n },\n subscribe(fn) {\n listeners.add(fn);\n return () => { listeners.delete(fn); };\n },\n getGeneration() {\n return generation;\n },\n };\n}\n\n"],"mappings":";;AAWA,SAAgBA,EACd,GACA,GACsB;CACtB,IAAMC,oBAAU,IAAI,IAAiC,GAC/CC,oBAAY,IAAI,IAAgB,GAClCC,IAAa;CAEjB,SAASC,EAAW,GAAkB;EACpC,IAAMC,IAAOC,EAAQC,CAAE;EAEvB,AADIF,KAAMG,EAAuBH,CAAI,GACrCI,IAAeF,CAAE;CACnB;CAEA,SAASG,IAAkB;EACzB;EACA,KAAK,IAAMC,KAAYT,GAAW,EAAS;CAC7C;CAEA,OAAO;EACL,IAAI,GAAI,GAAO;GAGb,AAFAD,EAAQ,IAAIM,GAAIK,CAAK,GACrBR,EAAWG,CAAE,GACbG,EAAU;EACZ;EACA,IAAI,GAAI;GACN,OAAOT,EAAQ,IAAIM,CAAE;EACvB;EACA,IAAI,GAAI;GACN,OAAON,EAAQ,IAAIM,CAAE;EACvB;EACA,MAAM;GACJ,OAAO,CAAC,GAAGN,EAAQ,KAAK,CAAC;EAC3B;EACA,MAAM,GAAI;GACR,AAAKA,EAAQ,OAAOM,CAAE,MACtBH,EAAWG,CAAE,GACbG,EAAU;EACZ;EACA,WAAW;GACT,IAAIT,EAAQ,SAAS,GACrB;SAAK,IAAMM,KAAMN,EAAQ,KAAK,GAAG,EAAWM,CAAE;IAE9C,AADAN,EAAQ,MAAM,GACdS,EAAU;GAFoC;EAGhD;EACA,SAAS;GACP,KAAK,IAAMH,KAAMN,EAAQ,KAAK,GAAG,EAAWM,CAAE;GAC9C,EAAU;EACZ;EACA,UAAU,GAAI;GAEZ,OADAL,EAAU,IAAIW,CAAE,SACH;IAAE,EAAU,OAAOA,CAAE;GAAG;EACvC;EACA,gBAAgB;GACd,OAAOV;EACT;CACF;AACF"}
@@ -0,0 +1,54 @@
1
+ import { isPlainObject as e, isPlainPrototype as t } from "../isPlainObject.js";
2
+ //#region src/core/scene/poseSnapshot.ts
3
+ var n = 4;
4
+ function r(e) {
5
+ return ArrayBuffer.isView(e) && !(e instanceof DataView);
6
+ }
7
+ function i(t, a = n) {
8
+ if (a <= 0) return t;
9
+ if (Array.isArray(t)) return t.map((e) => i(e, a - 1));
10
+ if (r(t)) return t.slice();
11
+ if (e(t)) {
12
+ let e = { ...t };
13
+ for (let t in e) {
14
+ let n = e[t];
15
+ typeof n == "object" && n && (e[t] = i(n, a - 1));
16
+ }
17
+ return e;
18
+ }
19
+ return t;
20
+ }
21
+ function a(e, i, o = n) {
22
+ if (e === i) return !0;
23
+ if (typeof e != "object" || !e || typeof i != "object" || !i) return Object.is(e, i);
24
+ if (o <= 0) return !1;
25
+ let s = Object.getPrototypeOf(e);
26
+ if (t(s)) {
27
+ if (!t(Object.getPrototypeOf(i))) return !1;
28
+ let n = e, r = i, s = 0;
29
+ for (let e in n) {
30
+ s++;
31
+ let t = n[e], i = r[e];
32
+ if (t === i) {
33
+ if (i === void 0 && !(e in r)) return !1;
34
+ continue;
35
+ }
36
+ if (!a(t, i, o - 1)) return !1;
37
+ }
38
+ for (let e in r) if (--s < 0) return !1;
39
+ return !0;
40
+ }
41
+ if (Array.isArray(e) || r(e)) {
42
+ let t = e;
43
+ if (!(Array.isArray(i) || r(i))) return !1;
44
+ let n = i;
45
+ if (t.length !== n.length) return !1;
46
+ for (let e = 0; e < t.length; e++) if (!a(t[e], n[e], o - 1)) return !1;
47
+ return !0;
48
+ }
49
+ return !1;
50
+ }
51
+ //#endregion
52
+ export { a as samePoseValue, i as snapshotPose };
53
+
54
+ //# sourceMappingURL=poseSnapshot.js.map