@weasel-js/core 1.7.0 → 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 (1003) hide show
  1. package/CHANGELOG.md +764 -0
  2. package/README.md +7 -8
  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-DLn2lCr_.d.ts → builtins-BSUfH8nU.d.ts} +738 -513
  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-Dp2IxLGb.d.ts → cornerHandles-CDcZOV8h.d.ts} +3 -13
  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 -62
  601. package/dist/index.d.ts +1955 -1891
  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 -49
  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 +11 -21
  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.js +2 -3
  902. package/dist/scheduling/useVisibleRaf.js +69 -0
  903. package/dist/scheduling/useVisibleRaf.js.map +1 -0
  904. package/dist/test-hook/createTestHook.js +39 -0
  905. package/dist/test-hook/createTestHook.js.map +1 -0
  906. package/dist/test-hook/install.js +12 -0
  907. package/dist/test-hook/install.js.map +1 -0
  908. package/dist/test-seams-fYf6m5pu.d.ts +356 -0
  909. package/dist/test-seams.d.ts +6 -0
  910. package/dist/test-seams.js +3 -0
  911. package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
  912. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
  913. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
  914. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
  915. package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
  916. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
  917. package/dist/tools/builtin/hand/useHandTool.js +31 -0
  918. package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
  919. package/dist/tools/builtin/image/useImageTool.js +41 -0
  920. package/dist/tools/builtin/image/useImageTool.js.map +1 -0
  921. package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
  922. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
  923. package/dist/tools/builtin/line/useLineTool.js +33 -0
  924. package/dist/tools/builtin/line/useLineTool.js.map +1 -0
  925. package/dist/tools/builtin/pen/usePenTool.js +414 -0
  926. package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
  927. package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
  928. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
  929. package/dist/tools/builtin/pickTopMostHit.js +45 -0
  930. package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
  931. package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
  932. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
  933. package/dist/tools/builtin/rect/useRectTool.js +32 -0
  934. package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
  935. package/dist/tools/builtin/select/selectionContributions.js +109 -0
  936. package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
  937. package/dist/tools/builtin/select/useSelectTool.js +162 -0
  938. package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
  939. package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
  940. package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
  941. package/dist/tools/builtin/slice/useSliceTool.js +263 -0
  942. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
  943. package/dist/tools/builtin/star/useStarTool.js +82 -0
  944. package/dist/tools/builtin/star/useStarTool.js.map +1 -0
  945. package/dist/tools/builtin/text/useTextTool.js +177 -0
  946. package/dist/tools/builtin/text/useTextTool.js.map +1 -0
  947. package/dist/tools/overlayBinding.js +8 -0
  948. package/dist/tools/overlayBinding.js.map +1 -0
  949. package/dist/tools/prefs.js +47 -0
  950. package/dist/tools/prefs.js.map +1 -0
  951. package/dist/tools/useKeybindings.js +66 -0
  952. package/dist/tools/useKeybindings.js.map +1 -0
  953. package/dist/{types-D-9QWBy5.d.ts → types-CA54-mAZ.d.ts} +181 -13
  954. package/dist/{types-qYpyTAiZ.d.ts → types-DSjd6W3n.d.ts} +32 -6
  955. package/dist/util/color.js +26 -0
  956. package/dist/util/color.js.map +1 -0
  957. package/dist/util/constrainTo45.js +17 -0
  958. package/dist/util/constrainTo45.js.map +1 -0
  959. package/dist/util/paint.js +72 -0
  960. package/dist/util/paint.js.map +1 -0
  961. package/dist/version.js +6 -0
  962. package/dist/version.js.map +1 -0
  963. package/package.json +29 -19
  964. package/dist/chunk-3TY6FHAF.js +0 -170
  965. package/dist/chunk-3TY6FHAF.js.map +0 -1
  966. package/dist/chunk-DGWNNKGD.js +0 -248
  967. package/dist/chunk-DGWNNKGD.js.map +0 -1
  968. package/dist/chunk-G4ZGQMY7.js +0 -33372
  969. package/dist/chunk-G4ZGQMY7.js.map +0 -1
  970. package/dist/chunk-L5YNZYEG.js +0 -648
  971. package/dist/chunk-L5YNZYEG.js.map +0 -1
  972. package/dist/chunk-LU4IJ52W.js +0 -111
  973. package/dist/chunk-LU4IJ52W.js.map +0 -1
  974. package/dist/chunk-M24CLARN.js +0 -28
  975. package/dist/chunk-M24CLARN.js.map +0 -1
  976. package/dist/chunk-NE27EOLP.js +0 -146
  977. package/dist/chunk-NE27EOLP.js.map +0 -1
  978. package/dist/chunk-PNNZSYRD.js +0 -318
  979. package/dist/chunk-PNNZSYRD.js.map +0 -1
  980. package/dist/chunk-UPZY4ART.js +0 -29
  981. package/dist/chunk-UPZY4ART.js.map +0 -1
  982. package/dist/chunk-WPNA6L5O.js +0 -250
  983. package/dist/chunk-WPNA6L5O.js.map +0 -1
  984. package/dist/chunk-XMAWPGTK.js +0 -128
  985. package/dist/chunk-XMAWPGTK.js.map +0 -1
  986. package/dist/clipboard.js.map +0 -1
  987. package/dist/clone.js.map +0 -1
  988. package/dist/grid-CY5UKlZh.d.ts +0 -98
  989. package/dist/index.css.map +0 -1
  990. package/dist/index.js.map +0 -1
  991. package/dist/insert.d.ts +0 -36
  992. package/dist/insert.js +0 -81
  993. package/dist/insert.js.map +0 -1
  994. package/dist/math.js.map +0 -1
  995. package/dist/move.js.map +0 -1
  996. package/dist/path-JEV2c5If.d.ts +0 -48
  997. package/dist/patterns-builtin.js.map +0 -1
  998. package/dist/renderer.css +0 -62
  999. package/dist/renderer.css.map +0 -1
  1000. package/dist/renderer.js.map +0 -1
  1001. package/dist/resize.js.map +0 -1
  1002. package/dist/routing.js.map +0 -1
  1003. package/dist/types-D2tTKEU0.d.ts +0 -18
