@weasel-js/core 1.7.0 → 1.7.2

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 (1004) hide show
  1. package/CHANGELOG.md +794 -0
  2. package/README.md +14 -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-vCdt55xm.d.ts} +2 -2
  61. package/dist/{builtins-DLn2lCr_.d.ts → builtins-C-gRyVRx.d.ts} +742 -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 +102 -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 +93 -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-BCrDp_mH.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 +39 -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.d.ts +1960 -1891
  601. package/dist/index.js +312 -13
  602. package/dist/input/keyState.js +76 -0
  603. package/dist/input/keyState.js.map +1 -0
  604. package/dist/input/useKeyState.js +22 -0
  605. package/dist/input/useKeyState.js.map +1 -0
  606. package/dist/interactions/actions/actionShortcuts.js +32 -0
  607. package/dist/interactions/actions/actionShortcuts.js.map +1 -0
  608. package/dist/interactions/actions/align/align.js +81 -0
  609. package/dist/interactions/actions/align/align.js.map +1 -0
  610. package/dist/interactions/actions/booleans/booleans.js +120 -0
  611. package/dist/interactions/actions/booleans/booleans.js.map +1 -0
  612. package/dist/interactions/actions/booleans/useBooleans.js +20 -0
  613. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
  614. package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
  615. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
  616. package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
  617. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
  618. package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
  619. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
  620. package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
  621. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
  622. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
  623. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
  624. package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
  625. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
  626. package/dist/interactions/actions/defaults/align.js +71 -0
  627. package/dist/interactions/actions/defaults/align.js.map +1 -0
  628. package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
  629. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
  630. package/dist/interactions/actions/defaults/areaSelect.js +75 -0
  631. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
  632. package/dist/interactions/actions/defaults/booleans.js +52 -0
  633. package/dist/interactions/actions/defaults/booleans.js.map +1 -0
  634. package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
  635. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
  636. package/dist/interactions/actions/defaults/clearSelection.js +19 -0
  637. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
  638. package/dist/interactions/actions/defaults/clipboard.js +78 -0
  639. package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
  640. package/dist/interactions/actions/defaults/clone.js +107 -0
  641. package/dist/interactions/actions/defaults/clone.js.map +1 -0
  642. package/dist/interactions/actions/defaults/createOutlines.js +47 -0
  643. package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
  644. package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
  645. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
  646. package/dist/interactions/actions/defaults/delete.js +61 -0
  647. package/dist/interactions/actions/defaults/delete.js.map +1 -0
  648. package/dist/interactions/actions/defaults/distribute.js +66 -0
  649. package/dist/interactions/actions/defaults/distribute.js.map +1 -0
  650. package/dist/interactions/actions/defaults/duplicate.js +83 -0
  651. package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
  652. package/dist/interactions/actions/defaults/editAnchors.js +100 -0
  653. package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
  654. package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
  655. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
  656. package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
  657. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
  658. package/dist/interactions/actions/defaults/escape.js +26 -0
  659. package/dist/interactions/actions/defaults/escape.js.map +1 -0
  660. package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
  661. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
  662. package/dist/interactions/actions/defaults/flip.js +119 -0
  663. package/dist/interactions/actions/defaults/flip.js.map +1 -0
  664. package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
  665. package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
  666. package/dist/interactions/actions/defaults/group.js +131 -0
  667. package/dist/interactions/actions/defaults/group.js.map +1 -0
  668. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
  669. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
  670. package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
  671. package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
  672. package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
  673. package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
  674. package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
  675. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
  676. package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
  677. package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
  678. package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
  679. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
  680. package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
  681. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
  682. package/dist/interactions/actions/defaults/ingest.js +58 -0
  683. package/dist/interactions/actions/defaults/ingest.js.map +1 -0
  684. package/dist/interactions/actions/defaults/insert.js +288 -0
  685. package/dist/interactions/actions/defaults/insert.js.map +1 -0
  686. package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
  687. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
  688. package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
  689. package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
  690. package/dist/interactions/actions/defaults/move.js +760 -0
  691. package/dist/interactions/actions/defaults/move.js.map +1 -0
  692. package/dist/interactions/actions/defaults/nudge.js +110 -0
  693. package/dist/interactions/actions/defaults/nudge.js.map +1 -0
  694. package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
  695. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
  696. package/dist/interactions/actions/defaults/reorder.js +143 -0
  697. package/dist/interactions/actions/defaults/reorder.js.map +1 -0
  698. package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
  699. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
  700. package/dist/interactions/actions/defaults/resize.js +335 -0
  701. package/dist/interactions/actions/defaults/resize.js.map +1 -0
  702. package/dist/interactions/actions/defaults/rotate.js +184 -0
  703. package/dist/interactions/actions/defaults/rotate.js.map +1 -0
  704. package/dist/interactions/actions/defaults/selectAll.js +27 -0
  705. package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
  706. package/dist/interactions/actions/defaults/setFill.js +27 -0
  707. package/dist/interactions/actions/defaults/setFill.js.map +1 -0
  708. package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
  709. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
  710. package/dist/interactions/actions/defaults/setStroke.js +36 -0
  711. package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
  712. package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
  713. package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
  714. package/dist/interactions/actions/defaults/slice.js +39 -0
  715. package/dist/interactions/actions/defaults/slice.js.map +1 -0
  716. package/dist/interactions/actions/defaults/sliceOps.js +60 -0
  717. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
  718. package/dist/interactions/actions/defaults/toolActivate.js +35 -0
  719. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
  720. package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
  721. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
  722. package/dist/interactions/actions/defaults/undoRedo.js +51 -0
  723. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
  724. package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
  725. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
  726. package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
  727. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
  728. package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
  729. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
  730. package/dist/interactions/actions/distribute/distribute.js +42 -0
  731. package/dist/interactions/actions/distribute/distribute.js.map +1 -0
  732. package/dist/interactions/actions/distribute/plan.js +29 -0
  733. package/dist/interactions/actions/distribute/plan.js.map +1 -0
  734. package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
  735. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
  736. package/dist/interactions/actions/edit-anchors/handles.js +43 -0
  737. package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
  738. package/dist/interactions/actions/flip/helpers.js +35 -0
  739. package/dist/interactions/actions/flip/helpers.js.map +1 -0
  740. package/dist/interactions/actions/geometryProjection.js +18 -0
  741. package/dist/interactions/actions/geometryProjection.js.map +1 -0
  742. package/dist/interactions/actions/gestureLifecycle.js +44 -0
  743. package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
  744. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
  745. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
  746. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
  747. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
  748. package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
  749. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
  750. package/dist/interactions/actions/move/gestureAdapter.js +37 -0
  751. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
  752. package/dist/interactions/actions/outlines/createOutlines.js +84 -0
  753. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
  754. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
  755. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
  756. package/dist/interactions/actions/planeInput.js +181 -0
  757. package/dist/interactions/actions/planeInput.js.map +1 -0
  758. package/dist/interactions/actions/poseDescriptorDep.js +9 -0
  759. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
  760. package/dist/interactions/actions/poseFrame.js +38 -0
  761. package/dist/interactions/actions/poseFrame.js.map +1 -0
  762. package/dist/interactions/actions/previewOverrides.js +25 -0
  763. package/dist/interactions/actions/previewOverrides.js.map +1 -0
  764. package/dist/interactions/actions/resize/autoPoseDescriptor.js +31 -0
  765. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
  766. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
  767. package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
  768. package/dist/interactions/actions/resize/behaviors/index.js +8 -0
  769. package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
  770. package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
  771. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
  772. package/dist/interactions/actions/resize/cornerHandles.js +72 -0
  773. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
  774. package/dist/interactions/actions/resolveOverlays.js +60 -0
  775. package/dist/interactions/actions/resolveOverlays.js.map +1 -0
  776. package/dist/interactions/actions/resolvePreviews.js +61 -0
  777. package/dist/interactions/actions/resolvePreviews.js.map +1 -0
  778. package/dist/interactions/actions/rotate/geometry.js +46 -0
  779. package/dist/interactions/actions/rotate/geometry.js.map +1 -0
  780. package/dist/interactions/actions/rotate/handle.js +27 -0
  781. package/dist/interactions/actions/rotate/handle.js.map +1 -0
  782. package/dist/interactions/actions/spatialReference.js +42 -0
  783. package/dist/interactions/actions/spatialReference.js.map +1 -0
  784. package/dist/interactions/actions/useStandardActions.js +142 -0
  785. package/dist/interactions/actions/useStandardActions.js.map +1 -0
  786. package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
  787. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
  788. package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
  789. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
  790. package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
  791. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
  792. package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
  793. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
  794. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
  795. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
  796. package/dist/interactions/gestures/shared/originProjection.js +42 -0
  797. package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
  798. package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
  799. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
  800. package/dist/interactions/gestures/shared/snap.js +24 -0
  801. package/dist/interactions/gestures/shared/snap.js.map +1 -0
  802. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
  803. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
  804. package/dist/layout/arrivals.js +36 -0
  805. package/dist/layout/arrivals.js.map +1 -0
  806. package/dist/{math-MCQcf_gc.d.ts → math-Drrw4ewZ.d.ts} +8 -116
  807. package/dist/math.d.ts +4 -5
  808. package/dist/math.js +6 -4
  809. package/dist/mesh.d.ts +268 -0
  810. package/dist/mesh.js +7 -0
  811. package/dist/move.d.ts +7 -49
  812. package/dist/move.js +3 -142
  813. package/dist/originProjection-DEklpDc_.d.ts +57 -0
  814. package/dist/patterns-builtin.js +3 -3
  815. package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-D-OH-tu5.d.ts} +0 -4
  816. package/dist/registerProgram-ateHDGjw.d.ts +193 -0
  817. package/dist/renderer/DrawCommand.js +6 -0
  818. package/dist/renderer/DrawCommand.js.map +1 -0
  819. package/dist/renderer/WeaselRenderer.js +328 -0
  820. package/dist/renderer/WeaselRenderer.js.map +1 -0
  821. package/dist/renderer/cache/GLImageCache.js +64 -0
  822. package/dist/renderer/cache/GLImageCache.js.map +1 -0
  823. package/dist/renderer/cache/GLMeshCache.js +102 -0
  824. package/dist/renderer/cache/GLMeshCache.js.map +1 -0
  825. package/dist/renderer/cache/GLTextureCache.js +51 -0
  826. package/dist/renderer/cache/GLTextureCache.js.map +1 -0
  827. package/dist/renderer/cache/GradientRampAtlas.js +82 -0
  828. package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
  829. package/dist/renderer/cache/cache.js +13 -0
  830. package/dist/renderer/cache/cache.js.map +1 -0
  831. package/dist/renderer/cache/markerCommandCache.js +59 -0
  832. package/dist/renderer/cache/markerCommandCache.js.map +1 -0
  833. package/dist/renderer/cache/outlineMeshCache.js +15 -0
  834. package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
  835. package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
  836. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
  837. package/dist/renderer/cache/strokeMeshCache.js +44 -0
  838. package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
  839. package/dist/renderer/cullDrawCommands.js +89 -0
  840. package/dist/renderer/cullDrawCommands.js.map +1 -0
  841. package/dist/renderer/draw.js +1109 -0
  842. package/dist/renderer/draw.js.map +1 -0
  843. package/dist/renderer/drawBatch.js +168 -0
  844. package/dist/renderer/drawBatch.js.map +1 -0
  845. package/dist/renderer/effects/EffectTargets.js +45 -0
  846. package/dist/renderer/effects/EffectTargets.js.map +1 -0
  847. package/dist/renderer/effects/builtins.js +31 -0
  848. package/dist/renderer/effects/builtins.js.map +1 -0
  849. package/dist/renderer/effects/composite.js +9 -0
  850. package/dist/renderer/effects/composite.js.map +1 -0
  851. package/dist/renderer/effects/effectPrelude.js +10 -0
  852. package/dist/renderer/effects/effectPrelude.js.map +1 -0
  853. package/dist/renderer/effects/types.js +10 -0
  854. package/dist/renderer/effects/types.js.map +1 -0
  855. package/dist/renderer/index.js +19 -0
  856. package/dist/renderer/math/color.js +341 -0
  857. package/dist/renderer/math/color.js.map +1 -0
  858. package/dist/renderer/math/mat3.js +71 -0
  859. package/dist/renderer/math/mat3.js.map +1 -0
  860. package/dist/renderer/math/patternSpace.js +22 -0
  861. package/dist/renderer/math/patternSpace.js.map +1 -0
  862. package/dist/renderer/math/viewToMat3.js +19 -0
  863. package/dist/renderer/math/viewToMat3.js.map +1 -0
  864. package/dist/renderer/paintResources.js +18 -0
  865. package/dist/renderer/paintResources.js.map +1 -0
  866. package/dist/renderer/paintScratch.js +37 -0
  867. package/dist/renderer/paintScratch.js.map +1 -0
  868. package/dist/renderer/shaders/ShaderProgram.js +74 -0
  869. package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
  870. package/dist/renderer/shaders/batchFill.js +118 -0
  871. package/dist/renderer/shaders/batchFill.js.map +1 -0
  872. package/dist/renderer/shaders/customPrelude.js +34 -0
  873. package/dist/renderer/shaders/customPrelude.js.map +1 -0
  874. package/dist/renderer/shaders/extractUniformNames.js +184 -0
  875. package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
  876. package/dist/renderer/shaders/glyphPaint.js +61 -0
  877. package/dist/renderer/shaders/glyphPaint.js.map +1 -0
  878. package/dist/renderer/shaders/gradFill.js +30 -0
  879. package/dist/renderer/shaders/gradFill.js.map +1 -0
  880. package/dist/renderer/shaders/imageFill.js +14 -0
  881. package/dist/renderer/shaders/imageFill.js.map +1 -0
  882. package/dist/renderer/shaders/pathFill.js +13 -0
  883. package/dist/renderer/shaders/pathFill.js.map +1 -0
  884. package/dist/renderer/shaders/patternFill.js +24 -0
  885. package/dist/renderer/shaders/patternFill.js.map +1 -0
  886. package/dist/renderer/shaders/registerProgram.js +18 -0
  887. package/dist/renderer/shaders/registerProgram.js.map +1 -0
  888. package/dist/renderer/spriteSheet.js +14 -0
  889. package/dist/renderer/spriteSheet.js.map +1 -0
  890. package/dist/renderer/state/GroupState.js +77 -0
  891. package/dist/renderer/state/GroupState.js.map +1 -0
  892. package/dist/renderer/syntheticItalic.js +6 -0
  893. package/dist/renderer/syntheticItalic.js.map +1 -0
  894. package/dist/renderer/textures/registerTexture.js +14 -0
  895. package/dist/renderer/textures/registerTexture.js.map +1 -0
  896. package/dist/renderer.d.ts +11 -21
  897. package/dist/renderer.js +18 -13
  898. package/dist/resize.d.ts +10 -46
  899. package/dist/resize.js +7 -5
  900. package/dist/routing.js +2 -3
  901. package/dist/scheduling/useVisibleRaf.js +69 -0
  902. package/dist/scheduling/useVisibleRaf.js.map +1 -0
  903. package/dist/style.css +2 -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-A37hYkeR.d.ts} +185 -15
  954. package/dist/{types-qYpyTAiZ.d.ts → types-B_9g6hMM.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 +31 -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 +0 -62
  990. package/dist/index.css.map +0 -1
  991. package/dist/index.js.map +0 -1
  992. package/dist/insert.d.ts +0 -36
  993. package/dist/insert.js +0 -81
  994. package/dist/insert.js.map +0 -1
  995. package/dist/math.js.map +0 -1
  996. package/dist/move.js.map +0 -1
  997. package/dist/path-JEV2c5If.d.ts +0 -48
  998. package/dist/patterns-builtin.js.map +0 -1
  999. package/dist/renderer.css +0 -62
  1000. package/dist/renderer.css.map +0 -1
  1001. package/dist/renderer.js.map +0 -1
  1002. package/dist/resize.js.map +0 -1
  1003. package/dist/routing.js.map +0 -1
  1004. package/dist/types-D2tTKEU0.d.ts +0 -18
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSelection.js","names":["createLocalStore","ids","initial","listeners","next","l","useSelection","opts","local","useState","store","scene","initialRef","useRef","seeded","optsRef","useLatest","useMemo","get","set","dlog","without","x","id","m","key","modifiers"],"sources":["../../../src/core/selection/useSelection.ts"],"sourcesContent":["import { useLayoutEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport type { NodeId } from 'core/scene/types';\nimport { dlog } from 'debug/flag';\n\n/**\n * `SelectionApi`, `SelectionMode` and `SelectionExtendKey` are declared in\n * `@weasel-js/routing` — the `selection` dep and half the kit's actions are\n * typed in them. Re-exported here, beside the hook that returns one.\n */\nimport type { SelectionApi, SelectionMode, SelectionExtendKey } from '@weasel-js/routing';\nexport type { SelectionApi, SelectionMode, SelectionExtendKey };\n\n/** Somewhere selection can live outside this hook. `Scene` satisfies it;\n * so does any store with the same three methods. */\nexport interface SelectionStore {\n getSelection(): readonly NodeId[];\n setSelection(ids: readonly NodeId[]): void;\n subscribe(listener: () => void): () => void;\n}\n\n/** Options for {@link useSelection}. */\nexport interface UseSelectionOptions {\n /** Default `'single'`. */\n mode?: SelectionMode;\n /** Default `'shift'`. Ignored in single-mode. */\n extend?: SelectionExtendKey;\n /** Default `[]`. */\n initial?: readonly NodeId[];\n /** Keep the selection on this store rather than in the hook, so every\n * consumer of the same scene shares one selection and undo / redo can\n * restore it. `initial` then only seeds a store that has none yet.\n * Omit it and the hook owns a selection nobody else sees. */\n scene?: SelectionStore;\n /** When `true`, every mutator (`set`/`add`/`remove`/`toggle`/`clear`/\n * `applyClick`) is a no-op — selection stays at whatever `initial`\n * pinned it to. Useful for demos that exist to showcase a single\n * pre-selected node and don't want a\n * stray click to deselect. */\n lock?: boolean;\n}\n\n/** Where a hook with no `scene` keeps its selection, so `get()` reads one\n * store either way and a write is visible before the re-render it causes. */\nfunction createLocalStore(initial: readonly NodeId[]): SelectionStore {\n let ids: readonly NodeId[] = initial;\n const listeners = new Set<() => void>();\n return {\n getSelection: () => ids,\n setSelection: (next) => {\n ids = next;\n for (const l of listeners) l();\n },\n subscribe: (l) => {\n listeners.add(l);\n return () => { listeners.delete(l); };\n },\n };\n}\n\n/**\n * Default implementation of the `getSelection` / `setSelection` adapter\n * contract every action hook (delete, duplicate, nudge, group, ...) requires.\n *\n * Owns selection state, exposes a click-policy helper (single vs multi with\n * an extend key), and pre-builds the two adapter methods consumers otherwise\n * hand-roll in every demo:\n *\n * ```tsx\n * const selection = useSelection({ mode: 'multi' });\n * const adapter = { ...arrayAdapter({...}), ...selection.adapterMethods };\n * ```\n *\n * Returns the same object for as long as `scene` is the same store, so it is\n * safe as a memo or effect dependency. The calling component re-renders when\n * the selection changes; key anything derived from the ids on\n * `selection.current`.\n */\nexport function useSelection(opts: UseSelectionOptions = {}): SelectionApi {\n const { mode = 'single', extend = 'shift', initial = [], lock = false, scene } = opts;\n const [local] = useState(() => createLocalStore([...initial]));\n const store = scene ?? local;\n const initialRef = useRef(initial);\n\n useSyncExternalStore(store.subscribe, () => store.getSelection());\n\n // A store that already holds a selection wins: the hook is joining it, not\n // resetting it. In an effect, not during render — the store has other\n // subscribers.\n const seeded = useRef(false);\n useLayoutEffect(() => {\n if (!scene || seeded.current) return;\n seeded.current = true;\n if (initialRef.current.length > 0 && scene.getSelection().length === 0) {\n scene.setSelection([...initialRef.current]);\n }\n }, [scene]);\n\n const optsRef = useLatest({ mode, extend, lock });\n\n return useMemo<SelectionApi>(() => {\n const get = (): NodeId[] => store.getSelection() as NodeId[];\n const set = (ids: NodeId[]): void => {\n if (optsRef.current.lock) return;\n dlog('selection', 'set', { from: get().length, to: ids.length, ids });\n store.setSelection(ids);\n };\n const without = (id: NodeId) => get().filter((x) => x !== id);\n return {\n get current() { return get(); },\n get,\n set,\n add(id) {\n if (optsRef.current.mode === 'single') set([id]);\n else if (!get().includes(id)) set([...get(), id]);\n },\n remove(id) {\n if (get().includes(id)) set(without(id));\n },\n toggle(id) {\n if (get().includes(id)) set(without(id));\n else set(optsRef.current.mode === 'single' ? [id] : [...get(), id]);\n },\n clear() { set([]); },\n contains: (id) => get().includes(id),\n applyClick(id, modifiers) {\n const { mode: m, extend: key } = optsRef.current;\n if (m === 'multi' && modifiers[key]) set(get().includes(id) ? without(id) : [...get(), id]);\n else set([id]);\n },\n adapterMethods: {\n getSelection: () => get(),\n setSelection: (ids: NodeId[]) => set(ids),\n },\n };\n }, [store, optsRef]);\n}\n"],"mappings":";;;;AA4CA,SAASA,EAAiB,GAA4C;CACpE,IAAIC,IAAyBC,GACvBC,oBAAY,IAAI,IAAgB;CACtC,OAAO;EACL,oBAAoBF;EACpB,eAAe,MAAS;GACtB,IAAMG;GACN,KAAK,IAAMC,KAAKF,GAAW,EAAE;EAC/B;EACA,YAAY,OACVA,EAAU,IAAIE,CAAC,SACF;GAAE,EAAU,OAAOA,CAAC;EAAG;CAExC;AACF;AAoBA,SAAgBC,EAAa,IAA4B,CAAC,GAAiB;CACzE,IAAM,EAAE,UAAO,UAAU,YAAS,SAAS,aAAU,CAAC,GAAG,UAAO,IAAO,aAAUC,GAC3E,CAACC,KAASC,QAAeT,EAAiB,CAAC,GAAGE,CAAO,CAAC,CAAC,GACvDQ,IAAQC,KAASH,GACjBI,IAAaC,EAAOX,CAAO;CAEjC,EAAqBQ,EAAM,iBAAiBA,EAAM,aAAa,CAAC;CAKhE,IAAMI,IAASD,EAAO,EAAK;CAC3B,QAAsB;EACpB,AAAKF,KAAS,GAAO,YACrB,EAAO,UAAU,IACbC,EAAW,QAAQ,SAAS,KAAKD,EAAM,aAAa,CAAC,CAAC,WAAW,KACnEA,EAAM,aAAa,CAAC,GAAGC,EAAW,OAAO,CAAC;CAE9C,GAAG,CAACD,CAAK,CAAC;CAEV,IAAMI,IAAUC,EAAU;EAAE;EAAM;EAAQ;CAAK,CAAC;CAEhD,OAAOC,QAA4B;EACjC,IAAMC,UAAsBR,EAAM,aAAa,GACzCS,KAAO,MAAwB;GACnC,AAAIJ,EAAQ,QAAQ,SACpBK,EAAK,aAAa,OAAO;IAAE,MAAMF,EAAI,CAAC,CAAC;IAAQ,IAAIjB,EAAI;IAAQ;GAAI,CAAC,GACpES,EAAM,aAAaT,CAAG;EACxB,GACMoB,KAAW,MAAeH,EAAI,CAAC,CAAC,QAAQ,MAAMI,MAAMC,CAAE;EAC5D,OAAO;GACL,IAAI,UAAU;IAAE,OAAOL,EAAI;GAAG;GAC9B;GACA;GACA,IAAI,GAAI;IACN,AAAIH,EAAQ,QAAQ,SAAS,WAAUI,EAAI,CAACI,CAAE,CAAC,IACrCL,EAAI,CAAC,CAAC,SAASK,CAAE,KAAGJ,EAAI,CAAC,GAAGD,EAAI,GAAGK,CAAE,CAAC;GAClD;GACA,OAAO,GAAI;IACT,AAAIL,EAAI,CAAC,CAAC,SAASK,CAAE,KAAGJ,EAAIE,EAAQE,CAAE,CAAC;GACzC;GACA,OAAO,GAAI;IACT,AAAIL,EAAI,CAAC,CAAC,SAASK,CAAE,IAAGJ,EAAIE,EAAQE,CAAE,CAAC,IAClCJ,EAAIJ,EAAQ,QAAQ,SAAS,WAAW,CAACQ,CAAE,IAAI,CAAC,GAAGL,EAAI,GAAGK,CAAE,CAAC;GACpE;GACA,QAAQ;IAAE,EAAI,CAAC,CAAC;GAAG;GACnB,WAAW,MAAOL,EAAI,CAAC,CAAC,SAASK,CAAE;GACnC,WAAW,GAAI,GAAW;IACxB,IAAM,EAAE,MAAMC,GAAG,QAAQC,MAAQV,EAAQ;IACzC,AAAIS,MAAM,WAAWE,EAAUD,KAAMN,EAAID,EAAI,CAAC,CAAC,SAASK,CAAE,IAAIF,EAAQE,CAAE,IAAI,CAAC,GAAGL,EAAI,GAAGK,CAAE,CAAC,IACrFJ,EAAI,CAACI,CAAE,CAAC;GACf;GACA,gBAAgB;IACd,oBAAoBL,EAAI;IACxB,eAAe,MAAkBC,EAAIlB,CAAG;GAC1C;EACF;CACF,GAAG,CAACS,GAAOK,CAAO,CAAC;AACrB"}
@@ -0,0 +1,54 @@
1
+ //#region src/core/shapeKinds.ts
2
+ var e = {
3
+ rect: {
4
+ tool: !0,
5
+ insertPreview: !0
6
+ },
7
+ ellipse: {
8
+ tool: !0,
9
+ insertPreview: !0
10
+ },
11
+ line: {
12
+ tool: !0,
13
+ insertPreview: !0
14
+ },
15
+ polygon: {
16
+ tool: !0,
17
+ insertPreview: !0
18
+ },
19
+ star: {
20
+ tool: !0,
21
+ insertPreview: !0
22
+ },
23
+ pen: {
24
+ tool: !0,
25
+ insertPreview: !1
26
+ },
27
+ pencil: {
28
+ tool: !0,
29
+ insertPreview: !0
30
+ },
31
+ lasso: {
32
+ tool: !0,
33
+ insertPreview: !1
34
+ },
35
+ text: {
36
+ tool: !0,
37
+ insertPreview: !0
38
+ },
39
+ image: {
40
+ tool: !1,
41
+ insertPreview: !0
42
+ }
43
+ };
44
+ function t(e, t) {
45
+ return Object.keys(e).filter((n) => e[n][t]);
46
+ }
47
+ function n(t) {
48
+ return e[t];
49
+ }
50
+ var r = t(e, "tool");
51
+ //#endregion
52
+ export { r as KIT_SHAPE_KINDS, e as SHAPE_KINDS, n as shapeKindInfo, t as shapeKindsWhere };
53
+
54
+ //# sourceMappingURL=shapeKinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapeKinds.js","names":["SHAPE_KINDS","shapeKindsWhere","table","k","field","shapeKindInfo","kind","KIT_SHAPE_KINDS"],"sources":["../../src/core/shapeKinds.ts"],"sourcesContent":["/**\n * The kit's built-in shape kinds — one table, every other spelling derived.\n *\n * Lives in `core/` rather than beside the shape tools because both layers ask\n * questions of the same set: the interactions layer decides whether\n * `insertAction` can paint a live preview for a kind, and the canvas layer\n * decides which shape tools `useBuiltinShapeTools` mounts and what\n * `BUILTIN_TOOL_IDS` / `defaultNodeRouting` / `defaultNodeProperties` enumerate.\n *\n * This module imports nothing on purpose: `useBuiltinShapeTools` imports the\n * package barrel, so anything barrel-reachable that needs these lists at\n * module-evaluation time must not route through it.\n */\n\n/** What the kit knows about one built-in shape kind. */\nexport interface ShapeKindDescriptor {\n /** Mounted as a built-in shape tool by `useBuiltinShapeTools`, and so a\n * member of `BuiltinShapeToolId` / `KIT_SHAPE_KINDS`. `image` is false:\n * `useImageTool` needs a `src` and can't be auto-mounted. */\n readonly tool: boolean;\n /** `insertAction` emits an `insertPreview` overlay for this kind, and the\n * dispatcher overlay layer knows how to draw it. Kinds without one still\n * commit; they just have no live drag preview (`pen` and `lasso` don't\n * route through `insertAction` at all). */\n readonly insertPreview: boolean;\n}\n\n/**\n * Declaration order is the enumeration order of every derived list —\n * `KIT_SHAPE_KINDS`, and through it `defaultNodeRouting` /\n * `defaultNodeProperties` / `BUILTIN_TOOL_IDS`.\n */\nexport const SHAPE_KINDS = {\n rect: { tool: true, insertPreview: true },\n ellipse: { tool: true, insertPreview: true },\n line: { tool: true, insertPreview: true },\n polygon: { tool: true, insertPreview: true },\n star: { tool: true, insertPreview: true },\n pen: { tool: true, insertPreview: false },\n pencil: { tool: true, insertPreview: true },\n lasso: { tool: true, insertPreview: false },\n text: { tool: true, insertPreview: true },\n image: { tool: false, insertPreview: true },\n} as const satisfies Record<string, ShapeKindDescriptor>;\n\n/** Every kind in the table, tool or not. */\nexport type ShapeKind = keyof typeof SHAPE_KINDS;\n\n/** The keys of a shape-kind table whose descriptor sets `F` to `true`. */\nexport type ShapeKindsWhere<T, F extends keyof ShapeKindDescriptor> = {\n [K in keyof T]: T[K] extends Record<F, true> ? K : never;\n}[keyof T];\n\n/**\n * Built-in shape tool ids handled by `useBuiltinShapeTools`. Each maps to a\n * kit tool hook + a default `create` that produces a leaf node compatible\n * with `PATH_PAINTER`.\n */\nexport type BuiltinShapeToolId = ShapeKindsWhere<typeof SHAPE_KINDS, 'tool'>;\n\n/** The insert kinds the kit's dispatcher overlay layer knows how to render.\n * Consumer-defined kinds fall outside it: no live preview, commit unaffected. */\nexport type KitInsertShape = ShapeKindsWhere<typeof SHAPE_KINDS, 'insertPreview'>;\n\n/** Kinds in `table` whose descriptor sets `field`, in declaration order. */\nexport function shapeKindsWhere<T extends Record<string, ShapeKindDescriptor>>(\n table: T,\n field: keyof ShapeKindDescriptor,\n): (keyof T & string)[] {\n return (Object.keys(table) as (keyof T & string)[]).filter((k) => table[k][field]);\n}\n\n/** The descriptor for `kind`, or `undefined` for a kind the kit doesn't ship.\n * The one accessor: ask it rather than testing membership of a derived list. */\nexport function shapeKindInfo(kind: string): ShapeKindDescriptor | undefined {\n return (SHAPE_KINDS as Record<string, ShapeKindDescriptor>)[kind];\n}\n\n/** Runtime, iterable list of the shape-tool ids in `BuiltinShapeToolId`.\n * Surfaced so consumers (e.g. the Bundle Inspector) can enumerate the\n * builtin shape kinds without re-encoding the union. */\nexport const KIT_SHAPE_KINDS: readonly BuiltinShapeToolId[] =\n shapeKindsWhere(SHAPE_KINDS, 'tool') as BuiltinShapeToolId[];\n"],"mappings":";AAgCA,IAAaA,IAAc;CACzB,MAAM;EAAE,MAAM;EAAM,eAAe;CAAK;CACxC,SAAS;EAAE,MAAM;EAAM,eAAe;CAAK;CAC3C,MAAM;EAAE,MAAM;EAAM,eAAe;CAAK;CACxC,SAAS;EAAE,MAAM;EAAM,eAAe;CAAK;CAC3C,MAAM;EAAE,MAAM;EAAM,eAAe;CAAK;CACxC,KAAK;EAAE,MAAM;EAAM,eAAe;CAAM;CACxC,QAAQ;EAAE,MAAM;EAAM,eAAe;CAAK;CAC1C,OAAO;EAAE,MAAM;EAAM,eAAe;CAAM;CAC1C,MAAM;EAAE,MAAM;EAAM,eAAe;CAAK;CACxC,OAAO;EAAE,MAAM;EAAO,eAAe;CAAK;AAC5C;AAsBA,SAAgBC,EACd,GACA,GACsB;CACtB,OAAQ,OAAO,KAAKC,CAAK,CAAC,CAA0B,QAAQ,MAAMA,EAAMC,EAAE,CAACC,EAAM;AACnF;AAIA,SAAgBC,EAAc,GAA+C;CAC3E,OAAQL,EAAoDM;AAC9D;AAKA,IAAaC,IACXN,EAAgBD,GAAa,MAAM"}
@@ -0,0 +1,139 @@
1
+ import { PATH_L as e, PATH_M as t, PATH_Z as n } from "@weasel-js/geom";
2
+ //#region src/core/strokeMarkerShapes.ts
3
+ function r(r, i, a = !0) {
4
+ let o = r.length / 2, s = new Uint8Array(a ? o + 1 : o);
5
+ s[0] = t;
6
+ for (let t = 1; t < o; t++) s[t] = e;
7
+ a && (s[o] = n);
8
+ let c = new Float32Array(r.length);
9
+ for (let e = 0; e < r.length; e++) c[e] = r[e] * i;
10
+ return {
11
+ kind: "polygon",
12
+ commands: s,
13
+ coords: c,
14
+ fillRule: "nonzero"
15
+ };
16
+ }
17
+ function i(e, t, n, i = 32) {
18
+ let a = [];
19
+ for (let n = 0; n < i; n++) {
20
+ let r = n / i * Math.PI * 2;
21
+ a.push(e + t * Math.cos(r), t * Math.sin(r));
22
+ }
23
+ return r(a, n);
24
+ }
25
+ var a = [
26
+ {
27
+ id: "arrow",
28
+ reads: [],
29
+ inset: 3,
30
+ path: ({ size: e }) => r([
31
+ 0,
32
+ 0,
33
+ -3,
34
+ -1.5,
35
+ -3,
36
+ 1.5
37
+ ], e)
38
+ },
39
+ {
40
+ id: "arrow-open",
41
+ reads: [],
42
+ inset: 0,
43
+ fill: "none",
44
+ outline: { width: 1 },
45
+ path: ({ size: e }) => r([
46
+ -2.867,
47
+ -2.007,
48
+ 0,
49
+ 0,
50
+ -2.867,
51
+ 2.007
52
+ ], e, !1)
53
+ },
54
+ {
55
+ id: "arrow-concave",
56
+ reads: [],
57
+ inset: 3,
58
+ path: ({ size: e }) => r([
59
+ 0,
60
+ 0,
61
+ -3,
62
+ -1.5,
63
+ -2,
64
+ 0,
65
+ -3,
66
+ 1.5
67
+ ], e)
68
+ },
69
+ {
70
+ id: "diamond",
71
+ reads: [],
72
+ inset: 4,
73
+ path: ({ size: e }) => r([
74
+ 0,
75
+ 0,
76
+ -2,
77
+ -1.2,
78
+ -4,
79
+ 0,
80
+ -2,
81
+ 1.2
82
+ ], e)
83
+ },
84
+ {
85
+ id: "diamond-hollow",
86
+ reads: [],
87
+ inset: 4,
88
+ fill: "none",
89
+ outline: { width: .5 },
90
+ path: ({ size: e }) => r([
91
+ 0,
92
+ 0,
93
+ -2,
94
+ -1.2,
95
+ -4,
96
+ 0,
97
+ -2,
98
+ 1.2
99
+ ], e)
100
+ },
101
+ {
102
+ id: "circle",
103
+ reads: [],
104
+ inset: 2,
105
+ path: ({ size: e }) => i(-1, 1, e)
106
+ },
107
+ {
108
+ id: "square",
109
+ reads: [],
110
+ inset: 2,
111
+ path: ({ size: e }) => r([
112
+ 0,
113
+ -1,
114
+ 0,
115
+ 1,
116
+ -2,
117
+ 1,
118
+ -2,
119
+ -1
120
+ ], e)
121
+ },
122
+ {
123
+ id: "bar",
124
+ reads: [],
125
+ inset: 0,
126
+ fill: "none",
127
+ outline: { width: 1 },
128
+ path: ({ size: e }) => r([
129
+ 0,
130
+ -1.5,
131
+ 0,
132
+ 1.5
133
+ ], e, !1)
134
+ }
135
+ ];
136
+ //#endregion
137
+ export { a as BUILTIN_MARKERS };
138
+
139
+ //# sourceMappingURL=strokeMarkerShapes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strokeMarkerShapes.js","names":["poly","n","pts","commands","close","PATH_M","i","PATH_L","PATH_Z","coords","size","circle","segments","theta","cx","r","BUILTIN_MARKERS"],"sources":["../../src/core/strokeMarkerShapes.ts"],"sourcesContent":["/**\n * The kit's built-in stroke-marker vocabulary.\n *\n * Every entry is authored with its anchor at the origin and pointing +X, so\n * the line arrives from -X and no geometry sits at positive X. Coordinates are\n * in units of `MarkerCtx.size`, which defaults to the resolved stroke width —\n * one definition is therefore correct at any line weight.\n *\n * Not to be confused with `features/paths/markers.ts`, which builds\n * decorative chrome shapes and is unrelated.\n */\n\nimport { PATH_M, PATH_L, PATH_Z, type PolygonPath } from '@weasel-js/geom';\nimport type { MarkerCtx, MarkerEntry } from './strokeMarkers';\n\nfunction poly(pts: readonly number[], size: number, close = true): PolygonPath {\n const n = pts.length / 2;\n const commands = new Uint8Array(close ? n + 1 : n);\n commands[0] = PATH_M;\n for (let i = 1; i < n; i++) commands[i] = PATH_L;\n if (close) commands[n] = PATH_Z;\n const coords = new Float32Array(pts.length);\n for (let i = 0; i < pts.length; i++) coords[i] = pts[i] * size;\n return { kind: 'polygon', commands, coords, fillRule: 'nonzero' };\n}\n\n/** Circle of radius `r` centred at `cx`, in marker units. */\nfunction circle(cx: number, r: number, size: number, segments = 32): PolygonPath {\n const pts: number[] = [];\n for (let i = 0; i < segments; i++) {\n const theta = (i / segments) * Math.PI * 2;\n pts.push(cx + r * Math.cos(theta), r * Math.sin(theta));\n }\n return poly(pts, size);\n}\n\n/** The markers the registry is seeded with: `arrow`, `arrow-open`,\n * `arrow-concave`, `diamond`, `diamond-hollow`, `circle`, `square` and `bar`. */\nexport const BUILTIN_MARKERS: readonly MarkerEntry[] = [\n {\n id: 'arrow',\n reads: [],\n inset: 3,\n path: ({ size }: MarkerCtx) => poly([0, 0, -3, -1.5, -3, 1.5], size),\n },\n {\n id: 'arrow-open',\n reads: [],\n inset: 0,\n fill: 'none',\n outline: { width: 1 },\n // Open at the back, so the ribbon runs to the vertex and the arms meet it.\n // Arms 3.5 long at ±35°: the back opening is 4 units against 2 units of\n // arm, so the V still reads open. Shorter or narrower and the two arms\n // close the gap themselves and it paints as a solid triangle.\n path: ({ size }: MarkerCtx) =>\n poly([-2.867, -2.007, 0, 0, -2.867, 2.007], size, false),\n },\n {\n id: 'arrow-concave',\n reads: [],\n inset: 3,\n path: ({ size }: MarkerCtx) => poly([0, 0, -3, -1.5, -2, 0, -3, 1.5], size),\n },\n {\n id: 'diamond',\n reads: [],\n inset: 4,\n path: ({ size }: MarkerCtx) => poly([0, 0, -2, -1.2, -4, 0, -2, 1.2], size),\n },\n {\n id: 'diamond-hollow',\n reads: [],\n inset: 4,\n fill: 'none',\n outline: { width: 0.5 },\n path: ({ size }: MarkerCtx) => poly([0, 0, -2, -1.2, -4, 0, -2, 1.2], size),\n },\n {\n id: 'circle',\n reads: [],\n inset: 2,\n path: ({ size }: MarkerCtx) => circle(-1, 1, size),\n },\n {\n id: 'square',\n reads: [],\n inset: 2,\n path: ({ size }: MarkerCtx) => poly([0, -1, 0, 1, -2, 1, -2, -1], size),\n },\n {\n id: 'bar',\n reads: [],\n inset: 0,\n fill: 'none',\n outline: { width: 1 },\n path: ({ size }: MarkerCtx) => poly([0, -1.5, 0, 1.5], size, false),\n },\n];\n"],"mappings":";;AAeA,SAASA,EAAK,GAAwB,GAAc,IAAQ,IAAmB;CAC7E,IAAMC,IAAIC,EAAI,SAAS,GACjBC,IAAW,IAAI,WAAWC,IAAQH,IAAI,IAAIA,CAAC;CACjD,EAAS,KAAKI;CACd,KAAK,IAAIC,IAAI,GAAGA,IAAIL,GAAG,KAAK,EAASK,KAAKC;CAC1C,AAAIH,MAAO,EAASH,KAAKO;CACzB,IAAMC,IAAS,IAAI,aAAaP,EAAI,MAAM;CAC1C,KAAK,IAAII,IAAI,GAAGA,IAAIJ,EAAI,QAAQ,KAAK,EAAOI,KAAKJ,EAAII,KAAKI;CAC1D,OAAO;EAAE,MAAM;EAAW;EAAU;EAAQ,UAAU;CAAU;AAClE;AAGA,SAASC,EAAO,GAAY,GAAW,GAAc,IAAW,IAAiB;CAC/E,IAAMT,IAAgB,CAAC;CACvB,KAAK,IAAII,IAAI,GAAGA,IAAIM,GAAU,KAAK;EACjC,IAAMC,IAASP,IAAIM,IAAY,KAAK,KAAK;EACzC,EAAI,KAAKE,IAAKC,IAAI,KAAK,IAAIF,CAAK,GAAGE,IAAI,KAAK,IAAIF,CAAK,CAAC;CACxD;CACA,OAAOb,EAAKE,GAAKQ,CAAI;AACvB;AAIA,IAAaM,IAA0C;CACrD;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,OAAO,EAAE,cAAsBhB,EAAK;GAAC;GAAG;GAAG;GAAI;GAAM;GAAI;EAAG,GAAGU,CAAI;CACrE;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,MAAM;EACN,SAAS,EAAE,OAAO,EAAE;EAKpB,OAAO,EAAE,cACPV,EAAK;GAAC;GAAQ;GAAQ;GAAG;GAAG;GAAQ;EAAK,GAAGU,GAAM,EAAK;CAC3D;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,OAAO,EAAE,cAAsBV,EAAK;GAAC;GAAG;GAAG;GAAI;GAAM;GAAI;GAAG;GAAI;EAAG,GAAGU,CAAI;CAC5E;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,OAAO,EAAE,cAAsBV,EAAK;GAAC;GAAG;GAAG;GAAI;GAAM;GAAI;GAAG;GAAI;EAAG,GAAGU,CAAI;CAC5E;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,MAAM;EACN,SAAS,EAAE,OAAO,GAAI;EACtB,OAAO,EAAE,cAAsBV,EAAK;GAAC;GAAG;GAAG;GAAI;GAAM;GAAI;GAAG;GAAI;EAAG,GAAGU,CAAI;CAC5E;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,OAAO,EAAE,cAAsBC,EAAO,IAAI,GAAGD,CAAI;CACnD;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,OAAO,EAAE,cAAsBV,EAAK;GAAC;GAAG;GAAI;GAAG;GAAG;GAAI;GAAG;GAAI;EAAE,GAAGU,CAAI;CACxE;CACA;EACE,IAAI;EACJ,OAAO,CAAC;EACR,OAAO;EACP,MAAM;EACN,SAAS,EAAE,OAAO,EAAE;EACpB,OAAO,EAAE,cAAsBV,EAAK;GAAC;GAAG;GAAM;GAAG;EAAG,GAAGU,GAAM,EAAK;CACpE;AACF"}
@@ -0,0 +1,28 @@
1
+ import { BUILTIN_MARKERS as e } from "./strokeMarkerShapes.js";
2
+ import { createReflectable as t } from "@weasel-js/registry";
3
+ //#region src/core/strokeMarkers.ts
4
+ var n = t();
5
+ function r() {
6
+ for (let t of e) n.push(t.id, t, { source: "kit" });
7
+ }
8
+ r();
9
+ var i = n.reflection;
10
+ function a() {
11
+ return n.getVersion();
12
+ }
13
+ function o(e) {
14
+ return n.push(e.id, e);
15
+ }
16
+ function s(e) {
17
+ return e === void 0 ? void 0 : n.get(e);
18
+ }
19
+ function c() {
20
+ return n.entries().map((e) => e.value);
21
+ }
22
+ function l() {
23
+ n.clear(), r();
24
+ }
25
+ //#endregion
26
+ export { l as _resetMarkersForTests, s as getMarker, c as listMarkers, a as markerGeneration, i as markerRegistry, o as registerMarker };
27
+
28
+ //# sourceMappingURL=strokeMarkers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strokeMarkers.js","names":["MARKERS","createReflectable","seedBuiltins","entry","BUILTIN_MARKERS","markerRegistry","markerGeneration","registerMarker","getMarker","key","listMarkers","_resetMarkersForTests"],"sources":["../../src/core/strokeMarkers.ts"],"sourcesContent":["/**\n * The stroke-marker registry — arrowheads and other line terminators.\n *\n * Keyed by string, because a key is what sits in `stroke.markerEnd`. That is\n * the difference from `registerNodeShape`, which resolves by first-matching\n * predicate and whose `id` is only a label.\n *\n * A built-in's SVG slot lives in `@weasel-js/svg` and cannot be imported here\n * without inverting a package dependency, so an entry carries `toSvg` for that\n * package to consume — the same split `PaintKindEntry` uses.\n */\n\nimport type { FillStyle, MarkerKey, Stroke } from '@weasel-js/paint';\nimport type { Path } from '@weasel-js/geom';\nimport { createReflectable, type Reflection } from '@weasel-js/registry';\nimport { BUILTIN_MARKERS } from './strokeMarkerShapes';\n\n/** What an entry's `path` is given. Entries that ignore it may return a\n * constant path. */\nexport interface MarkerCtx {\n /** One geometry unit, in the same world units the ribbon is tessellated in.\n * Defaults to the resolved stroke width. */\n readonly size: number;\n /** The stroke this marker belongs to, already width-resolved. */\n readonly stroke: Stroke;\n}\n\n/** `'line'` means the stroke's own paint — SVG 2's `context-stroke`, as the\n * default rather than an opt-in. */\nexport type MarkerPaint = FillStyle | 'line' | 'none';\n\n/** A stroke-marker registry entry: a terminator's geometry, paint and inset. */\nexport interface MarkerEntry {\n /** `'kit:'`-free for built-ins so the key matches the SVG attribute value;\n * consumers should prefix (`'app-my-head'`). A key becomes the `id` of the\n * emitted `<marker>` def, so it must be a valid XML name — no colons. */\n id: MarkerKey;\n /** Geometry with its anchor at the origin, pointing +X, in units of\n * `ctx.size`. An arbitrary anchor is expressed by where the geometry is\n * drawn, which is why there is no `refX`/`refY`. */\n path(ctx: MarkerCtx): Path;\n /** Default `'line'`. */\n fill?: MarkerPaint;\n /** Outline width is in the same units as `path`. `false` (the default)\n * means no outline. */\n outline?: { width: number; paint?: MarkerPaint } | false;\n /** How far back along the line the stroke stops, in units of `ctx.size`.\n * Default 0. A property of the shape, not a setting on the stroke: an open\n * V needs 0 or its arms stop meeting the line. */\n inset?: number;\n /** `'auto'` (default) follows the line; a number is a fixed angle in\n * radians, ignoring the line — SVG's `orient=\"<angle>\"`. */\n orient?: 'auto' | number;\n /** The stroke fields `path` reads besides `ctx.size` — `[]` for a shape\n * drawn from size alone. Declared, a head is reused across stroke objects\n * whose listed fields are equal; omitted, only across frames that pass the\n * same stroke object, since `path` might read any of it. */\n reads?: readonly (keyof Stroke)[];\n /** Emits the `<marker>` def. Consumed by `@weasel-js/svg`. */\n toSvg?(id: string, entry: MarkerEntry): string;\n}\n\nconst MARKERS = createReflectable<MarkerEntry>();\n\nfunction seedBuiltins(): void {\n for (const entry of BUILTIN_MARKERS) MARKERS.push(entry.id, entry, { source: 'kit' });\n}\nseedBuiltins();\n\n/** Every registered marker, with the overrides each displaced. */\nexport const markerRegistry: Reflection<MarkerEntry> = MARKERS.reflection;\n\n/** Bumped whenever the registered set changes, for caches of marker geometry. */\nexport function markerGeneration(): number {\n return MARKERS.getVersion();\n}\n\n/** Register a marker. Returns a disposer. Re-registering an existing id is an\n * override; disposing it uncovers whatever it displaced rather than deleting the key. */\nexport function registerMarker(entry: MarkerEntry): () => void {\n return MARKERS.push(entry.id, entry);\n}\n\n/** The entry for `key`, or `undefined`. */\nexport function getMarker(key: string | undefined): MarkerEntry | undefined {\n return key === undefined ? undefined : MARKERS.get(key);\n}\n\n/** Every registered marker, built-ins first, in registration order. */\nexport function listMarkers(): readonly MarkerEntry[] {\n return MARKERS.entries().map((e) => e.value);\n}\n\n/** Test helper. Do not call from product code. */\nexport function _resetMarkersForTests(): void {\n MARKERS.clear();\n seedBuiltins();\n}\n"],"mappings":";;;AA8DA,IAAMA,IAAUC,EAA+B;AAE/C,SAASC,IAAqB;CAC5B,KAAK,IAAMC,KAASC,GAAiB,EAAQ,KAAKD,EAAM,IAAIA,GAAO,EAAE,QAAQ,MAAM,CAAC;AACtF;AACAD,EAAa;AAGb,IAAaG,IAA0CL,EAAQ;AAG/D,SAAgBM,IAA2B;CACzC,OAAON,EAAQ,WAAW;AAC5B;AAIA,SAAgBO,EAAe,GAAgC;CAC7D,OAAOP,EAAQ,KAAKG,EAAM,IAAIA,CAAK;AACrC;AAGA,SAAgBK,EAAU,GAAkD;CAC1E,OAAOC,MAAQ,KAAA,IAAY,KAAA,IAAYT,EAAQ,IAAIS,CAAG;AACxD;AAGA,SAAgBC,IAAsC;CACpD,OAAOV,EAAQ,QAAQ,CAAC,CAAC,KAAK,MAAM,EAAE,KAAK;AAC7C;AAGA,SAAgBW,IAA8B;CAE5C,AADAX,EAAQ,MAAM,GACdE,EAAa;AACf"}
@@ -0,0 +1,39 @@
1
+ import { clientToWorld as e } from "../viewport/clientToWorld.js";
2
+ //#region src/core/stylus/stylus.ts
3
+ function t(e, t = {}) {
4
+ let n = t.minWidth ?? .5, r = t.maxWidth ?? 6, i = t.gamma ?? 1.6, a = Math.max(0, Math.min(1, e)) ** i;
5
+ return n + (r - n) * a;
6
+ }
7
+ function n(e) {
8
+ let t = e, n = e.pointerType ?? "";
9
+ return {
10
+ pressure: e.pressure,
11
+ tiltX: e.tiltX ?? 0,
12
+ tiltY: e.tiltY ?? 0,
13
+ altitudeAngle: typeof t.altitudeAngle == "number" ? t.altitudeAngle : void 0,
14
+ azimuthAngle: typeof t.azimuthAngle == "number" ? t.azimuthAngle : void 0,
15
+ twist: e.twist ?? 0,
16
+ pointerType: n,
17
+ isStylus: n === "pen"
18
+ };
19
+ }
20
+ function r(t, r, i) {
21
+ let a = t.getCoalescedEvents, o = typeof a == "function" ? a.call(t) : [], s = o.length > 0 ? o : [t];
22
+ for (let t of s) {
23
+ let [a, o] = [t.clientX - r.canvasRect.left, t.clientY - r.canvasRect.top], [s, c] = e(t.clientX, t.clientY, r.canvasRect, r.view);
24
+ i({
25
+ clientX: t.clientX,
26
+ clientY: t.clientY,
27
+ screenX: a,
28
+ screenY: o,
29
+ worldX: s,
30
+ worldY: c,
31
+ stylus: n(t),
32
+ event: t
33
+ });
34
+ }
35
+ }
36
+ //#endregion
37
+ export { r as forEachCoalesced, n as getStylusData, t as pressureToWidth };
38
+
39
+ //# sourceMappingURL=stylus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stylus.js","names":["pressureToWidth","minWidth","options","maxWidth","gamma","shaped","pressure","getStylusData","ext","pointerType","forEachCoalesced","get","event","sub","list","e","screenX","screenY","ctx","worldX","worldY","clientToWorld"],"sources":["../../../src/core/stylus/stylus.ts"],"sourcesContent":["import { clientToWorld } from 'core/viewport/clientToWorld';\n/**\n * Stylus / Pencil pointer-event helpers.\n *\n * Most stylus information (pressure, tilt, altitude/azimuth) is already on\n * the standard `PointerEvent`. These helpers normalize the surface across\n * browsers, fill in sensible defaults for non-stylus inputs, and provide\n * a coalesced-event iterator so tools can opt into high-frequency samples\n * (Apple Pencil reports up to ~240Hz; most browsers coalesce those samples\n * into per-frame `pointermove` events whose intermediate states are only\n * accessible via `getCoalescedEvents()`).\n *\n * Apple-specific note: `pointerType: 'pen'` covers Apple Pencil on iPad\n * Safari. The barrel-double-tap (Pencil 2) and barrel-squeeze (Pencil\n * Pro) gestures are NOT exposed to web pages — they remain\n * UIKit-only via `UIPencilInteraction`.\n */\n\n/** Normalized snapshot of stylus state at a single pointer sample. */\nexport interface StylusData {\n /** 0..1. Mouse and ordinary touch report 0 when no button is held and 0.5\n * while a button is held (per the Pointer Events spec). Stylus inputs\n * report a true pressure curve. */\n pressure: number;\n /** Tilt of the pen in degrees from the surface normal, projected onto the\n * X axis. Range ±90. Zero for mouse/touch. */\n tiltX: number;\n /** Tilt projected onto the Y axis. Range ±90. Zero for mouse/touch. */\n tiltY: number;\n /** Newer (Pointer Events level 3) angle in radians between the surface\n * and the pen barrel. π/2 = perpendicular to the surface. Undefined on\n * browsers that haven't shipped the field yet. */\n altitudeAngle: number | undefined;\n /** Newer angle in radians around the Z axis. Undefined on browsers\n * without level-3 support. */\n azimuthAngle: number | undefined;\n /** Rotation of the pen barrel in degrees. Apple Pencil Pro reports this\n * natively but Safari does NOT yet surface it via PointerEvent.twist —\n * expect 0 there. Some Wacom stylus drivers do report it. */\n twist: number;\n /** Raw pointerType from the event ('mouse' | 'pen' | 'touch' | ''). */\n pointerType: string;\n /** Convenience: `pointerType === 'pen'`. */\n isStylus: boolean;\n}\n\n/** Options for `pressureToWidth`. */\nexport interface PressureToWidthOptions {\n /** Width returned at pressure 0. Default 0.5. */\n minWidth?: number;\n /** Width returned at pressure 1. Default 6. */\n maxWidth?: number;\n /** Response curve exponent applied to pressure before lerping\n * (`p ** gamma`). 1 = linear; >1 emphasizes light touches (sharper\n * thin → thick transition); <1 emphasizes heavy touches. Default 1.6,\n * a small bias toward heavy strokes that matches typical pencil feel\n * without crushing the dynamic range. */\n gamma?: number;\n}\n\n/**\n * Map a 0..1 pressure value to a stroke width.\n *\n * `width(p) = minWidth + (maxWidth - minWidth) × p^gamma`\n *\n * Mouse / non-stylus inputs report `pressure === 0` (no button) or `0.5`\n * (button held); callers that don't want uniform 0.5-pressure widths on\n * mouse input should gate on `pointerType === 'pen'` upstream and feed a\n * constant width on the non-stylus path.\n */\nexport function pressureToWidth(\n pressure: number,\n options: PressureToWidthOptions = {},\n): number {\n const minWidth = options.minWidth ?? 0.5;\n const maxWidth = options.maxWidth ?? 6;\n const gamma = options.gamma ?? 1.6;\n const p = Math.max(0, Math.min(1, pressure));\n const shaped = p ** gamma;\n return minWidth + (maxWidth - minWidth) * shaped;\n}\n\n/** Extract a normalized stylus snapshot from any PointerEvent. Pure. */\nexport function getStylusData(e: PointerEvent): StylusData {\n // `altitudeAngle` / `azimuthAngle` are Pointer Events level 3 — only\n // present in newer browsers. Read defensively so the helper degrades\n // gracefully on older runtimes.\n const ext = e as PointerEvent & {\n altitudeAngle?: number;\n azimuthAngle?: number;\n };\n const pointerType = e.pointerType ?? '';\n return {\n pressure: e.pressure,\n tiltX: e.tiltX ?? 0,\n tiltY: e.tiltY ?? 0,\n altitudeAngle: typeof ext.altitudeAngle === 'number' ? ext.altitudeAngle : undefined,\n azimuthAngle: typeof ext.azimuthAngle === 'number' ? ext.azimuthAngle : undefined,\n twist: e.twist ?? 0,\n pointerType,\n isStylus: pointerType === 'pen',\n };\n}\n\n/** One enriched sample, ready for tools that want world coords + stylus\n * data at every coalesced sub-frame. */\nexport interface PointerSample {\n /** Client coords (relative to viewport). */\n clientX: number;\n clientY: number;\n /** Canvas-relative CSS pixels. */\n screenX: number;\n screenY: number;\n /** World coords, derived from `screenX/Y` via the supplied view. */\n worldX: number;\n worldY: number;\n /** Stylus snapshot for this sample. */\n stylus: StylusData;\n /** Original event (may be the parent move or a coalesced sub-event). */\n event: PointerEvent;\n}\n\n/** Context for `forEachCoalesced` — the kit's `ToolCtx` satisfies this. */\nexport interface CoalescedCtx {\n canvasRect: { left: number; top: number };\n view: { x: number; y: number; scale: { x: number; y: number } };\n}\n\n/**\n * Iterate coalesced sub-events of a `pointermove`, yielding a\n * `PointerSample` per sub-event with world coords already derived.\n *\n * Browsers that batch high-frequency samples (Apple Pencil, drawing\n * tablets) expose them through `event.getCoalescedEvents()`. Pen / pencil\n * tools should iterate them for smooth strokes; mouse tools usually only\n * need the parent event and can ignore this.\n *\n * Fallback: when `getCoalescedEvents` is unavailable or returns an empty\n * list, the parent event itself is yielded once so callers don't drop\n * samples on older browsers.\n */\nexport function forEachCoalesced(\n event: PointerEvent,\n ctx: CoalescedCtx,\n cb: (sample: PointerSample) => void,\n): void {\n // Cast through unknown — older lib.dom.d.ts in some toolchains omits the\n // method even though every modern engine ships it.\n const get = (event as unknown as { getCoalescedEvents?: () => PointerEvent[] })\n .getCoalescedEvents;\n const sub = typeof get === 'function' ? get.call(event) : [];\n const list = sub.length > 0 ? sub : [event];\n for (const e of list) {\n const [screenX, screenY] = [e.clientX - ctx.canvasRect.left, e.clientY - ctx.canvasRect.top];\n const [worldX, worldY] = clientToWorld(e.clientX, e.clientY, ctx.canvasRect, ctx.view);\n cb({\n clientX: e.clientX,\n clientY: e.clientY,\n screenX,\n screenY,\n worldX,\n worldY,\n stylus: getStylusData(e),\n event: e,\n });\n }\n}\n"],"mappings":";;AAsEA,SAAgBA,EACd,GACA,IAAkC,CAAC,GAC3B;CACR,IAAMC,IAAWC,EAAQ,YAAY,IAC/BC,IAAWD,EAAQ,YAAY,GAC/BE,IAAQF,EAAQ,SAAS,KAEzBG,IADI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAGC,CAAQ,CAC3B,KAAKF;CACpB,OAAOH,KAAYE,IAAWF,KAAYI;AAC5C;AAGA,SAAgBE,EAAc,GAA6B;CAIzD,IAAMC,IAAM,GAINC,IAAc,EAAE,eAAe;CACrC,OAAO;EACL,UAAU,EAAE;EACZ,OAAO,EAAE,SAAS;EAClB,OAAO,EAAE,SAAS;EAClB,eAAe,OAAOD,EAAI,iBAAkB,WAAWA,EAAI,gBAAgB,KAAA;EAC3E,cAAc,OAAOA,EAAI,gBAAiB,WAAWA,EAAI,eAAe,KAAA;EACxE,OAAO,EAAE,SAAS;EAClB;EACA,UAAUC,MAAgB;CAC5B;AACF;AAuCA,SAAgBC,EACd,GACA,GACA,GACM;CAGN,IAAMC,IAAOC,EACV,oBACGC,IAAM,OAAOF,KAAQ,aAAaA,EAAI,KAAKC,CAAK,IAAI,CAAC,GACrDE,IAAOD,EAAI,SAAS,IAAIA,IAAM,CAACD,CAAK;CAC1C,KAAK,IAAMG,KAAKD,GAAM;EACpB,IAAM,CAACE,GAASC,KAAW,CAACF,EAAE,UAAUG,EAAI,WAAW,MAAMH,EAAE,UAAUG,EAAI,WAAW,GAAG,GACrF,CAACC,GAAQC,KAAUC,EAAcN,EAAE,SAASA,EAAE,SAASG,EAAI,YAAYA,EAAI,IAAI;EACrF,EAAG;GACD,SAASH,EAAE;GACX,SAASA,EAAE;GACX;GACA;GACA;GACA;GACA,QAAQR,EAAcQ,CAAC;GACvB,OAAOA;EACT,CAAC;CACH;AACF"}
@@ -0,0 +1,51 @@
1
+ import { getStylusData as e } from "./stylus.js";
2
+ import { useEffect as t, useRef as n, useState as r } from "react";
3
+ import { useLatest as i } from "@weasel-js/react";
4
+ //#region src/core/stylus/usePointerStylus.ts
5
+ var a = {
6
+ pressure: 0,
7
+ tiltX: 0,
8
+ tiltY: 0,
9
+ altitudeAngle: void 0,
10
+ azimuthAngle: void 0,
11
+ twist: 0,
12
+ pointerType: "",
13
+ isStylus: !1,
14
+ hovering: !1
15
+ };
16
+ function o(o, s = {}) {
17
+ let { maxFps: c = 60, stylusOnly: l = !1 } = s, [u, d] = r(a), f = n(-Infinity), p = i({
18
+ maxFps: c,
19
+ stylusOnly: l
20
+ });
21
+ return t(() => {
22
+ let t = o == null ? window : o instanceof HTMLElement ? o : o.current ?? window, n = (t) => {
23
+ let n = t, { maxFps: r, stylusOnly: i } = p.current;
24
+ if (i && n.pointerType !== "pen") return;
25
+ let a = performance.now(), o = r > 0 && Number.isFinite(r) ? 1e3 / r : 0;
26
+ o > 0 && a - f.current < o || (f.current = a, d((t) => ({
27
+ ...e(n),
28
+ hovering: t.hovering
29
+ })));
30
+ }, r = (e) => {
31
+ let t = e;
32
+ p.current.stylusOnly && t.pointerType !== "pen" || d((e) => ({
33
+ ...e,
34
+ hovering: !0
35
+ }));
36
+ }, i = (e) => {
37
+ let t = e;
38
+ p.current.stylusOnly && t.pointerType !== "pen" || d((e) => ({
39
+ ...e,
40
+ hovering: !1
41
+ }));
42
+ };
43
+ return t.addEventListener("pointermove", n), t.addEventListener("pointerenter", r), t.addEventListener("pointerleave", i), () => {
44
+ t.removeEventListener("pointermove", n), t.removeEventListener("pointerenter", r), t.removeEventListener("pointerleave", i);
45
+ };
46
+ }, [o, p]), u;
47
+ }
48
+ //#endregion
49
+ export { o as usePointerStylus };
50
+
51
+ //# sourceMappingURL=usePointerStylus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePointerStylus.js","names":["IDLE","usePointerStylus","options","state","setState","useState","lastCommit","useRef","optsRef","useLatest","useEffect","el","target","onMove","e","raw","stylusOnly","now","minGap","maxFps","getStylusData","prev","onEnter","onLeave"],"sources":["../../../src/core/stylus/usePointerStylus.ts"],"sourcesContent":["import { useEffect, useRef, useState, type RefObject } from 'react';\nimport { useLatest } from '@weasel-js/react';\nimport { getStylusData, type StylusData } from './stylus';\n\n/** State exposed by `usePointerStylus` — the most recent stylus snapshot\n * plus a `hovering` flag for the Pencil 2 / Pencil Pro \"near-surface but\n * not touching\" event stream. */\nexport interface PointerStylusState extends StylusData {\n /** True between `pointerenter` and `pointerleave` events on the target\n * element. iPad Safari fires these for Apple Pencil hover (on iPad Pro\n * / Pencil Pro), so this lights up when the pen is detected near the\n * glass without contact. */\n hovering: boolean;\n}\n\nconst IDLE: PointerStylusState = {\n pressure: 0,\n tiltX: 0,\n tiltY: 0,\n altitudeAngle: undefined,\n azimuthAngle: undefined,\n twist: 0,\n pointerType: '',\n isStylus: false,\n hovering: false,\n};\n\n/** Options for `usePointerStylus`. */\nexport interface UsePointerStylusOptions {\n /** Throttle re-renders to ≈this many state updates per second. The latest\n * sample is always kept; intermediates are dropped. Default 60. Set to\n * `Infinity` (or 0) to emit every move. */\n maxFps?: number;\n /** When true, only emit updates while `pointerType === 'pen'`. Useful\n * for stylus-only UI that should freeze when the user reaches for a\n * mouse. Default false. */\n stylusOnly?: boolean;\n}\n\n/**\n * Subscribe to pointer events on a target element (defaults to `window`)\n * and expose the most recent stylus snapshot.\n *\n * Reads pointer data via `pointermove` (button or no button) and tracks\n * `pointerenter` / `pointerleave` for the `hovering` flag. The hook does\n * NOT consume pointerdown / pointerup — leave gesture handling to the\n * Tool dispatcher.\n *\n * Re-renders are throttled by default to avoid storming the React scheduler\n * with 120–240Hz stylus updates. Consumers that need every sample (e.g.\n * recording for replay) should pass `maxFps: Infinity` and accept the\n * cost, or read a ref-backed snapshot in a `useFrame`-style loop instead.\n */\nexport function usePointerStylus(\n target?: RefObject<HTMLElement | null> | HTMLElement | null,\n options: UsePointerStylusOptions = {},\n): PointerStylusState {\n const { maxFps = 60, stylusOnly = false } = options;\n const [state, setState] = useState<PointerStylusState>(IDLE);\n // Track the last commit time to throttle. A ref avoids re-creating the\n // listener every render and avoids stale-closure read of an outer `let`.\n const lastCommit = useRef(-Infinity);\n const optsRef = useLatest({ maxFps, stylusOnly });\n\n useEffect(() => {\n const el: EventTarget =\n target == null\n ? window\n : target instanceof HTMLElement\n ? target\n : target.current ?? window;\n\n const onMove = (raw: Event) => {\n const e = raw as PointerEvent;\n const { maxFps, stylusOnly } = optsRef.current;\n if (stylusOnly && e.pointerType !== 'pen') return;\n const now = performance.now();\n const minGap = maxFps > 0 && Number.isFinite(maxFps) ? 1000 / maxFps : 0;\n if (minGap > 0 && now - lastCommit.current < minGap) return;\n lastCommit.current = now;\n setState((prev) => ({ ...getStylusData(e), hovering: prev.hovering }));\n };\n const onEnter = (raw: Event) => {\n const e = raw as PointerEvent;\n if (optsRef.current.stylusOnly && e.pointerType !== 'pen') return;\n setState((prev) => ({ ...prev, hovering: true }));\n };\n const onLeave = (raw: Event) => {\n const e = raw as PointerEvent;\n if (optsRef.current.stylusOnly && e.pointerType !== 'pen') return;\n setState((prev) => ({ ...prev, hovering: false }));\n };\n\n el.addEventListener('pointermove', onMove);\n el.addEventListener('pointerenter', onEnter);\n el.addEventListener('pointerleave', onLeave);\n return () => {\n el.removeEventListener('pointermove', onMove);\n el.removeEventListener('pointerenter', onEnter);\n el.removeEventListener('pointerleave', onLeave);\n };\n }, [target, optsRef]);\n\n return state;\n}\n"],"mappings":";;;;AAeA,IAAMA,IAA2B;CAC/B,UAAU;CACV,OAAO;CACP,OAAO;CACP,eAAe,KAAA;CACf,cAAc,KAAA;CACd,OAAO;CACP,aAAa;CACb,UAAU;CACV,UAAU;AACZ;AA4BA,SAAgBC,EACd,GACA,IAAmC,CAAC,GAChB;CACpB,IAAM,EAAE,YAAS,IAAI,gBAAa,OAAUC,GACtC,CAACC,GAAOC,KAAYC,EAA6BL,CAAI,GAGrDM,IAAaC,EAAO,SAAS,GAC7BC,IAAUC,EAAU;EAAE;EAAQ;CAAW,CAAC;CAyChD,OAvCAC,QAAgB;EACd,IAAMC,IACJC,KAAU,OACN,SACAA,aAAkB,cAChBA,IACAA,EAAO,WAAW,QAEpBC,KAAU,MAAe;GAC7B,IAAMC,IAAIC,GACJ,EAAE,WAAQ,kBAAeP,EAAQ;GACvC,IAAIQ,KAAcF,EAAE,gBAAgB,OAAO;GAC3C,IAAMG,IAAM,YAAY,IAAI,GACtBC,IAASC,IAAS,KAAK,OAAO,SAASA,CAAM,IAAI,MAAOA,IAAS;GACvE,AAAID,IAAS,KAAKD,IAAMX,EAAW,UAAUY,MAC7C,EAAW,UAAUD,GACrBb,GAAU,OAAU;IAAE,GAAGgB,EAAcN,CAAC;IAAG,UAAUO,EAAK;GAAS,EAAE;EACvE,GACMC,KAAW,MAAe;GAC9B,IAAMR,IAAIC;GACV,AAAIP,EAAQ,QAAQ,cAAcM,EAAE,gBAAgB,SACpDV,GAAU,OAAU;IAAE,GAAGiB;IAAM,UAAU;GAAK,EAAE;EAClD,GACME,KAAW,MAAe;GAC9B,IAAMT,IAAIC;GACV,AAAIP,EAAQ,QAAQ,cAAcM,EAAE,gBAAgB,SACpDV,GAAU,OAAU;IAAE,GAAGiB;IAAM,UAAU;GAAM,EAAE;EACnD;EAKA,OAHAV,EAAG,iBAAiB,eAAeE,CAAM,GACzCF,EAAG,iBAAiB,gBAAgBW,CAAO,GAC3CX,EAAG,iBAAiB,gBAAgBY,CAAO,SAC9B;GAGX,AAFAZ,EAAG,oBAAoB,eAAeE,CAAM,GAC5CF,EAAG,oBAAoB,gBAAgBW,CAAO,GAC9CX,EAAG,oBAAoB,gBAAgBY,CAAO;EAChD;CACF,GAAG,CAACX,GAAQJ,CAAO,CAAC,GAEbL;AACT"}
@@ -0,0 +1,17 @@
1
+ import { getPaintKind as e, listGradientKinds as t, listPaintKinds as n, paintKindRegistry as r } from "./paintKinds.js";
2
+ import { useCallback as i, useSyncExternalStore as a } from "react";
3
+ //#region src/core/usePaintKinds.ts
4
+ function o() {
5
+ return a(r.subscribe, n, n);
6
+ }
7
+ function s() {
8
+ return a(r.subscribe, t, t);
9
+ }
10
+ function c(t) {
11
+ let n = i(() => e(t), [t]);
12
+ return a(r.subscribe, n, n);
13
+ }
14
+ //#endregion
15
+ export { s as useGradientKinds, c as usePaintKind, o as usePaintKinds };
16
+
17
+ //# sourceMappingURL=usePaintKinds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePaintKinds.js","names":["usePaintKinds","useSyncExternalStore","paintKindRegistry","listPaintKinds","useGradientKinds","listGradientKinds","usePaintKind","read","useCallback","getPaintKind","kind"],"sources":["../../src/core/usePaintKinds.ts"],"sourcesContent":["import { useCallback, useSyncExternalStore } from 'react';\nimport {\n getPaintKind, listGradientKinds, listPaintKinds, paintKindRegistry, type PaintKindEntry,\n} from './paintKinds';\n\n/** Every registered paint kind, as {@link listPaintKinds} returns it,\n * re-rendering the caller whenever a kind is registered or removed. */\nexport function usePaintKinds(): readonly PaintKindEntry[] {\n return useSyncExternalStore(paintKindRegistry.subscribe, listPaintKinds, listPaintKinds);\n}\n\n/** Every registered gradient kind, as {@link listGradientKinds} returns it,\n * re-rendering the caller whenever a kind is registered or removed. */\nexport function useGradientKinds(): readonly PaintKindEntry[] {\n return useSyncExternalStore(paintKindRegistry.subscribe, listGradientKinds, listGradientKinds);\n}\n\n/**\n * The entry for `kind`, as {@link getPaintKind} returns it — `undefined` until\n * it is registered, and the new entry once it is. A kind with a loader starts\n * loading on the first read.\n */\nexport function usePaintKind(kind: string | undefined): PaintKindEntry | undefined {\n const read = useCallback(() => getPaintKind(kind), [kind]);\n return useSyncExternalStore(paintKindRegistry.subscribe, read, read);\n}\n"],"mappings":";;;AAOA,SAAgBA,IAA2C;CACzD,OAAOC,EAAqBC,EAAkB,WAAWC,GAAgBA,CAAc;AACzF;AAIA,SAAgBC,IAA8C;CAC5D,OAAOH,EAAqBC,EAAkB,WAAWG,GAAmBA,CAAiB;AAC/F;AAOA,SAAgBC,EAAa,GAAsD;CACjF,IAAMC,IAAOC,QAAkBC,EAAaC,CAAI,GAAG,CAACA,CAAI,CAAC;CACzD,OAAOT,EAAqBC,EAAkB,WAAWK,GAAMA,CAAI;AACrE"}
@@ -0,0 +1,24 @@
1
+ //#region src/core/viewport/clampView.ts
2
+ function e(e, t, n) {
3
+ let r = Math.abs(n.width / e.scale.x), i = Math.abs(n.height / e.scale.y), a = e.scale.x < 0, o = e.scale.y < 0, s;
4
+ if (r >= t.width) s = t.x + (t.width - r) / 2 + (a ? r : 0);
5
+ else {
6
+ let n = a ? t.x + r : t.x, i = a ? t.x + t.width : t.x + t.width - r;
7
+ s = e.x < n ? n : e.x > i ? i : e.x;
8
+ }
9
+ let c;
10
+ if (i >= t.height) c = t.y + (t.height - i) / 2 + (o ? i : 0);
11
+ else {
12
+ let n = o ? t.y + i : t.y, r = o ? t.y + t.height : t.y + t.height - i;
13
+ c = e.y < n ? n : e.y > r ? r : e.y;
14
+ }
15
+ return s === e.x && c === e.y ? e : {
16
+ x: s,
17
+ y: c,
18
+ scale: e.scale
19
+ };
20
+ }
21
+ //#endregion
22
+ export { e as clampView };
23
+
24
+ //# sourceMappingURL=clampView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clampView.js","names":["clampView","visW","canvas","view","visH","flipX","flipY","x","bounds","minX","maxX","y","minY","maxY"],"sources":["../../../src/core/viewport/clampView.ts"],"sourcesContent":["import type { View } from './view';\n\n/** The world rect a view is not allowed to show outside of. */\nexport interface ClampBounds {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** Canvas dimensions in CSS pixels — needed to know how much world a view\n * actually shows. */\nexport interface CanvasSize {\n width: number;\n height: number;\n}\n\n/**\n * Clamp a `View` so the visible world rect stays within `bounds`.\n *\n * Visible world rect = `[view.x, view.x + canvas.width / view.scale.x]` ×\n * `[view.y, view.y + canvas.height / view.scale.y]`.\n *\n * If the visible rect is larger than `bounds` along an axis (zoomed out\n * past the bounds extent), the view is centered on that axis so bounds\n * sits in the middle of the canvas.\n */\nexport function clampView(view: View, bounds: ClampBounds, canvas: CanvasSize): View {\n // A negative scale is a flipped axis, so the visible rect runs the other way\n // from `view.x`/`view.y`: its extent is the magnitude, and the anchor is the\n // rect's far edge rather than its near one.\n const visW = Math.abs(canvas.width / view.scale.x);\n const visH = Math.abs(canvas.height / view.scale.y);\n const flipX = view.scale.x < 0;\n const flipY = view.scale.y < 0;\n\n let x: number;\n if (visW >= bounds.width) {\n x = bounds.x + (bounds.width - visW) / 2 + (flipX ? visW : 0);\n } else {\n const minX = flipX ? bounds.x + visW : bounds.x;\n const maxX = flipX ? bounds.x + bounds.width : bounds.x + bounds.width - visW;\n x = view.x < minX ? minX : view.x > maxX ? maxX : view.x;\n }\n\n let y: number;\n if (visH >= bounds.height) {\n y = bounds.y + (bounds.height - visH) / 2 + (flipY ? visH : 0);\n } else {\n const minY = flipY ? bounds.y + visH : bounds.y;\n const maxY = flipY ? bounds.y + bounds.height : bounds.y + bounds.height - visH;\n y = view.y < minY ? minY : view.y > maxY ? maxY : view.y;\n }\n\n return x === view.x && y === view.y ? view : { x, y, scale: view.scale };\n}\n"],"mappings":";AA2BA,SAAgBA,EAAU,GAAY,GAAqB,GAA0B;CAInF,IAAMC,IAAO,KAAK,IAAIC,EAAO,QAAQC,EAAK,MAAM,CAAC,GAC3CC,IAAO,KAAK,IAAIF,EAAO,SAASC,EAAK,MAAM,CAAC,GAC5CE,IAAQF,EAAK,MAAM,IAAI,GACvBG,IAAQH,EAAK,MAAM,IAAI,GAEzBI;CACJ,IAAIN,KAAQO,EAAO,OACjB,IAAIA,EAAO,KAAKA,EAAO,QAAQP,KAAQ,KAAKI,IAAQJ,IAAO;MACtD;EACL,IAAMQ,IAAOJ,IAAQG,EAAO,IAAIP,IAAOO,EAAO,GACxCE,IAAOL,IAAQG,EAAO,IAAIA,EAAO,QAAQA,EAAO,IAAIA,EAAO,QAAQP;EACzE,IAAIE,EAAK,IAAIM,IAAOA,IAAON,EAAK,IAAIO,IAAOA,IAAOP,EAAK;CACzD;CAEA,IAAIQ;CACJ,IAAIP,KAAQI,EAAO,QACjB,IAAIA,EAAO,KAAKA,EAAO,SAASJ,KAAQ,KAAKE,IAAQF,IAAO;MACvD;EACL,IAAMQ,IAAON,IAAQE,EAAO,IAAIJ,IAAOI,EAAO,GACxCK,IAAOP,IAAQE,EAAO,IAAIA,EAAO,SAASA,EAAO,IAAIA,EAAO,SAASJ;EAC3E,IAAID,EAAK,IAAIS,IAAOA,IAAOT,EAAK,IAAIU,IAAOA,IAAOV,EAAK;CACzD;CAEA,OAAOI,MAAMJ,EAAK,KAAKQ,MAAMR,EAAK,IAAIA,IAAO;EAAE;EAAG;EAAG,OAAOA,EAAK;CAAM;AACzE"}
@@ -0,0 +1,8 @@
1
+ //#region src/core/viewport/clientToWorld.ts
2
+ function e(e, t, n, r) {
3
+ return [(e - n.left) / r.scale.x + r.x, (t - n.top) / r.scale.y + r.y];
4
+ }
5
+ //#endregion
6
+ export { e as clientToWorld };
7
+
8
+ //# sourceMappingURL=clientToWorld.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clientToWorld.js","names":["clientToWorld","clientX","origin","view","clientY"],"sources":["../../../src/core/viewport/clientToWorld.ts"],"sourcesContent":["/**\n * Convert client coords directly to world coords by subtracting the canvas\n * rect origin and then applying the inverse view transform.\n *\n * This is the composition of `clientToCanvas` + the view-inverse half of\n * `screenToWorld`, but expressed against the `ViewLike` shape used by\n * `SceneCanvas` / `ToolCtx` (`{ scale: { x, y }, x, y }`) rather than the\n * `ViewTransform` shape used by `screenToWorld` (`{ panX, panY, zoom }`).\n */\nexport interface ViewLike {\n scale: { x: number; y: number };\n x: number;\n y: number;\n}\n\n/**\n * Map a browser client coord pair to world coords.\n *\n * @param clientX - `event.clientX`\n * @param clientY - `event.clientY`\n * @param origin - client-space origin of the surface `view` is a camera on.\n * For a whole canvas that is its bounding rect. For a viewport node it is\n * the canvas rect offset by the viewport's own rect, so the same call maps\n * into that viewport's inner world.\n * @param view - current viewport transform\n */\nexport function clientToWorld(\n clientX: number,\n clientY: number,\n origin: { left: number; top: number },\n view: ViewLike,\n): [number, number] {\n return [\n (clientX - origin.left) / view.scale.x + view.x,\n (clientY - origin.top) / view.scale.y + view.y,\n ];\n}\n"],"mappings":";AA0BA,SAAgBA,EACd,GACA,GACA,GACA,GACkB;CAClB,OAAO,EACJC,IAAUC,EAAO,QAAQC,EAAK,MAAM,IAAIA,EAAK,IAC7CC,IAAUF,EAAO,OAAOC,EAAK,MAAM,IAAIA,EAAK,CAC/C;AACF"}
@@ -0,0 +1,39 @@
1
+ //#region src/core/viewport/createVelocityTracker.ts
2
+ function e() {
3
+ let e = [];
4
+ return {
5
+ record(t, n, r) {
6
+ e.push({
7
+ dx: t,
8
+ dy: n,
9
+ t: r
10
+ });
11
+ let i = r - 100;
12
+ e = e.filter((e) => e.t >= i);
13
+ },
14
+ getVelocity() {
15
+ let t = e;
16
+ if (t.length < 2) return {
17
+ vx: 0,
18
+ vy: 0
19
+ };
20
+ let n = t[t.length - 1].t - t[0].t;
21
+ if (n === 0) return {
22
+ vx: 0,
23
+ vy: 0
24
+ };
25
+ let r = t.slice(1).reduce((e, t) => e + t.dx, 0), i = t.slice(1).reduce((e, t) => e + t.dy, 0);
26
+ return {
27
+ vx: r / n,
28
+ vy: i / n
29
+ };
30
+ },
31
+ reset() {
32
+ e = [];
33
+ }
34
+ };
35
+ }
36
+ //#endregion
37
+ export { e as createVelocityTracker };
38
+
39
+ //# sourceMappingURL=createVelocityTracker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createVelocityTracker.js","names":["createVelocityTracker","samples","cutoff","t","s","dt","totalDx","acc","p","totalDy"],"sources":["../../../src/core/viewport/createVelocityTracker.ts"],"sourcesContent":["interface Sample { dx: number; dy: number; t: number }\n\n/** Records recent deltas and reports the current velocity, averaged over the\n * last 100ms — the throw speed a momentum decay starts from. */\nexport interface VelocityTracker {\n record(dx: number, dy: number, t: number): void;\n getVelocity(): { vx: number; vy: number };\n reset(): void;\n}\n\n/** Hook-free velocity tracker. `useVelocityTracker` wraps one of these; the\n * action layer builds its own, because an Action descriptor is a static\n * object and cannot call hooks. */\nexport function createVelocityTracker(): VelocityTracker {\n let samples: Sample[] = [];\n return {\n record(dx, dy, t) {\n samples.push({ dx, dy, t });\n const cutoff = t - 100;\n samples = samples.filter(s => s.t >= cutoff);\n },\n getVelocity() {\n const s = samples;\n if (s.length < 2) return { vx: 0, vy: 0 };\n const dt = s[s.length - 1].t - s[0].t;\n if (dt === 0) return { vx: 0, vy: 0 };\n const totalDx = s.slice(1).reduce((acc, p) => acc + p.dx, 0);\n const totalDy = s.slice(1).reduce((acc, p) => acc + p.dy, 0);\n return { vx: totalDx / dt, vy: totalDy / dt };\n },\n reset() { samples = []; },\n };\n}\n"],"mappings":";AAaA,SAAgBA,IAAyC;CACvD,IAAIC,IAAoB,CAAC;CACzB,OAAO;EACL,OAAO,GAAI,GAAI,GAAG;GAChB,EAAQ,KAAK;IAAE;IAAI;IAAI;GAAE,CAAC;GAC1B,IAAMC,IAASC,IAAI;GACnB,IAAUF,EAAQ,QAAO,MAAKG,EAAE,KAAKF,CAAM;EAC7C;EACA,cAAc;GACZ,IAAME,IAAIH;GACV,IAAIG,EAAE,SAAS,GAAG,OAAO;IAAE,IAAI;IAAG,IAAI;GAAE;GACxC,IAAMC,IAAKD,EAAEA,EAAE,SAAS,EAAE,CAAC,IAAIA,EAAE,EAAE,CAAC;GACpC,IAAIC,MAAO,GAAG,OAAO;IAAE,IAAI;IAAG,IAAI;GAAE;GACpC,IAAMC,IAAUF,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAK,MAAMG,IAAMC,EAAE,IAAI,CAAC,GACrDC,IAAUL,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,GAAK,MAAMG,IAAMC,EAAE,IAAI,CAAC;GAC3D,OAAO;IAAE,IAAIF,IAAUD;IAAI,IAAII,IAAUJ;GAAG;EAC9C;EACA,QAAQ;GAAE,IAAU,CAAC;EAAG;CAC1B;AACF"}
@@ -0,0 +1,18 @@
1
+ import { normalizeZoom as e } from "./zoomBounds.js";
2
+ //#region src/core/viewport/fitToBounds.ts
3
+ function t(t, n, r, i, a) {
4
+ let o = Math.min(t / r, n / i), s = a?.min ?? -Infinity, c = a?.max ?? Infinity;
5
+ return e(Math.min(c, Math.max(s, o)));
6
+ }
7
+ function n(e, n, r, i, a = 0, o) {
8
+ let s = t(Math.max(1, e - a * 2), Math.max(1, n - a * 2), r, i, o), c = r * s, l = i * s;
9
+ return {
10
+ zoom: s,
11
+ panX: (e - c) / 2,
12
+ panY: (n - l) / 2
13
+ };
14
+ }
15
+ //#endregion
16
+ export { n as fitToBounds, t as fitZoom };
17
+
18
+ //# sourceMappingURL=fitToBounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fitToBounds.js","names":["fitZoom","raw","availW","contentW","availH","contentH","min","clamp","max","normalizeZoom","fitToBounds","zoom","viewportW","paddingPx","viewportH","contentPxW","contentPxH"],"sources":["../../../src/core/viewport/fitToBounds.ts"],"sourcesContent":["import { normalizeZoom } from './zoomBounds';\n\n/**\n * Compute the largest uniform zoom (px per content-unit) that fits a content\n * rect of `contentW x contentH` (in content units) into a viewport rect of\n * `availW x availH` (in pixels).\n *\n * `clamp` optionally bounds the resulting zoom to [min, max].\n */\nexport function fitZoom(\n availW: number,\n availH: number,\n contentW: number,\n contentH: number,\n clamp?: { min?: number; max?: number },\n): number {\n const raw = Math.min(availW / contentW, availH / contentH);\n const min = clamp?.min ?? -Infinity;\n const max = clamp?.max ?? Infinity;\n return normalizeZoom(Math.min(max, Math.max(min, raw)));\n}\n\n/**\n * Compute zoom + pan that centers `contentW x contentH` (content units) inside\n * a `viewportW x viewportH` (pixel) rect. `paddingPx` is uniform pixel padding\n * on every side.\n */\nexport function fitToBounds(\n viewportW: number,\n viewportH: number,\n contentW: number,\n contentH: number,\n paddingPx = 0,\n clamp?: { min?: number; max?: number },\n): { zoom: number; panX: number; panY: number } {\n const availW = Math.max(1, viewportW - paddingPx * 2);\n const availH = Math.max(1, viewportH - paddingPx * 2);\n const zoom = fitZoom(availW, availH, contentW, contentH, clamp);\n const contentPxW = contentW * zoom;\n const contentPxH = contentH * zoom;\n return {\n zoom,\n panX: (viewportW - contentPxW) / 2,\n panY: (viewportH - contentPxH) / 2,\n };\n}\n"],"mappings":";;AASA,SAAgBA,EACd,GACA,GACA,GACA,GACA,GACQ;CACR,IAAMC,IAAM,KAAK,IAAIC,IAASC,GAAUC,IAASC,CAAQ,GACnDC,IAAMC,GAAO,OAAO,WACpBC,IAAMD,GAAO,OAAO;CAC1B,OAAOE,EAAc,KAAK,IAAID,GAAK,KAAK,IAAIF,GAAKL,CAAG,CAAC,CAAC;AACxD;AAOA,SAAgBS,EACd,GACA,GACA,GACA,GACA,IAAY,GACZ,GAC8C;CAG9C,IAAMC,IAAOX,EAFE,KAAK,IAAI,GAAGY,IAAYC,IAAY,CAE9B,GADN,KAAK,IAAI,GAAGC,IAAYD,IAAY,CACtB,GAAQV,GAAUE,GAAUE,CAAK,GACxDQ,IAAaZ,IAAWQ,GACxBK,IAAaX,IAAWM;CAC9B,OAAO;EACL;EACA,OAAOC,IAAYG,KAAc;EACjC,OAAOD,IAAYE,KAAc;CACnC;AACF"}
@@ -0,0 +1,36 @@
1
+ import { DEFAULT_MAX_ZOOM as e, DEFAULT_MIN_ZOOM as t, normalizeZoom as n } from "./zoomBounds.js";
2
+ //#region src/core/viewport/fitViewToBounds.ts
3
+ function r(r, i, a, o = {}) {
4
+ let { padding: s = 16, maxScale: c = e, minScale: l = t } = o;
5
+ if (r.width <= 0 || r.height <= 0) return console.warn("[weasel] fitViewToBounds: bounds has zero or negative area; returning currentView unchanged.", r), a;
6
+ if (i.width <= 0 || i.height <= 0) return console.warn("[weasel] fitViewToBounds: viewport has zero or negative area; returning currentView unchanged.", i), a;
7
+ let u = Math.max(1, i.width - s * 2), d = Math.max(1, i.height - s * 2), f = u / r.width, p = d / r.height, m, h;
8
+ switch (o.mode ?? "contain") {
9
+ case "fill": {
10
+ let e = Math.max(f, p);
11
+ m = e, h = e;
12
+ break;
13
+ }
14
+ case "stretch":
15
+ m = f, h = p;
16
+ break;
17
+ default: {
18
+ let e = Math.min(f, p);
19
+ m = e, h = e;
20
+ break;
21
+ }
22
+ }
23
+ let g = n(Math.min(c, Math.max(l, m))), _ = n(Math.min(c, Math.max(l, h))), v = r.x + r.width / 2, y = r.y + r.height / 2;
24
+ return {
25
+ x: v - i.width / (2 * g),
26
+ y: y - i.height / (2 * _),
27
+ scale: {
28
+ x: g,
29
+ y: _
30
+ }
31
+ };
32
+ }
33
+ //#endregion
34
+ export { r as fitViewToBounds };
35
+
36
+ //# sourceMappingURL=fitViewToBounds.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fitViewToBounds.js","names":["fitViewToBounds","DEFAULT_MAX_ZOOM","DEFAULT_MIN_ZOOM","opts","bounds","currentView","viewportDims","availW","padding","availH","sx","sy","rawX","rawY","u","scaleX","normalizeZoom","maxScale","minScale","scaleY","worldCx","worldCy"],"sources":["../../../src/core/viewport/fitViewToBounds.ts"],"sourcesContent":["import type { View } from './view';\nimport { DEFAULT_MIN_ZOOM, DEFAULT_MAX_ZOOM, normalizeZoom } from './zoomBounds';\n\n/** `Bounds` is declared in `@weasel-js/routing`, which is typed in it\n * throughout — every area-select, resize and preview surface names one.\n * Re-exported here, where core's call sites have always looked. */\nimport type { Bounds } from '@weasel-js/routing';\nexport type { Bounds };\n\n/** Pixel dimensions of the canvas viewport. */\nexport interface ViewportDims {\n width: number;\n height: number;\n}\n\n/** Options for {@link fitViewToBounds}. */\nexport interface FitViewToBoundsOptions {\n /** Inset (in CSS px) around the bounds. Default 16. */\n padding?: number;\n /**\n * Override the kit's system max scale. Defaults to the kit-wide max zoom\n * used by `computeWheelAction` (`DEFAULT_MAX_ZOOM`).\n */\n maxScale?: number;\n /**\n * Override the kit's system min scale. Defaults to the kit-wide min zoom\n * used by `computeWheelAction` (`DEFAULT_MIN_ZOOM`).\n */\n minScale?: number;\n /**\n * Fit mode:\n * - `'contain'` (default): uniform scale = `min(availW/w, availH/h)`. Bounds fit entirely; one axis has letterboxing.\n * - `'fill'`: uniform scale = `max(...)`. Bounds overflow viewport on one axis.\n * - `'stretch'`: per-axis scale. Bounds match viewport exactly; scale is non-uniform.\n */\n mode?: 'contain' | 'fill' | 'stretch';\n}\n\n/**\n * Compute the target {@link View} that fits `bounds` (world space) inside\n * `viewportDims` (CSS px). The bounds are centered in the viewport with\n * uniform padding on all sides; the resulting scale is clamped to the\n * configured min/max.\n *\n * View semantics: `view.x` / `view.y` is the world point currently drawn at\n * the canvas top-left, and `view.scale.{x,y}` is pixels per world unit on\n * each axis (see `view.ts`). So:\n * screenX = (worldX - view.x) * view.scale.x\n * screenY = (worldY - view.y) * view.scale.y\n *\n * Empty / zero-sized bounds or viewports cannot be fit — in that case this\n * returns `currentView` unchanged and logs a `console.warn`. Callers that\n * want to no-op silently can detect zero area themselves before calling.\n */\nexport function fitViewToBounds(\n bounds: Bounds,\n viewportDims: ViewportDims,\n currentView: View,\n opts: FitViewToBoundsOptions = {},\n): View {\n const { padding = 16, maxScale = DEFAULT_MAX_ZOOM, minScale = DEFAULT_MIN_ZOOM } = opts;\n\n if (bounds.width <= 0 || bounds.height <= 0) {\n console.warn('[weasel] fitViewToBounds: bounds has zero or negative area; returning currentView unchanged.', bounds);\n return currentView;\n }\n if (viewportDims.width <= 0 || viewportDims.height <= 0) {\n console.warn('[weasel] fitViewToBounds: viewport has zero or negative area; returning currentView unchanged.', viewportDims);\n return currentView;\n }\n\n const availW = Math.max(1, viewportDims.width - padding * 2);\n const availH = Math.max(1, viewportDims.height - padding * 2);\n const sx = availW / bounds.width;\n const sy = availH / bounds.height;\n\n let rawX: number;\n let rawY: number;\n switch (opts.mode ?? 'contain') {\n case 'fill': {\n const u = Math.max(sx, sy);\n rawX = u;\n rawY = u;\n break;\n }\n case 'stretch':\n rawX = sx;\n rawY = sy;\n break;\n case 'contain':\n default: {\n const u = Math.min(sx, sy);\n rawX = u;\n rawY = u;\n break;\n }\n }\n const scaleX = normalizeZoom(Math.min(maxScale, Math.max(minScale, rawX)));\n const scaleY = normalizeZoom(Math.min(maxScale, Math.max(minScale, rawY)));\n\n // Center bounds in the viewport. With view-as-camera semantics:\n // screenCenter = (worldCenter - view.x) * scale\n // view.x = worldCenter - viewportCenter / scale\n const worldCx = bounds.x + bounds.width / 2;\n const worldCy = bounds.y + bounds.height / 2;\n return {\n x: worldCx - viewportDims.width / (2 * scaleX),\n y: worldCy - viewportDims.height / (2 * scaleY),\n scale: { x: scaleX, y: scaleY },\n };\n}\n"],"mappings":";;AAsDA,SAAgBA,EACd,GACA,GACA,GACA,IAA+B,CAAC,GAC1B;CACN,IAAM,EAAE,aAAU,IAAI,cAAWC,GAAkB,cAAWC,MAAqBC;CAEnF,IAAIC,EAAO,SAAS,KAAKA,EAAO,UAAU,GAExC,OADA,QAAQ,KAAK,gGAAgGA,CAAM,GAC5GC;CAET,IAAIC,EAAa,SAAS,KAAKA,EAAa,UAAU,GAEpD,OADA,QAAQ,KAAK,kGAAkGA,CAAY,GACpHD;CAGT,IAAME,IAAS,KAAK,IAAI,GAAGD,EAAa,QAAQE,IAAU,CAAC,GACrDC,IAAS,KAAK,IAAI,GAAGH,EAAa,SAASE,IAAU,CAAC,GACtDE,IAAKH,IAASH,EAAO,OACrBO,IAAKF,IAASL,EAAO,QAEvBQ,GACAC;CACJ,QAAQV,EAAK,QAAQ,WAArB;EACE,KAAK,QAAQ;GACX,IAAMW,IAAI,KAAK,IAAIJ,GAAIC,CAAE;GAEzB,AADA,IAAOG,GACP,IAAOA;GACP;EACF;EACA,KAAK;GAEH,AADA,IAAOJ,GACP,IAAOC;GACP;EAEF,SAAS;GACP,IAAMG,IAAI,KAAK,IAAIJ,GAAIC,CAAE;GAEzB,AADA,IAAOG,GACP,IAAOA;GACP;EACF;CACF;CACA,IAAMC,IAASC,EAAc,KAAK,IAAIC,GAAU,KAAK,IAAIC,GAAUN,CAAI,CAAC,CAAC,GACnEO,IAASH,EAAc,KAAK,IAAIC,GAAU,KAAK,IAAIC,GAAUL,CAAI,CAAC,CAAC,GAKnEO,IAAUhB,EAAO,IAAIA,EAAO,QAAQ,GACpCiB,IAAUjB,EAAO,IAAIA,EAAO,SAAS;CAC3C,OAAO;EACL,GAAGgB,IAAUd,EAAa,SAAS,IAAIS;EACvC,GAAGM,IAAUf,EAAa,UAAU,IAAIa;EACxC,OAAO;GAAE,GAAGJ;GAAQ,GAAGI;EAAO;CAChC;AACF"}
@@ -0,0 +1,34 @@
1
+ //#region src/core/viewport/interpolateView.ts
2
+ function e(e, t, n, r) {
3
+ let i = (i) => ({
4
+ x: e + (n - e) * i,
5
+ s: t + (r - t) * i
6
+ });
7
+ if (!(t > 0) || !(r > 0) || Math.abs(r - t) <= 1e-12 * Math.max(Math.abs(t), Math.abs(r), 1)) return i;
8
+ let a = (n - e) / (1 / t - 1 / r), o = a / t + e, s = r / t;
9
+ return (e) => {
10
+ let n = t * s ** +e;
11
+ return {
12
+ x: o - a / n,
13
+ s: n
14
+ };
15
+ };
16
+ }
17
+ function t(t, n) {
18
+ let r = e(t.x, t.scale.x, n.x, n.scale.x), i = e(t.y, t.scale.y, n.y, n.scale.y);
19
+ return (e) => {
20
+ let t = r(e), n = i(e);
21
+ return {
22
+ x: t.x,
23
+ y: n.x,
24
+ scale: {
25
+ x: t.s,
26
+ y: n.s
27
+ }
28
+ };
29
+ };
30
+ }
31
+ //#endregion
32
+ export { t as interpolateView };
33
+
34
+ //# sourceMappingURL=interpolateView.js.map