package/CHANGELOG.md CHANGED
@@ -1,5 +1,769 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.7.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 6f59206: The `align.*` actions take a `to` param and `flip` takes new `pivot` values,
8
+ naming what the selection lines up against: `'union'` (the selection itself —
9
+ align's default), `'pointer'` (the click's world point, else the `pointer`
10
+ dep's latest position), a world point or rect `{ x, y, width?, height? }`, or a
11
+ key node `{ node: id }`. Bind `{ to: 'pointer' }` to a key and the selection
12
+ aligns to wherever the cursor is. `useAlign`'s `align(edge, to?)` takes the same
13
+ reference. New exports: `AlignReference`, `alignTargetBounds`,
14
+ `SpatialReference`, `SpatialReferenceSources`, `resolveSpatialReference`,
15
+ `FlipAxis`, `FlipPivot`.
16
+
17
+ The align actions are now enabled with one item selected, since any reference
18
+ but `'union'` can align a single item; with `'union'` and one item they do
19
+ nothing, as before.
20
+ - 716ea36: `alignResizeBehavior` now snaps a rotated node by where its corners are drawn.
21
+ Before, it matched the node's unrotated box, so on a rotated node it snapped to
22
+ lines nothing visible was near and missed the ones the handle was on. A corner
23
+ handle now snaps the dragged corner to guides on both world axes; an edge
24
+ handle slides its edge along the node until one of its two corners meets a
25
+ guide. Unrotated nodes snap exactly as before.
26
+
27
+ It takes an optional `poseDescriptor` (its options are now `AlignMoveArgs`),
28
+ used to read the node's box and rotation; pass the same one the resize action
29
+ uses when your poses are not rect-shaped.
30
+ - 2d7003a: Layout reflow can animate. `useAnimatedReflow(scene, animator, { ms, easing } | { spring })` returns a `ReflowTransition`; pass it to `<SceneCanvas reflowTransition>` (or set `LayoutDep.reflow`) and the siblings a drag's layout reflow displaces glide to their slots through the animator instead of snapping. Each node's glide runs under the cancel-key `reflow:<id>`, so a new target mid-glide interrupts the old one and continues from the pose on screen; when a sibling stops reflowing, or the drag commits or cancels, it glides onto its document pose and its override is dropped. Glides are published through the scene's pose overrides, so the document and undo history are untouched. `null` turns it off. `createReflowTransition` is the non-hook form. Additive.
31
+ - e17fe2c: Add animator observability. `animator.watch(listener)` delivers a lifecycle event for every animation the animator runs — `start`, `end`, `cancel`, and `interrupt` when a new animation claims a `cancelKey` — plus a timeline's `lap`s and its event-track crossings at any nesting depth, each carrying the animation's id, kind, cancel-key and label. `animator.live()` returns a snapshot of what is running, with each animation's pause state, time scale, elapsed virtual time and, for tweens and timelines, progress. Every animation option set, timelines included, takes an optional `label`. With no listener attached nothing is built or delivered. Additive.
32
+ - f457e7c: `arrayAdapter`'s marquee and lasso now take a node by its outline, as `sceneToAdapter`'s do, instead of by its bounding box. A marquee over the empty corner of a triangle, or past the tip of a rotated rect, no longer selects it, and `enclosed` lasso mode takes a shape the lasso fits around even when its box pokes out. A polygon pose is its own outline; any other pose is its rect, rotated by `rotation`. The new `silhouette` option supplies what the painters draw — pass `findShapeSilhouette` when the items are scene nodes. The descriptor's `intersectsRect` is no longer consulted.
33
+
34
+ `@weasel-js/geom` now holds path hit-testing: `pointInPath`, `strokeHitTest`, `pathContainsPoint`, `pathContainsRect`, `pathIntersectsRect`, `pathContainsPolygon`, `pathIntersectsPolygon`, `polygonContainsPath` and `polygonIntersectsPath`. Core's exports of the same names are unchanged.
35
+ - 8635031: Every text tier now places its baseline from the ascent and descent a browser
36
+ sets the face with, and centers the face in its line the way CSS does: half
37
+ the leading above the ascent. A face taller than its line box, such as Papyrus
38
+ at `lineHeight: 1.2`, gets negative leading and overflows the box, which keeps
39
+ its height. Before, a line hung its baseline one ascent below the line top
40
+ with no leading, so glyphs sat half the leading away from where CSS puts
41
+ them: high in a roomy line, low in a tight one, where a tall face overflowed
42
+ only at the bottom.
43
+
44
+ The ascent rule is `verticalMetricsFromTables` (new, additive, in
45
+ `@weasel-js/font`): `OS/2` typo metrics when the font sets
46
+ `USE_TYPO_METRICS`, otherwise `hhea`. Firefox and every Linux engine follow it;
47
+ Chromium and WebKit on macOS read `hhea` regardless, and the edit overlay's
48
+ measured correction covers the difference there. `gen-font` bakes the result
49
+ into the atlas's `faceMetrics` block as `ascent` / `descent`, the outline
50
+ parser reads the same values (and reports them as `OutlineFace.ascender`), and
51
+ the canvas tier records the browser's own, measured at a 1000px em rather than
52
+ at the 48px bake size. An atlas or custom parser that states no ascent and
53
+ descent keeps the previous placement.
54
+
55
+ Rendering changes: text in the bundled Inter at `lineHeight: 1.2` moves up by
56
+ 0.005 em. Canvas-tier faces move down by half their leading: Georgia by 1.3px
57
+ and Arial by 1.7px at 40px. The committed Inter atlases are rebaked; the PNG is
58
+ byte-identical.
59
+ - 276bad1: Types that public exports already referenced can now be imported by name from `@weasel-js/core`: `Overlay`, `SHAPE_KINDS`, `ShapeKindDescriptor`, `ShapeKindsWhere`, `KitInsertShape`, `ShaderProgram`, `ToolPrefBase`, `BaseFeature`, `MeshBox`, `PenContinuation`, `SerializedLayer`, `SelectionStore`, `Polyline`, `Scale2`, `WeaselProviderProps`, `HitTestView`, `StyleToggle`, `DEFAULT_INK`, `CURSOR_ANGLE_STEPS`, `CURSOR_MAX_CSS_PX`, and the dispatch-record types `Dispatcher.explain` returns (`DispatchRecord` and its parts, also still on `@weasel-js/core/routing`). A node's `derivePath` / `derivePose` now have named types, `DerivePathFn` and `DerivePoseFn`, which `unionOfChildrenVia` returns.
60
+
61
+ Breaking for test code: `_resetPaintKindsForTests` and `_resetMarkersForTests` moved off core's barrel to a new `@weasel-js/core/test-seams` entry, and `@weasel-js/routing` no longer exports its internal dispatcher helpers `publishLiveDispatch`, `filterEligible` and `preferContextual`.
62
+ - efc5727: Action behaviors get an `onCancel` hook. When a move, resize, rotate, insert or lasso gesture is canceled (Esc, pointercancel), every behavior's `onCancel` runs in place of `onEnd`, which still runs only on commit. `alignMoveBehavior`, `alignInsertBehavior` and `alignResizeBehavior` clear their published guides there, so Esc mid-drag no longer leaves the last matched alignment line on screen, and `snapToContainer` drops its pending dwell timer.
63
+ - 108551d: On a committed move, resize, rotate, insert or lasso gesture, every behavior's `onEnd` now runs, in order; the first one to answer still decides the commit and later answers are ignored. Previously the behaviors after the one that answered never ran, so `[snapBackOrDelete(…), alignMoveBehavior(…)]` left its alignment guides on screen after a snap-back release.
64
+
65
+ `onEnd` takes a second argument, `BehaviorEnd`, whose `answered` flag says an earlier behavior already decided. A behavior that acts on the scene itself from `onEnd` should only clean up when it is set: `momentum` now does, so `[snapBackOrDelete(…), momentum(…)]` no longer flings a node that snapped back. Code calling a behavior's `onEnd` directly must pass the second argument.
66
+ - a5bc201: A boolean op's result takes its topmost source's slot among that source's siblings, read through the reorder contract. `BooleansAdapter` gains optional `getParent`, `getChildren` and `setChildOrder` — `defaultCommitAdapter(scene)` supplies all three — and the kit derives each source's sibling index from them, the same read Create Outlines uses. `createPathNode` now receives a third argument, the topmost source's id: give the new node that source's parent. `getZOrder` still works as an override but is deprecated; an implementation returning a render-order index (as WeaselDraw's did) put results in the wrong slot inside a container. `getSelection` may return `string[]`. Additive.
67
+ - 4e18c9f: `<Canvas paintInto>` now follows its target: when `paintInto.canvas` moves to another element, the next frame paints there and the old element's renderer, with every GL program, buffer and texture it made, is freed. Before, every later frame went to the first element it painted and that renderer lived until unmount; a change of `paintInto.x`/`y` alone also did not repaint. `<Canvas>` now holds its renderer through the same lease as `<SceneViewCanvas>`, `<MinimapCanvas>` and `<DrawCanvas>`, so every surface in core has one renderer setup and teardown. No public API changed.
68
+ - 112c781: `<SceneCanvas>` no longer takes `selectionMode`, and `CanvasSelectionMode` is gone. Its `'multi'` only reached the selection the canvas built for itself, so a canvas handed `useSelection()` still replaced on shift-click. Click policy now has one home, the selection: `useSelection({ mode: 'multi' })`, or `selectionOptions={{ mode: 'multi' }}` for the canvas's own. `selectionMode="none"` is now `selectable={false}`, with the same meaning. Breaking: drop `selectionMode="single"`, move `"multi"` to the selection, and rename `"none"`.
69
+ - ac2e76e: A labkit annotation capture of a text mark no longer comes out without its
70
+ glyphs when the default font was registered `{ lazy: true }` and nothing had
71
+ drawn text yet: the raster route now waits for fonts and paint kinds to load
72
+ before it renders.
73
+
74
+ Additive: core exports `warmRender(opts?)`, which runs `warmFonts` and
75
+ `warmPaintKinds` together — the one call to await before a synchronous
76
+ `renderSceneToPixels`, `RasterSession.render` or `renderDebugSnapshot`.
77
+ `opts.families` and `opts.paintKinds` narrow each half.
78
+ - 9c164e2: A promised `produceFlavors` flavor that rejects now costs only itself. Chromium writes nothing when any flavor in a `ClipboardItem` rejects, and `useClipboardOps` then fell back to the well-known types alone, so a failed SVG export also lost the `application/x-weasel-clipboard+json` flavor, and a rejected `text/plain` lost everything. The copy now retries without the rejected flavors before falling back. Behavior fix, not breaking: a copy whose flavors all resolve writes exactly what it did before.
79
+ - 85d62a7: A `SurfaceContribution` can run on the surface's frame loop and say which kit versions it was written against. `beforePaint(ctx)` runs on every frame before it paints and `afterPaint(ctx)` once its pixels land, each handed the frame's `time`, the surface `view`, `requestFrame()` and the surface's `deps`. Hooks run in the order the surface lists its entries, and one that throws is reported once and skipped without stopping the frame; a surface whose entries declare no hooks subscribes to nothing. `requires: { core: '^1.7' }` is checked on install: a mismatch warns in development, and `<SceneCanvas versionCheck="strict">` throws instead (`"off"` skips it). The matcher is exported as `satisfiesRange` and `checkRequirements`, with `KIT_VERSIONS`. The default long-press feedback now animates from `afterPaint`.
80
+
81
+ `CanvasExtensionApi` gains `subscribeBeforePaint(fn)`, and `subscribeFrame` subscribers now receive the frame time. Additive for callers; breaking for code that implements `CanvasExtensionApi` by hand, which must add `subscribeBeforePaint`.
82
+ - dfd926f: `@weasel-js/core` now tree-shakes for consumers. Its `dist` is now one file
83
+ per source module instead of shared chunks, so importing one symbol ships that
84
+ symbol's modules rather than the whole kit: `import { asNodeId }` goes from
85
+ about 620 kB minified to under 100 bytes with vite's production bundler.
86
+ - 3d80c9f: Text can become path geometry. `textToPath(data, pose)` returns a text node's
87
+ glyph outlines and decoration rules in world space, as one `'nonzero'`
88
+ compound path whose filled region is their union. Glyphs keep the font's
89
+ curves, and each glyph is re-wound so faces that disagree on winding still
90
+ fill their overlaps. It works at any size, not only above the outline-tier
91
+ threshold, and applies synthetic italic the way the renderer does. When some
92
+ run has no outline geometry it throws a `TextOutlinesError` whose `reason` is
93
+ `'no-outlines'`, `'outlines-loading'`, `'outlines-failed'` or
94
+ `'synthetic-bold'`. Faux bold is refused rather than drawn at the regular
95
+ weight, because a path has no distance field to thicken.
96
+ `loadTextOutlines(data)` waits for the faces a text is set in.
97
+
98
+ The new `createOutlines` action (Shift+Mod+O, group `'text'`, under the
99
+ `paths` feature) replaces each selected text node with a path node in one
100
+ undoable batch. Each path takes its text node's slot in the stacking order.
101
+ Consumers publish a `CreateOutlinesAdapter` with `useCreateOutlinesAdapter`;
102
+ its `createPathNode(path, sourceId)` carries the text's fill and stroke. The
103
+ pure core is `applyCreateOutlines`, and the icon is `CreateOutlinesIcon`.
104
+
105
+ Boolean ops take text operands: `BooleansAdapter` gains an optional
106
+ `getTextSource(id)`, consulted when `getWorldPath` has no path. This change is
107
+ additive, with one exception: `BooleanOpResult` has a new
108
+ `{ kind: 'failed', reason: 'text-outlines' }` variant, and a text operand
109
+ without outlines now leaves the scene untouched. Code that switches
110
+ exhaustively over `BooleanOpResult` needs a case for it.
111
+
112
+ Also new: `loadFontOutlines(family, variant?)` in `@weasel-js/font` (also
113
+ re-exported from core) resolves once a registered face has loaded or failed.
114
+ `@weasel-js/geom` adds `pathSignedArea` and `reversePath`.
115
+ - a1ecaac: The scene slot's `cull` option now skips painting nodes the view cannot see, rather than painting every node and dropping the off-screen commands afterward. It decides from the new scene-slot `paintBounds(node, pose, view)`, which `<SceneCanvas>` fills in with the new `defaultPaintBounds` whenever `drawOne` is `defaultDrawOne`. With any other `drawOne`, pass a `paintBounds` that encloses everything it paints — stroke spikes and markers included — or culling still only trims commands after painting. Nodes with no cheap bound are always painted: text, derived-path nodes, nodes with a `data.label` overlay, and any painter that does not declare one. `postProcess` now sees an empty group where a culled node would have painted.
116
+
117
+ A painter registered with `registerNodeShape` can declare `bounds(node, pose, ctx)`, the box its paint fits in before pose rotation; `findShapeBounds` reads it. The built-in shape, path, image and rect-fallback painters declare one.
118
+
119
+ `<SceneViewCanvas>` and `renderSceneToCanvas` take `cull` and `paintBounds` to do the same for a detached view, and `buildSceneViewCommands` takes a trailing `SceneViewCull`. `<MinimapCanvas>` shows the whole scene and does not cull.
120
+ - 886fefd: `<SceneCanvas debug>` now reaches the overlay. It had been swallowed, so only the `?debug=` URL flag ever turned the overlay on through `SceneCanvas`; the prop takes `<Canvas debug>`'s `DebugConfig` plus SceneCanvas's own `slops`. `<Canvas>` also keys its debug sink on the config's content, so an inline `debug={{ … }}` no longer throws away what the sink recorded on every render.
121
+
122
+ New `viewport` debug feature: the last pan or zoom, drawn as the viewport it started from (outlined in the current view), the world point it held fixed, and a readout of the pan delta or zoom factor. `DebugSink` gains `recordViewport(kind, from, to, anchor?)`; a hand-written sink must add it. Actions reach the sink through a new `debug` dep that `<SceneCanvas>` provides, and `viewport.dragPan`, `viewport.wheelPan`, `viewport.zoom` and `viewport.pinchZoom` record into it. `SceneCanvasApi` / `CanvasExtensionApi` gain `getDebug()`, which returns the sink, or null while `debug` is off.
123
+
124
+ The `fps` panel now shows the frame interval and, per paint, CPU time and GL draw calls in total and per render layer, in decimal-aligned columns. The numbers come from new renderer seams: `WeaselRenderer.render(commands, viewMatrix, { spans })` and `lastFrameStats()`, and a `spans` out-parameter on `drawLayers`. `?debug=` now parses `ids`, `fps` and `viewport`, and `?debug=all` turns them on.
125
+
126
+ `renderDebugSnapshot({ scene, view, size, pixelRatio, debug, config, … })` rasterizes the scene and the debug overlay into one image, the way the canvas showed them, for a bug report; `rasterToPng(image)` encodes any `RasterImage` as a PNG `Blob`. It is built on `renderSceneToPixels`, which gains an `overlay` option: commands drawn over the scene in output-pixel space. `buildDebugOverlayCommands` exposes the overlay's commands for a snapshot.
127
+ - 04b0b96: `<DrawCanvas>`, additive: a sized, DPR-correct WebGL2 canvas that paints a `DrawCommand` list with no scene, tools or dispatcher behind it.
128
+
129
+ `draw` takes a command array, which repaints on the next frame when it changes, or a function called on every paint with the surface's CSS size. `view` sets a camera over the commands (identity by default), `background` fills the surface beneath them, `redrawOn` repaints on external sources as it does on `<SceneCanvas>`, and `dpr`, `className` and `canvasRef` behave as they do on `<SceneViewCanvas>`. It paints through the same per-canvas renderer as `<SceneViewCanvas>`, runs its frames behind the visibility gate, and frees its GL objects on unmount.
130
+
131
+ `<SceneViewCanvas>` and `<MinimapCanvas>` now repaint when an image finishes decoding, a deferred glyph bake or font load lands, or a paint kind registers late, as `<SceneCanvas>` already did. Before, text or images that were not ready on a detached view's first frame stayed blank until something else repainted it.
132
+ - 27bcf57: Every op factory's argument type can now be imported by name from `@weasel-js/core`: `InsertArgs`, `DeleteArgs`, `TransformArgs`, `ReparentArgs`, `SetDataArgs`, `SetLayerArgs`, `SetPathArgs`, `SetTextArgs`, `SetSelectionArgs`, `ReorderArgs` and `MoveToIndexArgs`, with the shapes they reference, `SiblingSlot`, `PlacedNode` and `ReorderRestoreEntry`. Core also exports `KeyBinding` (the parameter of `matchesKeyBinding`), `rangeWeight` and `unboldPatch`. `@weasel-js/diagram` exports `ForceBody`, the element type of `ForceRelaxation.bodies`.
133
+
134
+ The default align, distribute, boolean and edit icons are now marked `@experimental` on each component; the tag had sat on a file header where it marked nothing.
135
+
136
+ Breaking: `DispatcherViewTarget` and `ViewIdResolver` are off `@weasel-js/routing/react`. They moved to `@weasel-js/routing/internal`, which is not public API. `rectsEqual` is off `@weasel-js/labkit/surface`.
137
+ - a7f2103: Underline, strikethrough and super/subscript now follow the font's own metrics
138
+ instead of fixed constants. `gen-font` bakes `post.underlinePosition` /
139
+ `underlineThickness`, `OS/2.yStrikeoutPosition` / `yStrikeoutSize` and the
140
+ `OS/2` super/subscript size and offset into a new optional `faceMetrics` block
141
+ in the atlas JSON, and the outline parser reads the same values onto
142
+ `OutlineFace.faceMetrics`, through one shared function, so an atlas and a TTF
143
+ of one font place rules and scripts identically. The overline keeps its
144
+ default offset and takes the underline's weight. A face with no metrics
145
+ (older atlases, the canvas tier, custom parsers) keeps the previous constants.
146
+
147
+ This changes rendering for the bundled Inter: its underline sits lower
148
+ (0.170 em, was 0.10) and heavier (0.068 em, was 0.05), and `script: 'sub'`
149
+ drops by 0.075 em instead of 0.333 em, with scripts at 60.0% size. The
150
+ committed atlases are rebaked; the PNG is byte-identical.
151
+
152
+ Additive API: `faceMetricsFromTables`, `faceMetricsOf`, `faceMetricsFor` and
153
+ the `FaceMetrics` types in `@weasel-js/font`; `scriptMetrics`,
154
+ `scriptMetricsFor`, `decorationMetrics` and `DEFAULT_DECORATION_METRICS` in
155
+ `@weasel-js/text` (re-exported from core); an optional `faceOf` argument to
156
+ `layoutMarkdown` and an optional `face` on `PositionedRun`. `SCRIPT_METRICS`
157
+ remains, now documented as the fallback rather than what every run gets.
158
+
159
+ Fix: `resolveFontVariant` called from inside the glyph-ready notification of
160
+ an atlas that just landed returned a pending miss, because the load was still
161
+ marked in flight. A subscriber that re-resolves synchronously, as
162
+ `useSyncExternalStore` does, now sees the face.
163
+ - b2fd89a: geom adds `boxContainsBox(outer, inner)`, the edge-inclusive test for one box
164
+ wholly holding another. Core's region hit test, labkit's `fracEncloses`,
165
+ `fracContains` and drop-over-canvas check, and labkit's internal point bounds now
166
+ go through geom's box functions instead of their own copies. labkit's `WorldRect`
167
+ is now an alias of geom's `Rect`, which has the same shape. Badge's
168
+ `ChamferedRect` base uses the shared `polygonSampler` rather than a copy of it.
169
+ - 4212d2d: The path data model, the pure math over it, and the easing curves moved from `@weasel-js/core` into `@weasel-js/geom`. Core re-exports every name it exported before, so code importing from `@weasel-js/core` or `@weasel-js/core/math` needs no change.
170
+
171
+ `@weasel-js/geom` now exports `Path`, `PolygonPath`, `RectPath` and `PathFillRule`; the builders (`PathBuilder`, `rectPath`, `ellipsePath`, `polygonFromPoints` and the rest); `pathFromD`, `boundsOfPath`, `unionBoundsPath`, `translatePath`, `scalePathToBounds`, `transformPath`, `composePath`, `decomposePath`, `splitSubpaths`, `pointAlongPath`, `pathDistanceToPoint`, `splitCubicAtT`, `fitCubicThroughDeletion`, `cubicPointAt`, `schneiderFit` and the `Point` type; and every easing curve with `EASINGS`, `SPRING_PRESETS`, `cubicBezierEasing` and `resolveEasing`. Three subpaths are new or grow: `@weasel-js/geom/curves` (Bezier, NURBS and Spiro representations, `CURVE_REPS`), `@weasel-js/geom/tessellate` (`tessellate`, `extractPolylines`, `trimPolyline`, the `Mesh` type), and `@weasel-js/geom/booleans`, which adds `splitPathBySegment`, `splitPathByPolyline` and `snipPathByPolyline`. `earcut` is a new optional peer of geom, needed only by `./tessellate`.
172
+
173
+ Breaking for direct `@weasel-js/geom` users: `GeomPath` and `GeomPolygonPath` are gone, replaced by `Path` and `PolygonPath`. Hit-testing and booleans now take the typed-array `Path` — `commands` a `Uint8Array`, `coords` a `Float32Array`, `fillRule` required — rather than any array-like.
174
+ - 12263bc: Guide and alignment snapping reads its tolerance in screen pixels at every zoom,
175
+ through the camera of the view the drag landed in — a `<CanvasView>`'s own when the
176
+ drag started in one. `GestureContext` now carries that camera as `view` (`null` where
177
+ no view dep answers), refreshed each frame for move, resize, rotate and lasso-select
178
+ behaviors.
179
+
180
+ Breaking: the `getView` option is gone from `alignMoveBehavior`,
181
+ `alignInsertBehavior`, `alignResizeBehavior`, the move, resize and insert
182
+ `snapToGuides`, and `guideSnapStrategy`. Drop it; `tolerance` is always screen
183
+ pixels. Code that builds a `GestureContext` by hand must now supply `view`.
184
+ - b5cc59f: Small atlas text no longer loses stems narrower than a pixel. The shader used
185
+ to size its antialiasing band from the derivative of the distance field. That
186
+ derivative reads flat when a 2x2 pixel quad straddles a thin stem, so the band
187
+ collapsed and the stem disappeared. A 12px superscript `H` in Inter rendered at
188
+ DPR 1 without its left stem. The band now comes from the screen derivatives of
189
+ the texture coordinate, scaled by each atlas's page size and field range.
190
+
191
+ Additive: `glyphFieldScale(source, family, weight, style)` is exported from
192
+ `@weasel-js/font`, and `BmFont` gains an optional `distanceRange` read from
193
+ msdf-bmfont-xml's `distanceField.distanceRange`. `GLYPH_COVERAGE_GLSL`'s
194
+ `glyphCoverage` now takes two more arguments, `uv` and `fieldPerUv`. That breaks
195
+ any custom program that pastes the snippet in and calls it.
196
+ - e2f1968: New package `@weasel-js/guides`: placement aids, built on top of core. It holds what used to be core's grid, guide and layout-strategy code:
197
+
198
+ - the grid: `createGridLayer`, `createCellHighlightLayer`, `useGridCellHover`, `roundToCell`, `gridSnapStrategy`, `pointToGridCell`;
199
+ - guides and alignment: `useGuides`, `createGuidesLayer`, `guideSnapStrategy`, `DEFAULT_GUIDE_TOLERANCE_PX`, `deriveAlignmentGuides`, `matchAlignment`, `MOVE_ANCHORS`, `alignMoveBehavior`, `alignResizeBehavior`, `alignInsertBehavior`, and the `Guide` type;
200
+ - snap behaviors: `snapToGrid` and `snapToGuides` from `@weasel-js/guides/move`, `/resize` and `/insert`, and `pointSnapToGrid` from the root or `/resize`;
201
+ - layout strategies: `freeform`, `tileGrid`, `snapPoint`, and the drop-target pickers `none`, `nearest`, `nearestWithin`, `containedThenNearest` and `cellAt`.
202
+
203
+ Breaking for `@weasel-js/core`. Core no longer exports any of those names, and does not re-export them, so import them from `@weasel-js/guides` instead. The `@weasel-js/core/insert` subpath is gone, since everything it held moved. `@weasel-js/core/move` keeps `snapToContainer` and `snapBackOrDelete`, and `@weasel-js/core/resize` keeps `clampMinSize` and `lockAspectWithModifier`.
204
+
205
+ The canvas's `grid` layer slot now takes a pre-built layer, like `cellHighlight` and any custom slot, instead of grid options. `GridSlotConfig` and the `grid.highlight` sub-option are gone. Write `layers={{ grid: { layer: createGridLayer({ spacing: 20, bounds }) } }}`, and pass a cell highlight as `cellHighlight: { layer: createCellHighlightLayer(...) }`.
206
+
207
+ Core keeps the seams the package plugs into: the `SnapStrategy`, `MoveBehavior`, `BoundsConstraint`, `InsertBehavior` and `PointSnap*` types, `snap()`, `OriginProjection` with `RECT_ORIGIN_PROJECTION`, the `snap` dep, `selectTool.snap`, `toolOptions.snapPoint`, and the `LayoutStrategy` contract. It now also exports `AUTO_ORIGIN_PROJECTION`, the default projection for rects and paths, and three helpers for writing a snap behavior: `screenTolerance`, which converts a screen-pixel tolerance to world units through the gesture's camera; `gestureViewReader`, which reads that camera; and `gesturePlaneReader`, which reads the parallax plane being edited.
208
+ - 1524403: Text now ends a line at every UAX #14 hard break, not only at `\n`: CR, CRLF
209
+ (one break, not two), VT, FF, NEL, U+2028 LINE SEPARATOR and U+2029 PARAGRAPH
210
+ SEPARATOR. This applies to `layoutRuns`, `layoutMarkdown` and the edit overlay,
211
+ wrapped or not. None of them lays out a cell, and a caret offset on either side
212
+ of a CRLF stays exact. As with `\n`, and as with a forced break in CSS, the
213
+ line a hard break ends is never spread by `justify`; U+2028 and U+2029 behave
214
+ the same way here. This is a behavior change: text holding those characters
215
+ lays out on more lines than before.
216
+
217
+ The edit overlay writes each hard break the browser would not break at as a
218
+ `<span data-break>` holding a newline, and reads the original character back
219
+ on commit, so an edit no longer turns U+2028 into a space or a lone CR into a
220
+ newline. A node without runs is now seeded with text nodes instead of through
221
+ `innerText`, which also puts the caret at the right offset on any line after
222
+ the first.
223
+
224
+ Additive: `isHardLineBreak(codePoint)` in `@weasel-js/text`.
225
+ - bfc4b21: `attachHud` reuses a widget's draw commands across repaints until something
226
+ it draws from changes, instead of asking every widget for fresh commands on
227
+ every repaint. A static 10-glyph text widget used to rebuild its command, and so
228
+ re-lay out its glyphs, on every frame.
229
+
230
+ Additive. A widget opts in with the new `Widget.deps(ctx)`, which works like
231
+ `RenderLayer.deps`: the HUD reuses the previous commands while every entry is
232
+ `Object.is`-equal to the last call's, and also rebuilds when the widget's
233
+ bounds, the theme, the default font, the canvas size or the widget's focus
234
+ change. Every kit widget declares it, invalidated by its own setters and
235
+ pointer state. A hand-written widget without `deps` is drawn on every repaint,
236
+ as before; a widget declaring it must treat the commands it returned as
237
+ immutable. A window's `content` painter is still called on every repaint.
238
+ A text widget that only moved keeps its runs array, so its layout stays cached.
239
+
240
+ `@weasel-js/core` exports `depsUnchanged`, the comparison `RenderLayer.deps`
241
+ uses.
242
+ - f046160: `insertAction` now runs `InsertBehavior`s, so `snapToGrid`, `snapToGuides` and `alignInsertBehavior` finally reach a drag. They ride the insert binding's `opts.behaviors`: pass `behaviors` to any drag-to-insert tool hook (`useRectTool({ behaviors })`, and the same on ellipse, line, polygon, star, pencil, text and image), or `toolOptions={{ insert: { behaviors } }}` on `<SceneCanvas>` for all of its built-in ones. Each behavior shapes the start and current point after Shift-constrain and the `snap` dep, and the live preview draws what it returns. On release the first `onEnd` to answer wins, as for move: `null` aborts the insert, `Op[]` commits in its place.
243
+ - 9f83b33: A grown `tileGrid({ overflow: 'grow' })` shrinks back when children leave it. Deleting a child, or moving or dragging one out, gives back each line of cells that empties — never below the declared `rows` (or `cols` for `flow: 'column'`) — and the rest keep their cell size instead of stretching over the grown container. The shrink lands in the same undo step as the departure.
244
+
245
+ This rides on a new optional `LayoutStrategy.depart(container, children, departed)`: the scene's layout pass hands it the children that stay and the ids that left, and it returns poses plus optional new container bounds, as `arrive` does. An edit that both removes and adds children runs `depart` first, then `arrive`. `SceneArrivalHandler` gains a third argument, `departures`, the nodes each container lost in the edit; `layoutArrivalHandler` and `useLayoutArrivals` pass it through. Additive: a strategy without `depart` is rearranged by `childPoses`, as before.
246
+ - 3c1def2: `registerFont` takes a fifth argument, `{ lazy: true }`, which fetches nothing
247
+ until text first lays out in that family — so a scene with no text never
248
+ downloads the atlas. Until the atlas lands, a run set in the family lays out as
249
+ nothing rather than in a fallback face's metrics, and `<SceneCanvas>` repaints
250
+ it when the atlas arrives. The returned promise settles with that load, so it
251
+ never settles for a face no text uses; don't `await` it at startup. New type:
252
+ `RegisterFontOptions`.
253
+
254
+ A family whose atlas is still fetching, eagerly or lazily, now outranks the
255
+ outline tier and the `'substitute'` fallback while it loads: text waits for the
256
+ real face instead of laying out in another one and reflowing when it arrives.
257
+ The same holds for a registered-but-unloaded exact variant, which is no longer
258
+ faked from a sibling weight in the meantime. `listFonts` and `listFontWeights`
259
+ report lazily registered faces before they load.
260
+
261
+ `@weasel-js/hud` registers its bundled Inter lazily, so attaching a HUD whose
262
+ widgets draw no text no longer downloads it. `registerDefaultFont`'s promise now
263
+ settles when a widget first lays out text.
264
+ - ae6e8ac: A touch or pen long-press now shows that it is registering. While a press is
265
+ held and some binding would fire on it — a `longPress` binding, or a
266
+ `contextMenu` one through the fallback — `<SceneCanvas>` draws a ring in the
267
+ theme accent that fills around the press point over the hold. It appears
268
+ after 120ms, so a tap shows nothing, and disappears when the press fires,
269
+ moves past the drag threshold, lifts or is canceled. Under
270
+ `prefers-reduced-motion` it is a static ring. A press nothing is bound to
271
+ shows nothing. When the long-press fires and a binding handles it, touch and
272
+ pen pointers get a short `navigator.vibrate` pulse where the API exists.
273
+
274
+ Additive. `<SceneCanvas longPress={{ feedback, haptics, duration }}>` controls
275
+ it: `feedback: false` turns the ring off, a `SurfaceContribution` replaces it,
276
+ `haptics: false` turns off the pulse, and `duration` sets the hold time
277
+ (default `LONG_PRESS_MS`, 500ms). Under a `tools` takeover, add
278
+ `createLongPressFeedbackContribution()` to your own ambient entries.
279
+
280
+ The press being held is observable state: the `longPress` dep is a
281
+ `LongPressState` whose `get()` returns where the press landed (client,
282
+ canvas-local and world), the view it routed to, when it started, its duration
283
+ and whether it is `armed`, and whose `progress()` returns 0→1.
284
+ `useGestureDispatcher` takes the same controls as `longPress: { state,
285
+ haptics, duration }`, with `createLongPressStore()` making the state. New
286
+ exports: `createLongPressStore`, `LONG_PRESS_MS`, `PendingLongPress`,
287
+ `LongPressState`, `LongPressStore`, `LongPressOptions`,
288
+ `createLongPressFeedbackContribution`, `LongPressFeedbackOptions`,
289
+ `LONG_PRESS_FEEDBACK_ID`, `SceneCanvasLongPress`.
290
+ - 4b570e5: A mesh-gradient paint now bakes at a resolution fitting the device pixels it covers, in power-of-two buckets from 32 to 2048 texels (and never above the context's `MAX_TEXTURE_SIZE`), instead of a fixed 256. A mesh filling a poster, zoomed in on screen, or printed through `renderSceneToPixels` at a high scale no longer shows its texels. Bakes are cached per paint and bucket in a bounded least-recently-used cache (64 MiB or 256 bakes per renderer), and their textures are freed on eviction, on `WeaselRenderer.dispose()`, and on a context restore.
291
+
292
+ Additive: `PaintBindContext` gains `spaceToDevice(units)`, `maxTextureSize` and `resources`, a `PaintResources` lifetime a registered paint kind keys its GPU caches on and frees them through `onRelease`. `PaintResources` is exported from `@weasel-js/core`; `meshBakeSize`, `MESH_BAKE_MIN` and `MESH_BAKE_MAX` from `@weasel-js/core/mesh`. Code that constructs a `PaintBindContext` itself, such as a test double, has to supply the three new members.
293
+ - 251fb64: Mesh gradients get on-canvas handles. `MeshHandles` (`@weasel-js/ui`) draws every patch corner, edge control and tensor interior point over the patch outlines, previews through `onInput` and commits once per drag; dragging a corner carries its controls, and points two patches share move as one handle so the seam does not tear. `SceneGradientHandles` now shows them for a node whose slot holds a mesh, committing through `setFill` / `setStroke` in the bounds frame like the three gradients. The geometry is public on `@weasel-js/core/mesh` as `meshHandles`, `moveMeshHandle` and `meshGuides`. Additive; `GradientHandles`' behavior is unchanged.
294
+ - 9bfdda9: **Breaking:** the mesh-gradient exports moved off `@weasel-js/core` onto a new
295
+ subpath, `@weasel-js/core/mesh`: `MESH_GRADIENT_KIND`, `MESH_BAKE_SIZE`,
296
+ `bakeMesh`, `cornerWeights`, `evalPatch`, `isMeshGradientFill`,
297
+ `isTensorPatch`, `isValidPatch`, `meshBounds`, `meshFromStops`,
298
+ `meshGradientXml`, `meshStops`, `patchBounds`, `patchCorner`, `seedMeshPatch`,
299
+ and the types `BakedMesh`, `MeshBox`, `MeshGradientFill`, `MeshPatch` and
300
+ `MeshPoint`. Change the import path; nothing else about them changed. Any
301
+ import from the subpath registers the kind, as importing them from the root
302
+ did.
303
+
304
+ With esbuild and code splitting on, importing one symbol from
305
+ `@weasel-js/core` no longer ships the mesh paint: `import { asNodeId }`
306
+ bundled to 19,814 B and now bundles to 133 B. The lazily loaded mesh kind now
307
+ ships as one self-contained file that shares no module with the root barrel,
308
+ which is what esbuild needed.
309
+
310
+ New: a `PaintKindEntry` can declare its shader programs as `programs`, keyed
311
+ by program id; registering the kind registers them, and re-registering the
312
+ same source is not a duplicate. New root type export: `ProgramSource`.
313
+ - b554ee0: Create Outlines keeps every run's paint. A text node whose runs wear different
314
+ fills or strokes now becomes one path per paint, each gathering the glyphs and
315
+ decoration rules that share it, instead of one path in the node's color.
316
+
317
+ Additive API: `textToPathsByPaint(data, pose)` returns `{ fill, stroke?, path }`
318
+ per distinct resolved paint, built on the same glyph walk as `textToPath`, and
319
+ their union is `textToPath`'s outline. `TextOutlineSource` takes optional
320
+ `fill` / `stroke` (the node's own), which only `textToPathsByPaint` reads.
321
+ `CreateOutlinesAdapter.createPathNode` receives a third argument,
322
+ `OutlinePathSpec` `{ fill, stroke?, parent }`: the paint the path must wear and
323
+ the parent it goes under. The new optional `createContainerNode(sourceId,
324
+ { parent, bounds })` mints a container that takes the text's slot and holds its
325
+ paths; without it the paths are laid flat in that slot. Either way it is one
326
+ undo step, and the replacement is what ends up selected.
327
+
328
+ Behavior change for existing adapters: one that ignores the new argument still
329
+ works, but a multi-paint text now yields several flat paths painted however that
330
+ adapter paints them, and `resultIds` can hold more than one id per text node.
331
+ - 702829d: The text edit overlay now lands on the glyphs the canvas drew, in Chromium,
332
+ WebKit and Firefox at any device pixel ratio. It used to shift itself by a fixed
333
+ 1px right and 1px up, tuned by eye on one machine; the real offset is that the
334
+ canvas hangs its baseline one ascent below the line top while CSS adds half the
335
+ leading first, which varies with the face, the size and each engine's rounding.
336
+ The overlay now measures both baselines and closes the gap: across Inter,
337
+ Georgia and Arial at 12–72px the mean offset is under 0.2px, and the worst is
338
+ under 1px at DPR 2 and about 1px at DPR 1 (2px for the 7px glyphs of a
339
+ 12px superscript). Text with a node-level `script` was
340
+ several pixels off (13px at 72px) and now matches like the rest; its rise is
341
+ applied to the overlay's `top` rather than a `translate`.
342
+ - 9cad63b: The text edit overlay now sets its glyphs in the face the canvas draws. A family
343
+ the canvas draws from a baked atlas or from outlines — `sans-serif` registered
344
+ to Inter, say — used to reach the overlay as a bare CSS name, which the browser
345
+ resolved to its own face (Helvetica on macOS), so "Hxgd" at 72px ended 12px
346
+ short of the canvas. New `cssFontFamily(family, variant)` answers the CSS
347
+ `font-family` for whatever the canvas draws: a private `FontFace` built from the
348
+ family's `registerFontOutlines` file, with the family name as fallback. A family
349
+ drawn through the browser (`registerCanvasFont`) comes back unchanged. An atlas
350
+ with no font file cannot give the DOM its face, and says so once in the console;
351
+ register the file it was baked from with `registerFontOutlines`.
352
+ `OutlineFontOptions.cssSrc` names the `@font-face` source where the bytes won't
353
+ do, and `enableLocalFontOutlines` sets it to `local(<PostScript name>)`.
354
+
355
+ The bundled Inter atlas carries the font's own advances and kerning. It used to
356
+ lay out on whole-pixel advances at its 32px bake size with no kerning at all, so
357
+ "Hxgd" at 72px set 182.25px wide against the 179.44px every browser gives the
358
+ same face, and "AVATAR" 22px wide of it. `gen:font` now writes advances at full
359
+ precision and kerning pairs read from the font's GPOS table, and the atlas is
360
+ rebaked from `inter.ttf`. Text set in it changes width slightly.
361
+
362
+ Outline faces kern like a browser too. opentype.js skips GPOS extension
363
+ lookups, which is where Inter keeps nearly all its kerning; the outline tier now
364
+ reads pair kerning from GPOS itself.
365
+ - b228015: The text edit overlay no longer opens in the fallback font and then reflows. `@weasel-js/font` builds the overlay's DOM face as soon as the outline file's bytes are in hand: at `registerFontOutlines` for an `ArrayBuffer` source, and when the canvas first reads a URL or thunk source, reusing those bytes instead of fetching again. Registering a URL or thunk still fetches nothing. New `cssFontFamilyLoading(family, variant)` returns the load still in flight for the face `cssFontFamily` names, or `null` when there is nothing to wait for. An edit whose face is still loading keeps the overlay hidden until the face lands or for at most `fontHold` ms (new option on `useTextEdit` and `useSceneTextEdit`; default `TEXT_EDIT_FONT_HOLD`, 100ms), then shows the fallback. `0` restores the old behavior. Additive.
366
+ - 53cdd41: New hooks `usePaintKinds()`, `useGradientKinds()` and `usePaintKind(id)` read
367
+ the paint-kind registry and re-render when a kind is registered or removed.
368
+ `PaintInput`, `GradientEditor` and `PaintField` use them, so a kind registered
369
+ after they mount — a consumer's own, or one arriving through
370
+ `registerPaintKindLoader` such as the lazily loaded mesh gradient — shows in the
371
+ kind bar and gets its label and editor without waiting for an unrelated
372
+ re-render. `listPaintKinds()` and `listGradientKinds()` now return the same
373
+ array until the registry changes.
374
+
375
+ `<Canvas>` no longer acts on a render React abandoned: a `startTransition`
376
+ that suspends used to leave its layers, size, controlled `view`, paint target,
377
+ layer helpers (and the consumer's `helpersRef`), preview extras and event
378
+ callbacks such as `onViewChange` behind, for the next redraw, hit test or
379
+ pointer event to use. `<CanvasView>`, `<SceneViewCanvas>`, the preview-ghost
380
+ and dispatcher-overlay layers, and `<SceneCanvas>`'s `view` dep under a
381
+ controlled `view` get the same treatment. A `syncPaint` redraw requested from a layout
382
+ effect that runs before the canvas's own — an earlier sibling's — now paints
383
+ that commit's inputs rather than bailing until the canvas's effect ran.
384
+ - 33b7ac2: The `mesh-gradient` paint kind now loads on demand instead of shipping with
385
+ every import of `@weasel-js/core` (about 19 kB minified). A mesh fill that
386
+ arrives as data — a loaded document, an SVG import — draws nothing on the
387
+ first frame that meets it, starts the load, and `<SceneCanvas>` repaints it
388
+ when it lands. Importing anything from `@weasel-js/core/mesh` (`seedMeshPatch`,
389
+ `isMeshGradientFill`, `MeshEditor` in `@weasel-js/ui`, …) still registers it
390
+ at once.
391
+
392
+ New: `warmPaintKinds(kinds?)` loads kinds ahead of their first use and
393
+ resolves once they are registered; with no list it loads every kind that has
394
+ a loader. Await it before `renderSceneToPixels` or `serializeSvg` on a
395
+ document that may hold a mesh paint — both are synchronous and cannot wait for
396
+ a load. `registerPaintKindLoader(id, load)` declares a kind of your own the
397
+ same way: `load` resolves with its `PaintKindEntry`, and it runs the first
398
+ time the kind is looked up. New type: `PaintKindLoader`.
399
+
400
+ `<SceneCanvas>` now repaints whenever a paint kind registers, so a kind
401
+ registered after the canvas mounts draws without other help.
402
+ `serializeSvg` warns that an unregistered kind may only need loading, rather
403
+ than that it has no vector form.
404
+ - fa67cbf: Paint kinds registered through `registerPaintKind`, `mesh-gradient` among
405
+ them, now paint on text below the outline-tier threshold instead of drawing
406
+ it black. The kind's own `bind` renders its paint over the glyphs' screen box
407
+ into an offscreen buffer the renderer keeps, and the glyphs sample that buffer
408
+ with their distance-field coverage as the mask, so the same world point reads
409
+ the same color on either side of the threshold. Underline, strikethrough and
410
+ overline rules under such a paint take it too. A kind needs nothing new to get
411
+ this, which covers kinds registered outside the kit. A fix; nothing is
412
+ removed.
413
+
414
+ One behavior change: atlas-tier text under a kind that is not registered, or
415
+ whose `bind` declines the paint, now draws nothing rather than black, which
416
+ is what the outline tier already did.
417
+ - 8f68fa8: `<SceneCanvas>` draws the selection box for a node on a parallax scene layer where the plane draws the node. It used to land offset by the plane's lead or lag once the camera had panned. The chrome now reads the same bounds the picker does, so a `geometry.boundsOf` override also reaches the selection box, which it did not before.
418
+ - 25448ee: Nodes on a parallax scene layer can be edited where they are drawn, zooming planes included.
419
+
420
+ - Move, resize, rotate, clone, insert and path-anchor editing (drag, click, marquee, cut, insert anchor) pair the pointer with the node's pose in its plane's world: the kit's descriptors are wrapped by the new `inPlane(action, layerOf)` (with `selectionLayer`, `insertLayer` and `editingLayer`), which carries the drag, the trail, a click's `worldX` / `worldY`, a handle's pivot and the camera the action reads screen pixels through into the plane, converts the `nodeAtPoint` and `snap` deps at its boundary, and returns overlays in the camera's world. A custom editing action takes the same wrapper. `EditedLayerOf` receives the deps and the grabbed affordance. Nudge and align move a node in its own world's units, as they always have.
421
+ - Snapping on a plane compares like with like. Guides and the grid are the camera's, so `guideSnapStrategy` carries each guide line into the plane and `gridSnapStrategy` rounds the pose's origin on the camera's lattice and carries it back; `GestureContext.plane` (read from the new `ViewApi.plane`) is the map they use. A resize's point snaps (`pointSnapToGrid`) see their points in the camera's world.
422
+ - Path-edit chrome — the anchor and handle markers, the anchor marquee, the slops overlay — and the anchor hit-test read a plane node's path in the drawing camera's world. `createPathEditingOverlayLayer`'s `getPose` and `getMarquee` receive the drawing view; `anchorStateFrom` takes an optional path carrier.
423
+ - `InsertDep` gains an optional `layer()`, the layer `commit` puts a node on; the default dep reports its first layer.
424
+ - The preview ghost, and the selection box mid-gesture, follow a plane node through its plane.
425
+ - A second `<CanvasView>` boxes a plane node through its own camera: the surface's bounds resolver takes the asking view.
426
+ - A container's clip reaches a child on another plane in that child's world, in both painting and picking. New `planeToPlane` and `planeMatrix` helpers compose plane maps.
427
+ - `useSelectTool` takes `getView`, and `sceneToAdapter`'s `hitTestArea` / `hitTestLasso` take the asking view, so a bare adapter picks plane nodes too. `AreaSelectAdapter.hitTestArea` and `LassoSelectAdapter.hitTestLasso` accept that view (`RegionPickView`, which `HitTestView` now aliases).
428
+
429
+ Still open: a selection spanning planes that scale differently — see "Interactive parallax planes" in `docs/TODO.md`.
430
+ - 88c1ae3: Scene layers can be parallax planes, and every plane can be animated.
431
+
432
+ - A scene layer takes `parallax` (`systemLayers`, `addLayer`, and the new undoable `scene.setLayerParallax(layer, opts | undefined)`), and it round-trips through `toJSON`. `<SceneCanvas>`, `SceneViewCanvas` and `renderSceneToPixels` draw that layer's nodes through the derived view, with no wiring by the consumer.
433
+ - Nodes on such a layer are picked where they are drawn: a click, a marquee, a lasso and the selection box all go through the plane.
434
+ - **Breaking:** `createParallaxLayer` takes its factors as `parallax: { pan, zoom, anchor }` instead of top-level `pan` / `zoom` / `anchor`. `parallax` also accepts a `ParallaxPlane` from `createParallaxPlane(opts)`, whose `set(patch)` repaints the layer — write it from an animator's `onTick` to tween a plane.
435
+ - New pure helpers for crossing between the camera and a plane: `planeMap(camera, opts)`, `toPlane`, `fromPlane`, `rectToPlane`, `rectFromPlane`, and the `PlaneMap` type.
436
+ - `HitTestView` gains an optional `get`: a custom `areaSelect` / `lassoSelect` dep reads the asking view's camera from it.
437
+ - dcc9834: Patterns and gradients now paint on text below the outline-tier threshold.
438
+ Atlas glyphs under a texture paint draw through a program of their own that
439
+ uses the distance-field coverage as a mask over the paint, sampled at the same
440
+ paint-space point the outline tier's path program uses, so text no longer
441
+ changes color when zoom carries it across the threshold. Underline,
442
+ strikethrough and overline rules under such a paint take it too, rather than
443
+ drawing black. Solid text is unchanged and still batches; each atlas-tier
444
+ group under a texture paint is its own draw, as a pattern-filled path is.
445
+
446
+ `textCommandFromPose` — and so `kit:text` nodes and `createTextLayer` — now
447
+ resolves each run's fill and stroke paint against the pose box the way every
448
+ other node's paint is resolved: a `units: 'bounds'` paint is mapped onto the
449
+ box, and a `TilePatternSpec` is swapped for its texture. Before this, a
450
+ pattern set on a text node from the paint panel drew nothing at either tier,
451
+ and a `'bounds'` gradient was measured in screen space. A fix; nothing is
452
+ removed.
453
+ - 365c762: A pattern paint takes a `transform`: the tile's rotation, scale and skew about
454
+ its `origin`, as a `PatternTransform` `[a, b, c, d]` in SVG `matrix()` order.
455
+ `composePatternTransform({ rotation, scaleX, scaleY, skewX })` builds one and
456
+ `decomposePatternTransform` reads one back into those parts; both are exported
457
+ from `@weasel-js/paint` and `@weasel-js/core`. The GL renderer samples the tile
458
+ through it, and a transform with no inverse draws nothing.
459
+
460
+ `@weasel-js/svg` writes the transform as `patternTransform="matrix(…)"`, with
461
+ the origin as its translation, and reads any `patternTransform` list back into
462
+ `origin` and `transform`.
463
+
464
+ `PatternPicker` (and so `PaintInput`'s pattern mode) has a Rotation field that
465
+ edits the rotation and leaves scale and skew alone; picking another tile keeps
466
+ the rotation.
467
+
468
+ Additive: a paint without `transform` paints and serializes as before.
469
+ - 941e941: New `createRasterSession()` keeps one renderer and its GPU caches across any
470
+ number of headless renders, for rendering thumbnails or pages in bulk: shader
471
+ programs compile once and a bitmap uploads once for the whole batch rather than
472
+ per render. `session.render(args)` takes what `renderSceneToPixels` takes minus
473
+ `gl`/`createCanvas`, which go to `createRasterSession({ gl?, createCanvas? })`;
474
+ scenes, source rects and scales may differ per render, and a session that owns
475
+ its canvas grows it to the largest render so far. `session.dispose()` frees
476
+ every GL object the session created and leaves a caller-owned context open.
477
+ Additive; new exports `createRasterSession`, `RasterSession`,
478
+ `RasterSessionOptions`, `RasterRenderArgs`.
479
+
480
+ `renderSceneToPixels` is now a session opened for one render. Behavior is
481
+ unchanged, except that it no longer leaks on a caller-owned context: each call
482
+ used to leave 12 shader objects and every uploaded bitmap texture behind.
483
+ `WeaselRenderer.dispose()` now frees bitmap and pattern textures and persistent
484
+ meshes too, and compiled shaders are freed with their program.
485
+ - b20df31: `<SceneCanvas>`, `<Canvas>`, `<MinimapCanvas>`, `useHostAnchor` and the
486
+ canvas's dep sources (`areaSelect`, `editAnchors`, `insert`, `view` and the
487
+ rest) no longer act on a render React abandoned. A `startTransition` that
488
+ suspends used to leave its props behind for the next event, dep read or frame:
489
+ a double click could reach the abandoned `onDoubleClick`, chrome could resolve
490
+ against the abandoned `chromeVisibility`, `selection`, `getFocused` or
491
+ `selectTool.resize.resizable`, and a dep could hand an action the abandoned
492
+ scene, adapter or selection. They now see the last committed render's values.
493
+
494
+ A function-form tool cursor's `ToolCtx` carries the selection, adapter,
495
+ `setView` and debug sink of the render resolving it; its `applyOps` writes
496
+ through the committed adapter.
497
+ - 55ef61f: Core's hooks outside the canvas no longer write refs during render, so a render
498
+ React abandons (a transition that suspends) can no longer leave its options,
499
+ adapter or callbacks behind for the next event or frame to use. Mirrors now go
500
+ through `useLatest`. A few hooks change shape where something read the ref
501
+ during render:
502
+
503
+ - `useSelection` keeps a local selection in an internal store, so writes are
504
+ synchronous and no longer deferred inside a transition. The returned object
505
+ is now stable only for as long as `scene` is the same store.
506
+ - `useDragRect` and `useDragRadial` return `overlay` and `isActive` as values,
507
+ so the controller gets a new identity when the overlay changes; its methods
508
+ stay stable.
509
+ - `useArrayAdapter` builds its adapter over that render's `items` instead of a
510
+ ref.
511
+ - `useSimulation` starts its loop in a layout effect on mount rather than during
512
+ render, and restarts it after StrictMode's simulated remount.
513
+ - `useCanvasFocus` returns a `focusProps` object that is stable until `tabIndex`
514
+ changes; it used to be new every render.
515
+ - 712de19: A drag under a `reflowTransition` now lands the dragged node the way its siblings move: on release it glides from where it was let go onto its committed slot (or back home on a cancel) instead of jumping there. A node grabbed while still gliding is held where it is shown, and the drag starts from there rather than from its document pose; a free drop of it commits where it was shown under the pointer. The drop is still one undo step. To support this, `ReflowTransition.glide` and `settle` take an optional `{ from }` (`ReflowGlideOptions`): `glide` restarts from that pose, and `settle` with `from` takes over a node the transition was not moving. Additive; a custom `ReflowTransition` that ignores the new argument still type-checks, and its dragged nodes snap as before.
516
+ - 67d95c8: Add `solveIk`, a 2D inverse-kinematics solver for the rig. Given a skeleton, a pose, a chain of joints and a target, it returns the pose with the chain's rotations replaced so the chain's tip reaches the target — an ordinary `Pose`, so it blends with `blendPoses`, samples on a `SampledTrack<Pose>` and drives `Rig.pose`. It solves by cyclic coordinate descent, with per-joint angle limits, an iteration cap and a tolerance; a two-joint chain is solved analytically first, bending toward an optional `pole`. A target out of reach leaves the chain pointing straight at it, and the result says whether the target was reached. New types: `SolveIkOptions`, `IkResult`, `IkLimit`, `IkPoint`. Additive.
517
+ - 8a68b6c: New `mirrorPose(skeleton, pose)` reflects a rig pose across the rig's y axis and returns it as ordinary deltas against the same skeleton, so a character can face the other way without a negative scale — which a scene pose such as `RectPose` cannot hold. Every joint resolves to exactly the reflection of the original, including joints the pose leaves at their bind, and mirroring twice returns the original pose.
518
+ - 16a0476: Text runs carry a numeric weight. `StyledRun.fontWeight` (100–900) overrides the node's weight and the `bold` flag, which is now a preset over it: writing either one to a range drops the other. `numericWeight` and `isBoldWeight` (600 and up) are exported as the one reading of a weight.
519
+
520
+ Taking bold off part of a bold node now writes `fontWeight: 400` over that part and leaves the node alone, instead of lowering the node and re-bolding the rest — so it works at any node weight, including 900, where it used to be refused. `SetFlagResult.applied` is gone, since the edit can no longer be declined. `effectiveRangeStyle` reports the `fontWeight` that renders and reads `bold` off it; `patchRangeStyle` lays an armed style over a range the way a write would.
521
+
522
+ `listFontWeights(family)` in `@weasel-js/font` reports the weights a family has on the atlas and outline tiers. A new `font-weight` pref kind draws `FontWeightSelect`, which lists those weights (the nine CSS weights for a family with none on file) and reads the family from the `fontFamily` leaf beside it. The text tool's character options and the node panel's Weight field both use it. The overlay and SVG round-trip a run's weight; a tspan `font-weight` other than 700 now reads as the run's weight rather than being dropped.
523
+ - 6f03bf7: A container can declare its layout on the scene: `scene.add({ kind: 'container',
524
+ layout: tileGrid(...) })`, or `layoutKey` in a snapshot, resolved through the new
525
+ `SceneRegistry.layout`. Layouts now answer to every change to a container's
526
+ children, not only arrivals: a delete, reorder or resize re-runs the strategy's
527
+ `childPoses`, and the writes land in the same undo step as the change, so undo
528
+ restores the whole arrangement at once. A child that joins goes to `arrive` as
529
+ before, and to `childPoses` when the strategy has no `arrive`.
530
+
531
+ This runs through the scene's existing arrival window and `arrange` op; there is
532
+ one layout pass (`core/scene/layoutPass.ts`) whether the layout is declared on
533
+ the node or supplied by `<SceneCanvas layouts>` / `useLayoutArrivals`, and a
534
+ declared layout wins. With no handler installed, a scene holding declared
535
+ layouts runs that pass itself, measured by the new
536
+ `UseSceneOptions.layoutFrame` (also a `sceneFromJSON` option).
537
+
538
+ Breaking edges: `SceneArrivalHandler` gains a second argument, `changed`, and is
539
+ now also called for edits with no arrivals. While layouts are active, a bare
540
+ `scene.remove`, `scene.reorder`, or a `setPose` that resizes a container is
541
+ recorded as a one-mutation batch, like `add` and `move` already were. The
542
+ `arrange` op's coalesce key now names the nodes it moved.
543
+
544
+ Also new: `scene.layoutOf(id)` and `scene.onReflow(listener)`, which reports each
545
+ live edit's layout writes; `<SceneCanvas reflowTransition>` uses it to glide
546
+ those reflows as it does a drag's. New exports: `LayoutFrame`, `LayoutMove`.
547
+ - 72379f6: `Scene.incarnation(id)` returns a token for the node an id names right now. It
548
+ holds through every edit to that node and changes whenever the id enters the
549
+ scene again — a fresh `add`, an undo or redo that brings it back, or
550
+ `loadState` — so something holding an id across frames can tell whether it
551
+ still names the same node.
552
+
553
+ `@weasel-js/d3` transitions use it: a node removed and re-added under the same
554
+ id between two frames is now treated like a removed node. Its transition stops
555
+ for that node, the node taking the id is left alone, and a `.remove()` no longer
556
+ deletes it.
557
+ - 7f7d153: A container's layout can be changed after `add`, undoably. `scene.setLayout(id, layout)` takes a `LayoutStrategy`, its key in `SceneRegistry.layout`, or `null` for none, and re-arranges the container's children under the new layout in the same undo step. A registered layout is recorded by its key, so a serialized history restores it. `createSetLayoutOp({ id, from, to })` is the same change as an op, applied through the new `setLayout` method on `sceneToAdapter`'s and `defaultCommitAdapter`'s adapters; name the layouts by key for an op that has to survive a persisted history. Additive.
558
+ - d9cdff1: `<SceneViewCanvas>` and `<MinimapCanvas>` now free their renderer and every GL program, buffer and texture it made when they unmount; before, each mount leaked them. All three detached canvas surfaces (those two and `<DrawCanvas>`) now share one renderer lifetime, so their setup and teardown cannot drift apart. Additive: `releaseCanvasRenderer(canvas)` is exported, freeing the renderer `renderSceneToCanvas` created for a canvas.
559
+ - 63d0ece: Picking and selection chrome now hold their screen-pixel sizes exactly under
560
+ non-uniform zoom, rotated nodes included. Before, both divided by the mean of
561
+ the two axis scales, so at 4:1 a 4px pick slop was 8px on one axis and 2px on
562
+ the other, and on a turned node the selection outline, handles and rotate
563
+ badge were drawn as a rotated screen rectangle beside the parallelogram the
564
+ node actually painted.
565
+
566
+ - `<SceneCanvas>` picks within `pickTolerancePx` of a node measured on screen.
567
+ `strokeHitTest` takes a `slop: { px, transform }` for this, and
568
+ `shapeCoversPoint`'s `tolerance` accepts `{ px, scale }` alongside a world
569
+ number.
570
+ - The selection outline traces the node's projected corners, handles sit on
571
+ them, and the rotate badge sits its `distance` in pixels off the top edge,
572
+ along that edge's normal as it lands on screen. `rotationHandle` takes the
573
+ view's `scale` to do this and now also returns the badge's screen `angle`;
574
+ `standoff` (exported) is the placement both it and the grab
575
+ region use.
576
+ - A painted rotate badge is grabbable where it is drawn:
577
+ `createRotationAffordance` takes `handle: { distancePx, hitRadiusPx }`, and
578
+ `<SceneCanvas>` / `<CanvasView>` turn it on when the selection overlay
579
+ paints one. An affordance `point` region takes a `standoff` for chrome that
580
+ floats a fixed distance off an edge.
581
+ - The rotate ring's minimum band, and its paint inset, are measured on screen
582
+ for a turned target (`pxExtent` and `annulusSemiAxes` take a rotation).
583
+ - Grid lines stay 1px on screen on both axes.
584
+ - Resize handles on a turned target are grabbable across the turned square
585
+ they are painted as, not a screen-aligned one. A `point` region takes
586
+ `turned: true` for this; `pointRegionFrame` is the one placement the
587
+ hit-test, the region's square paint and the debug hitbox all read, and
588
+ `screenAngleOf` the one angle the overlay turns its handles by.
589
+ - The `debug.slops` overlay draws the regions the hit-test walks — the same
590
+ affordance list, each region's square from `pointRegionFrame` — instead of
591
+ recomputing corner and anchor positions, so it now shows a custom
592
+ `selectTool.handleHitRadius`, turned handles, and anchors on every selected
593
+ path the hit-test offers them on.
594
+ - The hitbox debug overlay draws a world circle as the ellipse it lands as, a
595
+ rotated rect turned, and the new `polygon` `HitShape` a point region now
596
+ records.
597
+ - f8bde12: A scene that has never had a layout now arranges a container as soon as it is given one, whichever way the layout arrives: a `createSetLayoutOp` run through `applyBatch` (or `scene.history.apply` / a journal), and a `scene.setLayout` call inside `scene.batch` or `scene.untracked`, each lay the children out in the same undo step, as a bare `scene.setLayout` call already did. Before, they set the layout and left the children where they were until the container's next change. Undo, redo and a restored history replay the arrangement. A bug fix; no API changes.
598
+ - 685a086: Additive. A `ShaderDrawCommand` can fill an array uniform from one value: key
599
+ it by the array's bare name and pass a flat `number[]`, `Float32Array`,
600
+ `Int32Array` or `Uint32Array` — `u_ripples: [x, y, t, x, y, t]` fills
601
+ `uniform vec3 u_ripples[8]` from slot 0 in one `uniform3fv` call. The call is
602
+ picked from the declared element type (`float`/`vecN`, `int`/`ivecN`,
603
+ `bool`/`bvecN`, `uint`/`uvecN`, and every `matN`/`matNxM`). A value that is not
604
+ a whole number of elements, or is longer than the declaration, throws in dev; a
605
+ shorter one leaves the remaining slots as they were. Per-slot keys
606
+ (`u_ripples[2]`) keep working. Effects passes take the same values.
607
+ `ShaderUniform` widens to include those array types.
608
+
609
+ Re-registering a program id with new source in dev now reaches every renderer
610
+ that compiled it: the renderer recompiles on its next frame, deletes the
611
+ program it replaces and looks its uniforms up again. If the new source fails to
612
+ compile, it logs the error once and keeps drawing the previous program. A
613
+ `<Canvas shaders>` naming the id repaints when its source changes, so the edit
614
+ shows up without anything else asking for a frame.
615
+ - 90a4686: The default `slice` dep now cuts a path under any pose the pose descriptor can read, not only one with top-level `x`/`y`/`width`/`height`: `useSliceDepSource` takes the canvas's `poseDescriptor` as a new optional last argument, and `<SceneCanvas>` passes it. A rotated shape's pieces keep its rotation in their own poses instead of having it baked into their paths, when the descriptor can write a rotation (`withRotation`); otherwise the rotation is baked in as before. `computeSliceOps`'s `placePiece` now receives the world-space piece and returns `{ pose, path }` (the new `SlicePiece` type) rather than mapping a pose alone, and `SliceBounds` is no longer exported — breaking for callers of that hook, which has not yet been released.
616
+
617
+ `worldEditToStorage` now places a rotated pose's box so the edited path stays where it was drawn when its bounds change. Before, the rotation pivot moved with the box, so dragging an anchor of a rotated shape past its bounds shifted the whole shape. It also accepts any `Path`, not only a polygon.
618
+ - 7e08265: `<SceneCanvas>` now publishes a default `slice` dep, so `useSliceTool` cuts with nothing else wired. Each cut swaps every path it crosses for its pieces in one undo step: an open path is snipped, a closed one is knifed, and a closed loop cuts the region it encloses out as its own piece. The pieces of a selected shape stay selected. Paths are cut where they are drawn and the pieces are stored in their parent's frame under `poseComposition`. Nodes on locked layers and nodes with derived geometry are skipped. Additive: `useSliceDepSource` and the pure `computeSliceOps` are new exports, and a consumer's own `useSliceDep` still replaces the default. The WeaselDraw copy is gone.
619
+ - d60a422: Cuts along a polyline, and scissors. `splitPathByPolyline(path, cut)` is the knife along an open polyline: the new edges follow the cut through every bend, a loop the cut draws inside the fill is dropped, and chords that cross each other are all cut. `splitPathBySegment` is now the two-point case of it. `snipPathByPolyline(path, cut)` splits a path's stroke wherever the cut crosses it, leaving every piece open instead of closing it the way a fill does; curves keep their segment types in both. `sliceAction` takes the binding param `cut: 'freehand'` to cut along the whole drag trail rather than a straight line. Breaking: `SliceDep.commit` now receives the cut as one polyline, `commit(cut)`, instead of `commit(a, b)`; a straight cut arrives as `[a, b]`.
620
+ - dde2315: The slice tool moves into the kit as `useSliceTool`, and cuts click by click. Clicks place the cut one point at a time, with a live preview trailing to the pointer; Enter or a double-click cuts, Escape discards, Backspace takes back the last point, and a click on the first point closes the cut into a loop and cuts. A drag still cuts straight, and an Alt-drag along its trail. The tool registers `sliceAction` itself, so a consumer passes it `tools={{ slice }}` and publishes a `slice` dep, and no longer needs `actions={{ slice: sliceAction }}`. Additive.
621
+
622
+ `splitPathByPolyline` now cuts out the region a loop in the cut encloses, instead of dropping the loop: a loop inside the fill becomes its own piece, taking any hole it surrounds, and leaves a hole in the piece around it. A closed cut counts as a loop, or, where it crosses the boundary, is cut as the chords it makes. A cut with a loop in it now returns one more piece than it did.
623
+ - 4cb55b7: Text can be set in small caps. `StyledRun` and `TextStyle` take
624
+ `fontVariantCaps: 'normal' | 'small-caps'`. A run overrides the node, and
625
+ `'normal'` on a run turns off small caps it would inherit. Lowercase letters
626
+ are drawn as capitals at a smaller size. The run's `text` is not rewritten, so
627
+ carets, selections and hit tests address what was typed. The small-caps
628
+ reading is applied after `textTransform`, as CSS does it.
629
+
630
+ This is a synthesis, not the font's `smcp` feature. The small size is the
631
+ face's x-height over its cap height (`smallCapsScaleFor`). A face that states
632
+ neither height gets `SMALL_CAPS_SCALE`, 0.7, which is the factor Chromium and
633
+ WebKit use. `FaceMetrics` gains `xHeight` and `capHeight`, read from `OS/2`
634
+ on both tiers. The bundled Inter atlas carries them now.
635
+
636
+ `ResolvedRun` gains an optional `sizeMap`, which holds the size each unit of
637
+ its text is drawn at. `fontSize` still sets the line height and the rules, so
638
+ a small-caps word keeps its line and gets one underline. The layout cache keys
639
+ on the size map. The outline-tier size gate reads the run's size, so one word
640
+ is never split across tiers.
641
+
642
+ The edit overlay sets the lowercase letters of a small-caps run in
643
+ `<span data-small-caps>` pieces. It sizes them at the canvas scale, because a
644
+ browser's own synthesis uses a fixed factor. It re-splits the pieces as you
645
+ type. A plain-text edit now commits the overlay's DOM text instead of
646
+ `innerText`. `innerText` applies `text-transform`, so a node shown in capitals
647
+ committed the capitals as its text. `@weasel-js/svg` writes
648
+ `font-variant="small-caps"`, and `normal` on a tspan, and reads either back.
649
+
650
+ All of this is additive.
651
+ - fb21799: The fluent stagger form takes a `cancelKey` and a `label`, as the factory form already did. `.tween` and `.springPose` accept both in their options, and `.each` takes a `StaggerOptions` second argument. The label names the stagger's `start`, `end`, `cancel` and `interrupt` events and its `animator.live()` row; the cancel-key lets `animator.cancelKey` and `isActive` reach a fluent run, and a second run under the same key interrupts the first. Additive.
652
+ - fe9a91e: Add `warmSvg(nodes)` and `svgNeeds(nodes)` to `@weasel-js/svg`. `serializeSvg` is synchronous, and its missing-def warning used to point at `warmPaintKinds()`, which loads every lazily registered kind and fails when any unrelated one does. `svgNeeds` reads the serializer's own paint pre-pass, so it lists exactly the paint kinds the export writes as paint servers — fills and strokes, text and run paints, through nested groups — plus the faces whose font metrics size a sub- or superscript run with its own `baselineShift`. `warmSvg` loads only those. Core now exports `isPaintKindKnown`, and `@weasel-js/text` (re-exported by core) adds `resolveRunFace(run, style)`, the family, weight and style a run is set in, read without touching the font registry. Additive.
653
+ - 3a68365: Add justified text. `TextAlign` gains `'justify'`: every line that wraps is
654
+ spread across the box by widening its word gaps equally, and a paragraph's last
655
+ line, or a line with no gap, sits at the start edge. `resolveAlign` maps
656
+ `justify` to that start edge. `LayoutRunsOpts.justify` and
657
+ `TextDrawCommand.justify` carry justification apart from the edge, so
658
+ `justify: true` with `align: 'center'` centers the last lines instead (CSS
659
+ `text-align-last`). The edit overlay sets `text-align: justify` and pins
660
+ `text-align-last` to the same edge, and the property panel's Align bar gets a
661
+ Justify segment with a new `textAlignJustify` icon. SVG export writes a
662
+ justified node at its start edge and records `data-weasel-align="justify"`,
663
+ which the reader turns back into `align: 'justify'`.
664
+
665
+ This is additive. Code that switches over `TextAlign` exhaustively has a new
666
+ value to handle.
667
+ - 43ad590: `tileGrid` takes an `overflow` policy, and it holds however a child arrives — dragged in, inserted, reparented, duplicated or grouped inside the grid. Before, only a drop was checked: a child that arrived by an op past `cols * rows` was skipped by the layout and left wherever its pose put it.
668
+
669
+ - `'reject'` (the default) refuses the child by every route. A drop finds no free cell, as before. An insert or reparent that would overfill the grid is now reverted whole, so nothing lands and no undo entry is recorded. **This is a behavior change:** such an op used to add the child and leave it unplaced.
670
+ - `'grow'` adds a row when the last one fills (a column, under `flow: 'column'`), and the container grows by one cell pitch to hold it, in the same undo step.
671
+ - `'scroll'` keeps the container's size and runs the extra children on past its last visible row at the same pitch. `LayoutStrategy.contentExtent` reports the region they cover.
672
+
673
+ Also new on `tileGrid`: `flow: 'row' | 'column'` sets the fill order. Every child now gets a cell from `childPoses`; one past the grid is placed past it rather than skipped. A child that joins a non-full grid by an op is placed in the free cell nearest to where it was put. Before, it stayed where its pose put it.
674
+
675
+ Underneath, the scene has an arrival hook. `scene.setArrivalHandler(fn)` hears every node that joins a container during one live edit. It returns poses to write as part of that edit, or `null` to refuse the edit. A refused `applyBatch` (or `history.applyOps`, or a journal's `applyBatch`) is reverted and does not throw. A refused `scene.batch`, `untracked`, or bare `add` / `move` is reverted and throws `SceneArrivalRefused`. Redo and a restored history replay the arrangement recorded the first time, through the new `'arrange'` op (`createArrangeOp`). `LayoutStrategy` gains the optional `arrive` and `contentExtent`. `layoutArrivalHandler(scene, { layouts })` connects a scene's layouts to the hook, and `<SceneCanvas layouts>` installs it. A canvas wired by hand through `sceneToAdapter({ layouts })` calls `useLayoutArrivals`. A reparent-on-drop the container refuses now leaves the drag uncommitted instead of throwing.
676
+
677
+ Mostly additive, with these breaking edges. The default-policy change above. `Scene` gains a required `setArrivalHandler`, so a hand-written `Scene` implementation has to add it. While a handler is installed, a bare `scene.add` / `scene.move` into a container is recorded as a one-mutation batch.
678
+ - 4cef954: New `useLatest(value)` (`@weasel-js/react`, re-exported by
679
+ `@weasel-js/core`): a ref holding the value of the last committed render, for
680
+ event handlers and frame loops that must not re-subscribe when it changes.
681
+ Unlike writing `ref.current = value` in the render body, a render React throws
682
+ away never lands, and the value is in place before any layout effect of the
683
+ commit runs. List the returned ref in dependency arrays; `exhaustive-deps` only
684
+ treats `useRef` as stable.
685
+ - c4cc60f: `useSelection` now returns the same object for the life of the component. A memo or effect keyed on `selection` used to rerun every render, so tools built from it were rebuilt every render, and with `onToolsCreated={setTools}` that looped ("Maximum update depth exceeded"). `current` still reads the live selection and the calling component still re-renders when it changes, but anything derived from the ids must now be keyed on `selection.current`, not `selection`: a memo keyed only on the api no longer reruns when the selection changes. A changed `mode` or `extend` takes effect without a new object.
686
+ - 6df279e: `ViewportLayer.reproject` and `viewportsAt` are gone. They were the click-probe prototype from before views; a viewport that takes input is now a `<CanvasView>` (or a `views` entry, or `SceneCanvasApi.addView`), and the canvas routes pointer events into its camera through the gesture dispatcher. `createViewportLayer` stays as the paint primitive, and `layer.resolvable(outer, dims)` fed to `createViewResolver` is the seam for routing a raw viewport yourself — `clientToWorld(x, y, target.origin, target.view)` then lands where `reproject` did. Breaking: replace `reproject`/`viewportsAt` calls with a `<CanvasView>`, or with `createViewResolver` over the layers' `resolvable`.
687
+ - 09ff2c1: New `warmFonts(families?)`, additive: loads registered MSDF atlases ahead of their
688
+ first use and resolves once they land, the font counterpart of `warmPaintKinds`.
689
+ With no list it loads every family passed to `registerFont`, starting lazily
690
+ declared variants and joining fetches already running. It rejects when a load
691
+ fails, or for a family that was never registered.
692
+
693
+ `renderSceneToPixels` and a `RasterSession` render synchronously, so text set in
694
+ a face registered `{ lazy: true }` draws nothing until its atlas has been
695
+ fetched — and nothing fetches it until text first asks. `await warmFonts()`
696
+ before a headless render that contains text.
697
+ - 637945e: `warmRender` can load just what one render needs. Pass it the render,
698
+ `warmRender({ render: args })` with the args `renderSceneToPixels` or
699
+ `RasterSession.render` will take, or `{ commands }` already built. It builds
700
+ the commands the way the render does and loads only the font faces their text
701
+ is set in and the paint kinds they name. A capture no longer loads the mesh
702
+ chunk when it draws no mesh, and no longer fails because some unrelated lazy
703
+ font failed to load. It still rejects when a face the render needs fails.
704
+ `families` and `paintKinds` still override, and `warmRender()` with no render
705
+ still loads everything.
706
+
707
+ labkit's raster capture and the RenderToPixels and DebugOverlay demos now warm
708
+ only what they are about to render.
709
+
710
+ Additive: core exports `renderNeeds(commands)`, which returns the fonts and
711
+ paint kinds a command list draws with, and `debugSnapshotArgs(args)`, which
712
+ returns the `renderSceneToPixels` args behind `renderDebugSnapshot`.
713
+ `warmFonts` also takes a `FontRequest` (`{ family, weight?, style? }`, exported
714
+ from `@weasel-js/font` and core). A request loads what resolving that one
715
+ variant draws with: the exact variant, or the whole family when that variant
716
+ was never registered, the substitute family when the policy would swap one in,
717
+ and the variant's outline face. Unlike a bare family name, a request for a
718
+ family nothing registered resolves instead of rejecting.
719
+ - 5308126: `useClipboardOps`'s `produceFlavors` may now return a promise for any flavor's text (the new `ClipboardFlavors` type). The OS write is still issued inside the copy, and the clipboard takes the text once it resolves, so an SVG flavor can `await warmSvg(nodes)` before it serializes without the copy losing its gesture. Additive: a producer returning plain strings behaves as before.
720
+ - Updated dependencies [f457e7c]
721
+ - Updated dependencies [8635031]
722
+ - Updated dependencies [276bad1]
723
+ - Updated dependencies [3d80c9f]
724
+ - Updated dependencies [886fefd]
725
+ - Updated dependencies [27bcf57]
726
+ - Updated dependencies [a7f2103]
727
+ - Updated dependencies [edabd62]
728
+ - Updated dependencies [7be3713]
729
+ - Updated dependencies [b2fd89a]
730
+ - Updated dependencies [4212d2d]
731
+ - Updated dependencies [b5cc59f]
732
+ - Updated dependencies [1524403]
733
+ - Updated dependencies [3c1def2]
734
+ - Updated dependencies [ae6e8ac]
735
+ - Updated dependencies [b94d2ca]
736
+ - Updated dependencies [8d0493a]
737
+ - Updated dependencies [9cad63b]
738
+ - Updated dependencies [b228015]
739
+ - Updated dependencies [365c762]
740
+ - Updated dependencies [51eb721]
741
+ - Updated dependencies [d175c0c]
742
+ - Updated dependencies [3755e17]
743
+ - Updated dependencies [16a0476]
744
+ - Updated dependencies [63d0ece]
745
+ - Updated dependencies [dde2315]
746
+ - Updated dependencies [4cb55b7]
747
+ - Updated dependencies [fe9a91e]
748
+ - Updated dependencies [3a68365]
749
+ - Updated dependencies [351271a]
750
+ - Updated dependencies [59f4365]
751
+ - Updated dependencies [4cef954]
752
+ - Updated dependencies [09ff2c1]
753
+ - Updated dependencies [637945e]
754
+ - @weasel-js/geom@1.7.1
755
+ - @weasel-js/font@1.7.1
756
+ - @weasel-js/text@1.7.1
757
+ - @weasel-js/routing@1.7.1
758
+ - @weasel-js/paint@1.7.1
759
+ - @weasel-js/quantity@1.7.1
760
+ - @weasel-js/react@1.7.1
761
+ - @weasel-js/cursor@1.7.1
762
+ - @weasel-js/gestures@1.7.1
763
+ - @weasel-js/history@1.7.1
764
+ - @weasel-js/modes@1.7.1
765
+ - @weasel-js/registry@1.7.1
766
+
3
767
  ## 1.7.0
4
768
 
5
769
  ### Patch Changes