@weasel-js/core 1.10.0 → 1.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (327) hide show
  1. package/CHANGELOG.md +168 -0
  2. package/README.md +33 -0
  3. package/dist/affordances/composeAffordanceLayer.js +21 -21
  4. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  5. package/dist/affordances/hitAffordanceRegions.js +48 -32
  6. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  7. package/dist/affordances/pathAnchors.js +50 -28
  8. package/dist/affordances/pathAnchors.js.map +1 -1
  9. package/dist/affordances/rotateCursor.js +12 -0
  10. package/dist/affordances/rotateCursor.js.map +1 -0
  11. package/dist/affordances/rotationHandle.js +40 -43
  12. package/dist/affordances/rotationHandle.js.map +1 -1
  13. package/dist/animation/rig/rigNode.js +9 -3
  14. package/dist/animation/rig/rigNode.js.map +1 -1
  15. package/dist/animation/rig/rigSeat.js +46 -13
  16. package/dist/animation/rig/rigSeat.js.map +1 -1
  17. package/dist/animation/rig/skinBinding.js +22 -14
  18. package/dist/animation/rig/skinBinding.js.map +1 -1
  19. package/dist/barrel/canvas.js +29 -28
  20. package/dist/barrel/interactions.js +33 -32
  21. package/dist/barrel/paths.js +11 -10
  22. package/dist/barrel/routing.js +49 -48
  23. package/dist/barrel/scene.js +10 -10
  24. package/dist/barrel/viewport.js +24 -21
  25. package/dist/canvas/Canvas.js +6 -17
  26. package/dist/canvas/Canvas.js.map +1 -1
  27. package/dist/canvas/CanvasView.js +34 -37
  28. package/dist/canvas/CanvasView.js.map +1 -1
  29. package/dist/canvas/CursorCoordsHud.js +3 -3
  30. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  31. package/dist/canvas/DrawCanvas.js +3 -3
  32. package/dist/canvas/DrawCanvas.js.map +1 -1
  33. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +24 -23
  34. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  35. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +40 -49
  36. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -1
  37. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +297 -259
  38. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  39. package/dist/canvas/SceneCanvas/features.js +3 -24
  40. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  41. package/dist/canvas/SceneCanvas/insertPreviewCommands.js +97 -0
  42. package/dist/canvas/SceneCanvas/insertPreviewCommands.js.map +1 -0
  43. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  44. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  45. package/dist/canvas/SceneCanvas/scenePointQuery.js +50 -0
  46. package/dist/canvas/SceneCanvas/scenePointQuery.js.map +1 -0
  47. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +52 -0
  48. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -0
  49. package/dist/canvas/SceneCanvas/useActionTunings.js +17 -0
  50. package/dist/canvas/SceneCanvas/useActionTunings.js.map +1 -0
  51. package/dist/canvas/SceneCanvas/useCanvasCamera.js +37 -29
  52. package/dist/canvas/SceneCanvas/useCanvasCamera.js.map +1 -1
  53. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js +11 -11
  54. package/dist/canvas/SceneCanvas/useCanvasDispatcher.js.map +1 -1
  55. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +45 -109
  56. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  57. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +49 -41
  58. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  59. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +64 -96
  60. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  61. package/dist/canvas/SceneCanvas/worldPointAt.js +3 -4
  62. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -1
  63. package/dist/canvas/SceneCanvas.js +77 -80
  64. package/dist/canvas/SceneCanvas.js.map +1 -1
  65. package/dist/canvas/SceneViewCanvas.js +3 -3
  66. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  67. package/dist/canvas/SurfaceCanvas.js +40 -0
  68. package/dist/canvas/SurfaceCanvas.js.map +1 -0
  69. package/dist/canvas/adapterDerivedPath.js +13 -13
  70. package/dist/canvas/adapterDerivedPath.js.map +1 -1
  71. package/dist/canvas/adapterPickSource.js +34 -0
  72. package/dist/canvas/adapterPickSource.js.map +1 -0
  73. package/dist/canvas/affordanceAt.js +1 -1
  74. package/dist/canvas/affordanceAt.js.map +1 -1
  75. package/dist/canvas/buildSceneLayer.js.map +1 -1
  76. package/dist/canvas/buildSceneTree.js +56 -34
  77. package/dist/canvas/buildSceneTree.js.map +1 -1
  78. package/dist/canvas/copiesAbove.js +27 -0
  79. package/dist/canvas/copiesAbove.js.map +1 -0
  80. package/dist/canvas/defaultDrawOne.js +24 -23
  81. package/dist/canvas/defaultDrawOne.js.map +1 -1
  82. package/dist/canvas/deps/editAnchors.js +45 -50
  83. package/dist/canvas/deps/editAnchors.js.map +1 -1
  84. package/dist/canvas/deps/hitTestArea.js +30 -15
  85. package/dist/canvas/deps/hitTestArea.js.map +1 -1
  86. package/dist/canvas/deps/insert.js +134 -100
  87. package/dist/canvas/deps/insert.js.map +1 -1
  88. package/dist/canvas/deps/layout.js +9 -15
  89. package/dist/canvas/deps/layout.js.map +1 -1
  90. package/dist/canvas/derivedPath.js +53 -29
  91. package/dist/canvas/derivedPath.js.map +1 -1
  92. package/dist/canvas/insertPreviewExtent.js +33 -31
  93. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  94. package/dist/canvas/overChildren.js +29 -0
  95. package/dist/canvas/overChildren.js.map +1 -0
  96. package/dist/canvas/paintedCursorLayer.js.map +1 -1
  97. package/dist/canvas/pickReach.js +23 -0
  98. package/dist/canvas/pickReach.js.map +1 -0
  99. package/dist/canvas/pickWalk.js +51 -80
  100. package/dist/canvas/pickWalk.js.map +1 -1
  101. package/dist/canvas/sceneAdapter.js +14 -35
  102. package/dist/canvas/sceneAdapter.js.map +1 -1
  103. package/dist/canvas/sceneSlotWiring.js +11 -10
  104. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  105. package/dist/canvas/sceneViewRender.js +38 -44
  106. package/dist/canvas/sceneViewRender.js.map +1 -1
  107. package/dist/canvas/useCanvasView.js +42 -44
  108. package/dist/canvas/useCanvasView.js.map +1 -1
  109. package/dist/canvas/useSceneAdapter.js +22 -0
  110. package/dist/canvas/useSceneAdapter.js.map +1 -0
  111. package/dist/canvas/useSurfaceInput.js +13 -16
  112. package/dist/canvas/useSurfaceInput.js.map +1 -1
  113. package/dist/canvas/viewRegistry.js +31 -23
  114. package/dist/canvas/viewRegistry.js.map +1 -1
  115. package/dist/canvas/wrapNodeOutput.js +7 -2
  116. package/dist/canvas/wrapNodeOutput.js.map +1 -1
  117. package/dist/clipboard.d.ts +1 -1
  118. package/dist/{clone-2a5hVbBd.d.ts → clone-C0eADtS0.d.ts} +13 -13
  119. package/dist/clone.d.ts +2 -2
  120. package/dist/core/geometry/poseDescriptor.js +49 -23
  121. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  122. package/dist/core/geometry/regionHit.js +2 -2
  123. package/dist/core/geometry/regionHit.js.map +1 -1
  124. package/dist/core/geometry/targetFrame.js.map +1 -1
  125. package/dist/core/layers/children.js +1 -3
  126. package/dist/core/layers/children.js.map +1 -1
  127. package/dist/core/ops/create.js +2 -2
  128. package/dist/core/ops/create.js.map +1 -1
  129. package/dist/core/ops/delete.js +19 -23
  130. package/dist/core/ops/delete.js.map +1 -1
  131. package/dist/core/ops/reorder/index.js +3 -7
  132. package/dist/core/ops/reorder/index.js.map +1 -1
  133. package/dist/core/ops/reorder/setChildOrder.js +2 -4
  134. package/dist/core/ops/reorder/setChildOrder.js.map +1 -1
  135. package/dist/core/ops/reparent.js +0 -1
  136. package/dist/core/ops/reparent.js.map +1 -1
  137. package/dist/core/ops/slot.js +3 -6
  138. package/dist/core/ops/slot.js.map +1 -1
  139. package/dist/core/pages/fitViewToPage.js +15 -0
  140. package/dist/core/pages/fitViewToPage.js.map +1 -0
  141. package/dist/core/pages/pages.js +65 -0
  142. package/dist/core/pages/pages.js.map +1 -0
  143. package/dist/core/pages/pagesLayer.js +27 -0
  144. package/dist/core/pages/pagesLayer.js.map +1 -0
  145. package/dist/core/paint/meshKindLazy.js +2 -2
  146. package/dist/core/paint/meshKindLazy.js.map +1 -1
  147. package/dist/core/scene/NodeProperties.js.map +1 -1
  148. package/dist/core/scene/composeFrame.js.map +1 -1
  149. package/dist/core/scene/composePose.js +58 -20
  150. package/dist/core/scene/composePose.js.map +1 -1
  151. package/dist/core/scene/effectivePose.js +5 -1
  152. package/dist/core/scene/effectivePose.js.map +1 -1
  153. package/dist/core/scene/historyFacade.js +19 -13
  154. package/dist/core/scene/historyFacade.js.map +1 -1
  155. package/dist/core/scene/nodeFnFields.js +7 -0
  156. package/dist/core/scene/nodeFnFields.js.map +1 -1
  157. package/dist/core/scene/outerOps.js +2 -1
  158. package/dist/core/scene/outerOps.js.map +1 -1
  159. package/dist/core/scene/reconcileSpecs.js +1 -1
  160. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  161. package/dist/core/scene/sceneRecording.js +2 -1
  162. package/dist/core/scene/sceneRecording.js.map +1 -1
  163. package/dist/core/scene/types.js.map +1 -1
  164. package/dist/core/viewport/screenSlop.js.map +1 -1
  165. package/dist/core/viewport/useDecayLoop.js +28 -30
  166. package/dist/core/viewport/useDecayLoop.js.map +1 -1
  167. package/dist/core/viewport/useNodeOverlayFrame.js.map +1 -1
  168. package/dist/core/viewport/useViewAnimation.js +70 -69
  169. package/dist/core/viewport/useViewAnimation.js.map +1 -1
  170. package/dist/core/viewport/view.js +8 -5
  171. package/dist/core/viewport/view.js.map +1 -1
  172. package/dist/core/viewport/zoomAt.js +11 -2
  173. package/dist/core/viewport/zoomAt.js.map +1 -1
  174. package/dist/{cornerHandles-BEshc4z3.d.ts → cornerHandles-BSKbyuvQ.d.ts} +1 -1
  175. package/dist/features/paths/editablePath.js +24 -8
  176. package/dist/features/paths/editablePath.js.map +1 -1
  177. package/dist/features/paths/index.js +4 -4
  178. package/dist/features/paths/shapeGenerator.js +89 -0
  179. package/dist/features/paths/shapeGenerator.js.map +1 -0
  180. package/dist/features/paths/usePathEdit.js +13 -13
  181. package/dist/features/poseRun/usePoseRun.js +25 -25
  182. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  183. package/dist/features/text/useSceneTextEdit.js +82 -64
  184. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  185. package/dist/features/viewports/viewResolver.js +28 -24
  186. package/dist/features/viewports/viewResolver.js.map +1 -1
  187. package/dist/icons/SliceIcon.js +24 -0
  188. package/dist/icons/SliceIcon.js.map +1 -0
  189. package/dist/index.d.ts +956 -581
  190. package/dist/index.js +260 -251
  191. package/dist/interactions/actions/align/align.js +9 -9
  192. package/dist/interactions/actions/align/align.js.map +1 -1
  193. package/dist/interactions/actions/booleans/booleans.js +18 -18
  194. package/dist/interactions/actions/booleans/booleans.js.map +1 -1
  195. package/dist/interactions/actions/booleans/operands.js.map +1 -1
  196. package/dist/interactions/actions/clone/action.js +35 -30
  197. package/dist/interactions/actions/clone/action.js.map +1 -1
  198. package/dist/interactions/actions/defaults/anchorEditing.js +56 -59
  199. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  200. package/dist/interactions/actions/defaults/anchorHandles.js +42 -0
  201. package/dist/interactions/actions/defaults/anchorHandles.js.map +1 -0
  202. package/dist/interactions/actions/defaults/anchorJoin.js +92 -0
  203. package/dist/interactions/actions/defaults/anchorJoin.js.map +1 -0
  204. package/dist/interactions/actions/defaults/bendSegment.js +46 -0
  205. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -0
  206. package/dist/interactions/actions/defaults/copySubtree.js +1 -1
  207. package/dist/interactions/actions/defaults/copySubtree.js.map +1 -1
  208. package/dist/interactions/actions/defaults/duplicate.js +32 -17
  209. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  210. package/dist/interactions/actions/defaults/enterPathEdit.js +19 -7
  211. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  212. package/dist/interactions/actions/defaults/icons/anchorIcons.js +75 -0
  213. package/dist/interactions/actions/defaults/icons/anchorIcons.js.map +1 -0
  214. package/dist/interactions/actions/defaults/icons/editIcons.js +35 -8
  215. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -1
  216. package/dist/interactions/actions/defaults/insertPathAnchor.js +16 -31
  217. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  218. package/dist/interactions/actions/defaults/nudge.js +28 -23
  219. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  220. package/dist/interactions/actions/defaults/pinchZoom.js +29 -29
  221. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -1
  222. package/dist/interactions/actions/defaults/segmentUnder.js +22 -0
  223. package/dist/interactions/actions/defaults/segmentUnder.js.map +1 -0
  224. package/dist/interactions/actions/defaults/viewportZoom.js +82 -79
  225. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -1
  226. package/dist/interactions/actions/distribute/distribute.js +8 -8
  227. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  228. package/dist/interactions/actions/edit-anchors/action.js +58 -55
  229. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  230. package/dist/interactions/actions/edit-anchors/preview.js +26 -0
  231. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -0
  232. package/dist/interactions/actions/edit-anchors/symmetry.js +11 -0
  233. package/dist/interactions/actions/edit-anchors/symmetry.js.map +1 -0
  234. package/dist/interactions/actions/flip/action.js.map +1 -1
  235. package/dist/interactions/actions/geometryProjection.js.map +1 -1
  236. package/dist/interactions/actions/insert/action.js +37 -30
  237. package/dist/interactions/actions/insert/action.js.map +1 -1
  238. package/dist/interactions/actions/insert/frame.js +9 -2
  239. package/dist/interactions/actions/insert/frame.js.map +1 -1
  240. package/dist/interactions/actions/insert/repositionAction.js +31 -0
  241. package/dist/interactions/actions/insert/repositionAction.js.map +1 -0
  242. package/dist/interactions/actions/lasso-select/action.js +32 -32
  243. package/dist/interactions/actions/move/action.js +29 -25
  244. package/dist/interactions/actions/move/action.js.map +1 -1
  245. package/dist/interactions/actions/move/behaviors/snapToContainer.js +12 -6
  246. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  247. package/dist/interactions/actions/move/capture.js +32 -23
  248. package/dist/interactions/actions/move/capture.js.map +1 -1
  249. package/dist/interactions/actions/move/frame.js +2 -14
  250. package/dist/interactions/actions/move/frame.js.map +1 -1
  251. package/dist/interactions/actions/move/session.js +1 -1
  252. package/dist/interactions/actions/move/session.js.map +1 -1
  253. package/dist/interactions/actions/move/translate.js.map +1 -1
  254. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -1
  255. package/dist/interactions/actions/outlines/replaceWithPaths.js +13 -13
  256. package/dist/interactions/actions/outlines/replaceWithPaths.js.map +1 -1
  257. package/dist/interactions/actions/outlines/strokeRegion.js.map +1 -1
  258. package/dist/interactions/actions/pathCommands/cutJoin.js +102 -0
  259. package/dist/interactions/actions/pathCommands/cutJoin.js.map +1 -0
  260. package/dist/interactions/actions/pathCommands/livePathEdit.js +64 -0
  261. package/dist/interactions/actions/pathCommands/livePathEdit.js.map +1 -0
  262. package/dist/interactions/actions/pathCommands/pathNodes.js +99 -0
  263. package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -0
  264. package/dist/interactions/actions/pathCommands/simplifyOffset.js +42 -0
  265. package/dist/interactions/actions/pathCommands/simplifyOffset.js.map +1 -0
  266. package/dist/interactions/actions/resize/action.js +31 -20
  267. package/dist/interactions/actions/resize/action.js.map +1 -1
  268. package/dist/interactions/actions/resize/commit.js.map +1 -1
  269. package/dist/interactions/actions/resize/frame.js +29 -15
  270. package/dist/interactions/actions/resize/frame.js.map +1 -1
  271. package/dist/interactions/actions/resize/replay.js +47 -0
  272. package/dist/interactions/actions/resize/replay.js.map +1 -0
  273. package/dist/interactions/actions/resize/session.js +49 -35
  274. package/dist/interactions/actions/resize/session.js.map +1 -1
  275. package/dist/interactions/actions/resolveOverlays.js +2 -1
  276. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  277. package/dist/interactions/actions/rotate/action.js +40 -25
  278. package/dist/interactions/actions/rotate/action.js.map +1 -1
  279. package/dist/interactions/actions/rotate/frame.js +1 -1
  280. package/dist/interactions/actions/rotate/frame.js.map +1 -1
  281. package/dist/interactions/actions/rotate/replay.js +22 -0
  282. package/dist/interactions/actions/rotate/replay.js.map +1 -0
  283. package/dist/interactions/actions/rotate/session.js +42 -32
  284. package/dist/interactions/actions/rotate/session.js.map +1 -1
  285. package/dist/interactions/actions/transform-again/action.js +63 -0
  286. package/dist/interactions/actions/transform-again/action.js.map +1 -0
  287. package/dist/interactions/actions/transform-again/memory.js +35 -0
  288. package/dist/interactions/actions/transform-again/memory.js.map +1 -0
  289. package/dist/interactions/actions/useStandardActions.js +101 -83
  290. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  291. package/dist/move.d.ts +4 -4
  292. package/dist/{originProjection-PPT88jZv.d.ts → originProjection-CoNVpITV.d.ts} +1 -1
  293. package/dist/resize.d.ts +3 -3
  294. package/dist/style.css +1 -1
  295. package/dist/tools/builtin/ellipse/useEllipseTool.js +16 -15
  296. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  297. package/dist/tools/builtin/line/useLineTool.js +16 -15
  298. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  299. package/dist/tools/builtin/pen/usePenTool.js +111 -111
  300. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  301. package/dist/tools/builtin/pickTopMostHit.js +11 -14
  302. package/dist/tools/builtin/pickTopMostHit.js.map +1 -1
  303. package/dist/tools/builtin/polygon/usePolygonTool.js +17 -15
  304. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  305. package/dist/tools/builtin/rect/useRectTool.js +15 -14
  306. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  307. package/dist/tools/builtin/select/adapterPointQuery.js +22 -18
  308. package/dist/tools/builtin/select/adapterPointQuery.js.map +1 -1
  309. package/dist/tools/builtin/select/selectionContributions.js +1 -1
  310. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  311. package/dist/tools/builtin/select/useSelectTool.js +2 -1
  312. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  313. package/dist/tools/builtin/slice/useSliceTool.js +42 -40
  314. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  315. package/dist/tools/builtin/star/useStarTool.js +18 -16
  316. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  317. package/dist/tools/builtin/text/useTextTool.js +2 -2
  318. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  319. package/dist/{types-CIKDwlsP.d.ts → types-DBbbCy0i.d.ts} +22 -15
  320. package/dist/version.js +1 -1
  321. package/package.json +22 -22
  322. package/dist/canvas/surface.module.js +0 -6
  323. package/dist/canvas/surface.module.js.map +0 -1
  324. package/dist/canvas/surfaceBox.js +0 -16
  325. package/dist/canvas/surfaceBox.js.map +0 -1
  326. package/dist/layout/arrivals.js +0 -33
  327. package/dist/layout/arrivals.js.map +0 -1
@@ -37,56 +37,55 @@ import { useChromeRules as Pe, useSceneHover as Fe, useSurfaceChromeCaps as Ie }
37
37
  import { useSceneRedrawSources as Le } from "./SceneCanvas/useSceneRedrawSources.js";
38
38
  import { useSceneSelectTool as Re } from "./SceneCanvas/useSceneSelectTool.js";
39
39
  import { useViewLayerGate as ze } from "./SceneCanvas/useViewLayerGate.js";
40
- import { useSceneAdapter as Be } from "./sceneAdapter.js";
40
+ import { useSceneAdapter as Be } from "./useSceneAdapter.js";
41
41
  import { useHitObserver as o } from "./useHitObserver.js";
42
42
  import { forwardRef as s, useEffect as Ve, useMemo as c, useRef as l, useState as He } from "react";
43
- import { useLatest as Ue } from "@weasel-js/react";
44
- import { InputScope as u } from "@weasel-js/routing/react";
45
- import { jsx as d, jsxs as We } from "react/jsx-runtime";
46
- import { getActiveModeFor as Ge } from "@weasel-js/modes";
43
+ import { useLatest as u } from "@weasel-js/react";
44
+ import { InputScope as Ue, useActionsRegistry as We } from "@weasel-js/routing/react";
45
+ import { jsx as d, jsxs as Ge } from "react/jsx-runtime";
46
+ import { getActiveModeFor as Ke } from "@weasel-js/modes";
47
47
  //#region src/canvas/SceneCanvas.tsx
48
- function Ke(e) {
48
+ function qe(e) {
49
49
  if (e === !1) return !1;
50
50
  let { slops: t, ...n } = e;
51
51
  return n;
52
52
  }
53
53
  function f(e, ne) {
54
- let { scene: i, geometry: Ce, poseDescriptor: we, selectTool: a, insertNodeFactories: s, insertPaint: u, ingestion: f, layouts: p, layoutDropTarget: m, reflowTransition: h, geometryProjection: qe, routing: Je, selection: Ye, selectionOptions: Xe, selectable: g = !0, tools: Ze, features: Qe, enableKeybindings: _ = !0, claimKeys: $e = !1, enableGestureDispatcher: et = !0, onToolsCreated: tt, defaultTools: nt, toolOptions: rt, initialActiveTool: it, ambient: at, versionCheck: ot, longPress: st, viewport: v, layers: ct, actions: y, describeKind: lt, animator: ut, views: dt, children: ft, debug: b, alphaFor: x, layerVisibility: S, layerOrder: pt, isPointerInteractive: mt, onDoubleClick: ht, onClick: gt, chromeVisibility: C, modes: w, pathEdit: _t, getFocused: vt, cursorCoordsHud: yt, pickHud: bt, modalityHud: xt, view: St, onViewChange: Ct, defaultView: wt, viewBounds: Tt, redrawOn: Et, ...T } = e, E = we ?? ee, D = t(), [Dt] = He(() => ae(i) ? oe(i, {}) : null), O = Dt ?? i, k = c(() => w ? Ge(w) : void 0, [w]), Ot = ce(), kt = Le({
55
- supplied: Et,
54
+ let { scene: i, geometry: Ce, poseDescriptor: we, selectTool: a, insertNodeFactories: s, insertPaint: Ue, ingestion: f, layoutDropTarget: p, reflowTransition: m, geometryProjection: h, routing: Je, selection: Ye, selectionOptions: Xe, selectable: g = !0, tools: Ze, features: Qe, enableKeybindings: _ = !0, claimKeys: $e = !1, enableGestureDispatcher: et = !0, onToolsCreated: tt, defaultTools: nt, toolOptions: rt, initialActiveTool: it, ambient: at, versionCheck: ot, longPress: st, viewport: v, layers: ct, actions: y, tune: lt, describeKind: ut, animator: dt, views: ft, children: pt, debug: b, alphaFor: x, layerVisibility: S, layerOrder: mt, isPointerInteractive: ht, onDoubleClick: gt, onClick: _t, chromeVisibility: C, modes: w, pathEdit: vt, getFocused: yt, cursorCoordsHud: bt, pickHud: xt, modalityHud: St, view: Ct, onViewChange: wt, defaultView: Tt, viewBounds: Et, redrawOn: Dt, ...T } = e, E = we ?? ee, D = t(), [Ot] = He(() => ae(i) ? oe(i, {}) : null), O = Ot ?? i, k = c(() => w ? Ke(w) : void 0, [w]), kt = ce(), At = Le({
55
+ supplied: Dt,
56
56
  scene: O,
57
- heldModifiers: Ot,
58
- animator: ut,
57
+ heldModifiers: kt,
58
+ animator: dt,
59
59
  modes: w
60
60
  }), A = l(null), j = l(null);
61
61
  Ve(() => (n("scene-canvas", "mount"), () => n("scene-canvas", "unmount")), []);
62
- let { viewState: M, viewAnimation: N, camera: At } = se({
63
- view: St,
64
- defaultView: wt,
65
- onViewChange: Ct,
66
- viewBounds: Tt,
62
+ let { viewState: M, viewAnimation: N, camera: jt } = se({
63
+ view: Ct,
64
+ defaultView: Tt,
65
+ onViewChange: wt,
66
+ viewBounds: Et,
67
67
  width: T.width,
68
68
  height: T.height,
69
69
  requestRedraw: () => {
70
70
  j.current?.requestRedraw();
71
71
  }
72
- }), { viewRef: P } = M, F = v?.zoom, I = v?.animatedZoom, jt = c(() => _e(F, I), [F, I]), L = Se({
72
+ }), { viewRef: P } = M, F = v?.zoom, I = v?.animatedZoom, Mt = c(() => _e(F, I), [F, I]), L = Se({
73
73
  scene: O,
74
74
  supplied: Ye,
75
75
  options: Xe,
76
76
  selectable: g,
77
- describeKind: lt
77
+ describeKind: ut
78
78
  }), R = de({
79
- host: _t,
79
+ host: vt,
80
80
  isAllowed: k ? () => k().allowedCapabilities.has("edits-anchors") : void 0,
81
81
  isSelectedNode: (e) => ue(O, L, e)
82
- }), Mt = c(() => ({
82
+ }), Nt = c(() => ({
83
83
  extendClickLocked: () => R.getEditingId() !== "",
84
84
  ...a
85
- }), [a, R]), Nt = Ue(L), { kindOfData: Pt, kindOfNode: z } = ke(O, Je), B = c(() => Me(O, x), [O, x]), V = ze(S, pt), H = Be(O, {
85
+ }), [a, R]), Pt = u(L), { kindOfData: Ft, kindOfNode: z } = ke(O, Je), B = c(() => Me(O, x), [O, x]), V = ze(S, mt), H = Be(O, {
86
86
  selection: L.adapterMethods,
87
- poseDescriptor: E,
88
- layouts: p
89
- }), { selectTool: Ft, pickEvery: U, pickBest: W, boundsOf: G, boundsOfPose: K, planeOfNode: q, moveOptions: It } = Re({
87
+ poseDescriptor: E
88
+ }), { selectTool: It, pickEvery: U, pickBest: W, boundsOf: G, boundsOfPose: K, planeOfNode: q, moveOptions: Lt } = Re({
90
89
  scene: O,
91
90
  adapter: H,
92
91
  poseDescriptor: E,
@@ -94,14 +93,14 @@ function f(e, ne) {
94
93
  getView: () => P.current,
95
94
  ...x ? { alphaOf: B } : {},
96
95
  ...V ? { layerIsPainted: V } : {},
97
- selectTool: Mt
98
- }), Lt = Oe({
96
+ selectTool: Nt
97
+ }), Rt = Oe({
99
98
  pickBest: W,
100
99
  nodes: H,
101
- kindOfData: Pt,
102
- isPointerInteractive: mt
103
- }), J = Ee(Qe, v !== void 0), { tools: Y, internal: Rt, takeover: zt } = Te({
104
- select: Ft,
100
+ kindOfData: Ft,
101
+ isPointerInteractive: ht
102
+ }), J = Ee(Qe, v !== void 0), { tools: Y, internal: zt, takeover: Bt } = Te({
103
+ select: It,
105
104
  enabled: J,
106
105
  tools: Ze,
107
106
  defaultTools: nt,
@@ -112,42 +111,42 @@ function f(e, ne) {
112
111
  initialActiveTool: it,
113
112
  modes: w,
114
113
  onToolsCreated: tt
115
- }), { contributions: Bt, standardActionsExclude: Vt } = De({
114
+ }), { contributions: Vt, standardActionsExclude: Ht } = De({
116
115
  enabled: J,
117
116
  tools: Y,
118
- move: It,
117
+ move: Lt,
119
118
  rotate: a?.rotate || void 0
120
- }), X = Ue(Lt), Ht = o(ht, X), Ut = o(gt, X), Z = a?.rotate === !1, Wt = c(() => Z ? ge(y, "rotate") : y, [y, Z]), { dispatcher: Q, getActionRef: Gt, gestureSource: Kt, previewIdsExtra: qt, previewPoseExtra: Jt } = xe(), { layers: Yt, rotationBadge: $, chromeAffordancesRef: Xt } = Ne({
119
+ }), X = u(Rt), Ut = o(gt, X), Wt = o(_t, X), Z = a?.rotate === !1, Gt = c(() => Z ? ge(y, "rotate") : y, [y, Z]), Kt = We(), { dispatcher: Q, gestureSource: qt, previewIdsExtra: Jt, previewPoseExtra: Yt } = xe(Kt), { layers: Xt, rotationBadge: $, chromeAffordancesRef: Zt } = Ne({
121
120
  layers: ct,
122
121
  targetScale: D.targetScale,
123
122
  scene: O,
124
123
  adapter: H,
125
124
  poseDescriptor: E,
126
125
  alphaFor: x,
127
- colorOverrides: ut?.colorOverrides,
126
+ colorOverrides: dt?.colorOverrides,
128
127
  boundsOf: G,
129
128
  planeOfNode: q,
130
- previewIds: qt,
129
+ previewIds: Jt,
131
130
  dispatcher: Q,
132
131
  pathEditState: R,
133
132
  slops: b !== void 0 && b !== !1 && b.slops === !0
134
- }), { getHover: Zt, canvasRef: Qt } = Fe({
133
+ }), { getHover: Qt, canvasRef: $t } = Fe({
135
134
  canvasApiRef: j,
136
135
  viewRef: P,
137
136
  nodeAtPointRef: X,
138
137
  enabled: C !== void 0
139
- }), $t = Pe({
138
+ }), en = Pe({
140
139
  enabled: J,
141
140
  selectable: g,
142
141
  rotateOff: Z,
143
142
  chromeVisibility: C
144
- }), { chromeCaps: en, getIsVisible: tn, getRuleCtx: nn } = Ie({
143
+ }), { chromeCaps: tn, getIsVisible: nn, getRuleCtx: rn } = Ie({
145
144
  source: {
146
- rules: $t,
145
+ rules: en,
147
146
  getMode: k,
148
- getFocused: vt,
149
- getHover: Zt,
150
- getModifiers: Ot.get,
147
+ getFocused: yt,
148
+ getHover: Qt,
149
+ getModifiers: kt.get,
151
150
  resizable: a?.resize?.resizable,
152
151
  editingAnchors: () => R.getEditingId() !== "",
153
152
  device: D
@@ -155,14 +154,14 @@ function f(e, ne) {
155
154
  selection: L.current,
156
155
  viewRef: P,
157
156
  dispatcher: Q
158
- }), rn = l(null), { ingest: an, clipboard: on } = le(H, () => rn.current, f), { views: sn, addView: cn } = Ae(), { handleRef: ln, ready: un } = je({
157
+ }), { ingest: an, clipboard: on } = le(H, () => Kt, f), { views: sn, addView: cn } = Ae(), { handleRef: ln, ready: un } = je({
159
158
  ref: ne,
160
159
  elementRef: A,
161
160
  apiRef: j,
162
- onElement: Qt,
161
+ onElement: $t,
163
162
  ingest: an,
164
163
  viewAnimation: N,
165
- camera: At,
164
+ camera: jt,
166
165
  addView: cn
167
166
  }), dn = c(() => ({
168
167
  adapter: H,
@@ -173,7 +172,7 @@ function f(e, ne) {
173
172
  pickEvery: U,
174
173
  pickBest: W,
175
174
  kindOfNode: z,
176
- chromeCaps: en,
175
+ chromeCaps: tn,
177
176
  selectionApi: L,
178
177
  rotationBadge: $
179
178
  }), [
@@ -185,7 +184,7 @@ function f(e, ne) {
185
184
  U,
186
185
  W,
187
186
  z,
188
- en,
187
+ tn,
189
188
  L,
190
189
  $
191
190
  ]);
@@ -196,31 +195,31 @@ function f(e, ne) {
196
195
  getActiveToolId: () => Y.active ?? null
197
196
  }), /* @__PURE__ */ d(te, {
198
197
  value: dn,
199
- children: /* @__PURE__ */ We(re, { children: [
198
+ children: /* @__PURE__ */ Ge(re, { children: [
200
199
  /* @__PURE__ */ d(pe, {
201
200
  ref: ln,
202
201
  adapter: H,
203
202
  selection: L,
204
203
  poseDescriptor: E,
205
204
  tools: Y,
206
- layers: Yt,
205
+ layers: Xt,
207
206
  boundsOf: G,
208
207
  boundsOfPose: K,
209
- getIsVisible: tn,
210
- gestureSource: Kt,
211
- previewPoseExtra: Jt,
212
- ...b === void 0 ? {} : { debug: Ke(b) },
208
+ getIsVisible: nn,
209
+ gestureSource: qt,
210
+ previewPoseExtra: Yt,
211
+ ...b === void 0 ? {} : { debug: qe(b) },
213
212
  contentVersion: O.getVersion,
214
213
  layerVisibility: S,
215
- layerOrder: pt,
214
+ layerOrder: mt,
216
215
  viewState: M,
217
- redrawOn: kt,
216
+ redrawOn: At,
218
217
  ...T
219
218
  }),
220
219
  /* @__PURE__ */ d(me, {
221
- cursorCoords: yt,
222
- pick: bt,
223
- modality: xt,
220
+ cursorCoords: bt,
221
+ pick: xt,
222
+ modality: St,
224
223
  canvasRef: A,
225
224
  canvasApiRef: j,
226
225
  detachedInput: T.paintInto ? T.inputElement ?? null : void 0,
@@ -236,46 +235,44 @@ function f(e, ne) {
236
235
  selection: L,
237
236
  scene: O,
238
237
  adapter: H,
239
- actions: Wt,
240
- excludeActions: Vt,
238
+ actions: Gt,
239
+ tune: lt,
240
+ excludeActions: Ht,
241
241
  currentViewRef: P,
242
242
  onViewChange: M.setViewFromInput,
243
243
  resizeOptions: a?.resize,
244
244
  poseDescriptor: E,
245
- geometryProjection: qe,
245
+ geometryProjection: h,
246
246
  dispatcher: Q,
247
- getActionRef: Gt,
248
247
  pickEvery: U,
249
248
  layerIsPainted: V,
250
249
  alphaOf: x ? B : void 0,
251
250
  viewportPanEnabled: J.has("view") ? v?.pan ?? !0 : !1,
252
- viewportZoom: J.has("view") ? jt : !1,
251
+ viewportZoom: J.has("view") ? Mt : !1,
253
252
  viewportPinchZoom: J.has("view") ? v?.pinchZoom ?? !0 : !1,
254
253
  viewportRecenter: v?.recenter,
255
254
  viewAnimation: N,
256
255
  editAnchorsExternalState: R,
257
- layouts: p,
258
- layoutDropTarget: m,
259
- reflowTransition: h,
256
+ layoutDropTarget: p,
257
+ reflowTransition: m,
260
258
  insertNodeFactories: s,
261
- insertPaint: u,
259
+ insertPaint: Ue,
262
260
  snapPoint: rt?.snapPoint,
263
261
  canvasRef: A,
264
262
  canvasApiRef: j,
265
263
  ingestionResolveSrc: f?.resolveSrc,
266
264
  ingestionSvg: f?.svg,
267
- ingestionClipboard: on,
268
- actionsRegistryRef: rn
265
+ ingestionClipboard: on
269
266
  }),
270
267
  /* @__PURE__ */ d(he, {
271
268
  canvasRef: A,
272
269
  canvasApiRef: j,
273
270
  tools: Y,
274
- contributions: Bt,
271
+ contributions: Vt,
275
272
  enabled: et,
276
273
  keyboard: _,
277
274
  claimKeys: $e,
278
- selectionRef: Nt,
275
+ selectionRef: Pt,
279
276
  boundsOf: G,
280
277
  planeOfNode: q,
281
278
  pickEvery: U,
@@ -283,37 +280,37 @@ function f(e, ne) {
283
280
  kindOfNode: z,
284
281
  viewRef: P,
285
282
  dispatcher: Q,
286
- getIsVisibleForCanvas: tn,
287
- getRuleCtx: nn,
283
+ getIsVisibleForCanvas: nn,
284
+ getRuleCtx: rn,
288
285
  targetScale: D.targetScale,
289
286
  handleHitRadius: a?.handleHitRadius,
290
287
  rotationBadge: $,
291
- chromeAffordancesRef: Xt,
292
- onDoubleClick: Ht,
293
- onClick: Ut,
288
+ chromeAffordancesRef: Zt,
289
+ onDoubleClick: Ut,
290
+ onClick: Wt,
294
291
  longPress: st
295
292
  }),
296
293
  /* @__PURE__ */ d(be, {
297
- internalTools: Rt,
298
- toolsTakeover: zt ?? void 0,
294
+ internalTools: zt,
295
+ toolsTakeover: Bt ?? void 0,
299
296
  enableKeybindings: _,
300
297
  modes: w,
301
298
  canvasApi: un ? j.current : null,
302
299
  versionCheck: ot
303
300
  }),
304
- dt?.map((e, t) => /* @__PURE__ */ d(r, {
301
+ ft?.map((e, t) => /* @__PURE__ */ d(r, {
305
302
  ...e,
306
303
  order: e.order ?? t
307
304
  }, e.id)),
308
305
  ye(Y).flatMap((e) => e.views ?? []).map((e) => /* @__PURE__ */ d(r, { ...e }, `contribution:${e.id}`)),
309
306
  sn.map((e) => /* @__PURE__ */ d(r, { ...e }, `added:${e.id}`)),
310
- ft
307
+ pt
311
308
  ] })
312
309
  });
313
310
  }
314
311
  var p = s(f);
315
312
  function m({ device: t, ...n }, ee) {
316
- return /* @__PURE__ */ d(u, {
313
+ return /* @__PURE__ */ d(Ue, {
317
314
  yoke: n.yoke,
318
315
  children: /* @__PURE__ */ d(e, {
319
316
  value: t,
@@ -1 +1 @@
1
- {"version":3,"file":"SceneCanvas.js","names":["canvasDebug","debug","_slops","rest","SceneCanvasInner","sceneInput","selectToolOpts","selectionProp","toolsProp","viewDescriptors","getFocusedProp","redrawOnProp","restProps","props","descriptor","poseDescriptor","AUTO_POSE_DESCRIPTOR","deviceProfile","useDeviceProfile","bakedScene","useState","isSerializedScene","sceneFromJSON","scene","getActiveMode","useMemo","modes","getActiveModeFor","heldModifiers","useHeldModifiers","redrawOn","useSceneRedrawSources","internalCanvasRef","useRef","canvasApiRef","dlog","useCanvasCamera","viewState","viewportZoomProp","viewport","animatedZoom","resolvedViewportZoom","viewportZoomOption","selection","useCanvasSelection","selectionOptions","pathEditState","usePathEditState","pathEdit","isSelectedNode","id","selectToolWithDefaults","selectionRef","useLatest","useNodeKinds","routing","composedAlphaFor","composeAlphaFor","alphaFor","viewLayerGate","useViewLayerGate","layerVisibility","layerOrder","adapter","useSceneAdapter","internalSelect","internalPickEvery","internalPickBest","internalBoundsOf","internalBoundsOfPose","internalPlaneOfNode","internalMoveOptions","useSceneSelectTool","viewRef","getNodeAtPoint","useNodeAtPoint","enabled","useEnabledFeatures","features","internalTools","toolsTakeover","useCanvasTools","longPress","featureContributions","useFeatureBindings","getNodeAtPointRef","onDoubleClickObserver","useHitObserver","onDoubleClick","onClickObserver","onClick","rotateOff","resolvedActions","actionsMuting","actions","useCanvasDispatcher","wiredLayers","useSceneCanvasLayers","animator","previewIdsExtra","trackHoverOn","useSceneHover","chromeVisibility","chromeRules","useChromeRules","getIsVisibleForCanvas","getRuleCtxForCanvas","useSurfaceChromeCaps","actionsRegistryRef","ingestionClipboard","useCanvasIngestion","ingestion","addedViews","useAddedViews","canvasReady","useSceneCanvasHandle","viewInputs","kindOfNode","chromeCaps","rotationBadge","useTestHook","tools","ViewInputsProvider","PointerProviderIfRoot","Canvas","handleRef","DevHuds","cursorCoordsHud","pickHud","modalityHud","PointerPublisher","StandardActionsRegistrar","standardActionsExclude","toolOptions","GestureDispatcherMounter","enableGestureDispatcher","enableKeybindings","ToolKeybindingsMounter","CanvasView","v","i","contributionEntries","children","SceneCanvasInnerForwardRef","forwardRef","SceneCanvasWrapper","InputScope","DeviceProfileProvider","device","ViewRegistryProvider","SceneCanvas","BUILTIN_TOOL_IDS","DEFAULT_HANDLE_SIZE","SCENE_CANVAS_FEATURES","rotateAroundAABBCenter"],"sources":["../../src/canvas/SceneCanvas.tsx"],"sourcesContent":["/**\n * `<SceneCanvas>` — `<Canvas>` wired to a `Scene` primitive. Bare, it only renders: behavior\n * comes from the `features` presets (`canvas/SceneCanvas/features.ts`), each of which turns on\n * its own actions, tools, ambient bindings, and chrome.\n *\n * A consumer needing custom tools can pass `tools={useTools(...)}` and SceneCanvas forwards it\n * as-is — the internal tool registry is ignored in that case.\n */\nimport { getActiveModeFor } from '@weasel-js/modes';\nimport { useLatest } from '@weasel-js/react';\nimport type { ActionsProp, ActionsRegistry } from '@weasel-js/routing';\nimport { InputScope } from '@weasel-js/routing/react';\nimport { sceneFromJSON } from 'core/scene/scene';\nimport { isSerializedScene } from 'core/scene/serialization';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { useCanvasCamera } from './SceneCanvas/useCanvasCamera';\nimport { useHeldModifiers } from './SceneCanvas/useHeldModifiers';\nimport { useCanvasIngestion } from 'features/ingestion/useCanvasIngestion';\nimport { isSelectedNode } from 'features/paths/pathEditState';\nimport { usePathEditState } from 'features/paths/usePathEdit';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport type { PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport type React from 'react';\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { DeviceProfileProvider, useDeviceProfile } from '../core/device/useDeviceProfile';\nimport { dlog } from '../debug/flag';\nimport type { DebugConfig } from '../debug/types';\nimport type { ReflowTransition } from '../layout/types';\nimport { useTestHook } from '../test-hook/useTestHook';\nimport { Canvas } from './Canvas';\nimport { CanvasView } from './CanvasView';\nimport { DevHuds } from './SceneCanvas/DevHuds';\nimport { GestureDispatcherMounter } from './SceneCanvas/GestureDispatcherMounter';\nimport { PointerProviderIfRoot, PointerPublisher } from './SceneCanvas/PointerProviderIfRoot';\nimport { StandardActionsRegistrar } from './SceneCanvas/StandardActionsRegistrar';\nimport { ToolKeybindingsMounter } from './SceneCanvas/ToolKeybindingsMounter';\nimport type { FeatureBindingOptions } from './SceneCanvas/features';\nimport type { BridgeAdapter, SceneCanvasProps } from './SceneCanvas/props';\nimport { actionsMuting } from './SceneCanvas/useActionsPropResolver';\nimport { useCanvasDispatcher } from './SceneCanvas/useCanvasDispatcher';\nimport { useCanvasSelection } from './SceneCanvas/useCanvasSelection';\nimport { useCanvasTools, useEnabledFeatures, useFeatureBindings } from './SceneCanvas/useCanvasTools';\nimport { contributionEntries } from './SceneCanvas/useContributionRoles';\nimport { useNodeAtPoint } from './SceneCanvas/useNodeAtPoint';\nimport { useNodeKinds } from './SceneCanvas/useNodeKinds';\nimport { useAddedViews, useSceneCanvasHandle } from './SceneCanvas/useSceneCanvasHandle';\nimport { useSceneCanvasLayers } from './SceneCanvas/useSceneCanvasLayers';\nimport { useChromeRules, useSceneHover, useSurfaceChromeCaps } from './SceneCanvas/useSceneChrome';\nimport { useSceneRedrawSources } from './SceneCanvas/useSceneRedrawSources';\nimport { useSceneSelectTool } from './SceneCanvas/useSceneSelectTool';\nimport { useViewLayerGate } from './SceneCanvas/useViewLayerGate';\nimport { viewportZoomOption } from './SceneCanvas/useViewportActions';\nimport type { CanvasExtensionApi, SceneCanvasApi } from './canvasExtension';\nimport { useSceneAdapter } from './sceneAdapter';\nimport { composeAlphaFor } from './sceneSlotWiring';\nimport { useHitObserver } from './useHitObserver';\nimport { ViewInputsProvider, type SurfaceViewInputs } from './viewInputs';\nimport { ViewRegistryProvider } from './viewRegistry';\nexport { SCENE_CANVAS_FEATURES } from './SceneCanvas/features';\nexport type { Feature } from './SceneCanvas/features';\nexport type { BuiltinToolOptions } from './SceneCanvas/useBuiltinShapeTools';\nexport { defaultDrawOne } from './defaultDrawOne';\nexport { rotateAroundAABBCenter } from './poseRotation';\n\n/** `<SceneCanvas debug>` minus the flag only SceneCanvas reads. */\nfunction canvasDebug(debug: (DebugConfig & { slops?: boolean }) | false): DebugConfig | false {\n if (debug === false) return false;\n const { slops: _slops, ...rest } = debug;\n return rest;\n}\n\nfunction SceneCanvasInner<TData, TLayer extends string, TPose>(\n props: SceneCanvasProps<TData, TLayer, TPose>,\n ref: React.ForwardedRef<SceneCanvasApi>,\n) {\n const {\n scene: sceneInput,\n geometry,\n poseDescriptor,\n selectTool: selectToolOpts,\n insertNodeFactories,\n insertPaint,\n ingestion,\n layouts,\n layoutDropTarget,\n reflowTransition,\n geometryProjection,\n routing,\n selection: selectionProp,\n selectionOptions,\n selectable = true,\n tools: toolsProp,\n features,\n enableKeybindings = true,\n claimKeys = false,\n enableGestureDispatcher = true,\n onToolsCreated,\n defaultTools,\n toolOptions,\n initialActiveTool,\n ambient,\n versionCheck,\n longPress,\n viewport,\n layers,\n actions,\n describeKind,\n animator,\n views: viewDescriptors,\n children,\n debug,\n alphaFor,\n layerVisibility,\n layerOrder,\n isPointerInteractive,\n onDoubleClick,\n onClick,\n chromeVisibility,\n modes,\n pathEdit,\n getFocused: getFocusedProp,\n cursorCoordsHud, pickHud, modalityHud,\n view, onViewChange, defaultView, viewBounds, redrawOn: redrawOnProp,\n ...restProps\n } = props;\n\n const descriptor = (poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const deviceProfile = useDeviceProfile();\n\n // `scene` accepts either a live `Scene` or a `SerializedScene` JSON object. JSON is baked\n // once; later prop changes are ignored (use a `key` on `<SceneCanvas>` to force a fresh canvas).\n const [bakedScene] = useState<Scene<TData, TLayer, TPose> | null>(\n () => (isSerializedScene<TData, TLayer, TPose>(sceneInput) ? sceneFromJSON(sceneInput, {}) : null),\n );\n const scene = bakedScene ?? (sceneInput as Scene<TData, TLayer, TPose>);\n\n const getActiveMode = useMemo(() => (modes ? getActiveModeFor(modes) : undefined), [modes]);\n const heldModifiers = useHeldModifiers();\n const redrawOn = useSceneRedrawSources({ supplied: redrawOnProp, scene, heldModifiers, animator, modes });\n\n // The canvas element, kept here so the dispatcher can attach its input listeners even when\n // the consumer passes their own forwarded ref, and the full handle, for `requestRedraw`.\n const internalCanvasRef = useRef<HTMLElement | null>(null);\n const canvasApiRef = useRef<CanvasExtensionApi | null>(null);\n\n useEffect(() => {\n dlog('scene-canvas', 'mount');\n return () => dlog('scene-canvas', 'unmount');\n }, []);\n\n const { viewState, viewAnimation, camera } = useCanvasCamera({\n view, defaultView, onViewChange, viewBounds,\n width: restProps.width,\n height: restProps.height,\n requestRedraw: () => { canvasApiRef.current?.requestRedraw(); },\n });\n const { viewRef } = viewState;\n\n const viewportZoomProp = viewport?.zoom;\n const animatedZoom = viewport?.animatedZoom;\n const resolvedViewportZoom = useMemo(\n () => viewportZoomOption(viewportZoomProp, animatedZoom),\n [viewportZoomProp, animatedZoom],\n );\n\n const selection = useCanvasSelection({\n scene, supplied: selectionProp, options: selectionOptions, selectable, describeKind,\n });\n\n // `isAllowed` is absent, not a predicate, when no mode registry is wired:\n // see `PathEditSource.isAllowed`.\n const pathEditState = usePathEditState({\n host: pathEdit,\n isAllowed: getActiveMode\n ? () => getActiveMode().allowedCapabilities.has('edits-anchors')\n : undefined,\n isSelectedNode: (id) => isSelectedNode(scene, selection, id),\n });\n\n const selectToolWithDefaults = useMemo(() => ({\n // Shift-click belongs to the anchor selection while a path is being\n // anchor-edited; see `UseSelectToolOptions.extendClickLocked`.\n extendClickLocked: () => pathEditState.getEditingId() !== '',\n ...selectToolOpts,\n }), [selectToolOpts, pathEditState]);\n\n const selectionRef = useLatest(selection);\n const { kindOfData, kindOfNode } = useNodeKinds(scene, routing);\n\n // The painted alpha of a node in this view: the caller's `alphaFor` times any per-node\n // override alpha. The pick path reads the same number the painter does, or a node faded\n // to nothing stays clickable.\n const composedAlphaFor = useMemo(\n () => composeAlphaFor(scene, alphaFor),\n [scene, alphaFor],\n );\n const viewLayerGate = useViewLayerGate(layerVisibility, layerOrder);\n\n const adapter = useSceneAdapter(scene, {\n // `adapterMethods` is memoized; `selection` itself is a fresh object each render.\n selection: selection.adapterMethods,\n poseDescriptor: descriptor,\n layouts,\n });\n\n const {\n selectTool: internalSelect, pickEvery: internalPickEvery, pickBest: internalPickBest,\n boundsOf: internalBoundsOf, boundsOfPose: internalBoundsOfPose, planeOfNode: internalPlaneOfNode,\n moveOptions: internalMoveOptions,\n } = useSceneSelectTool({\n scene,\n adapter,\n poseDescriptor: descriptor,\n geometry,\n // The pick tolerance is declared in screen pixels; this is what converts it.\n getView: () => viewRef.current,\n // Only when the consumer actually fades something. Without a prop the\n // composed function is just the override lookup, and the source resolves\n // that once per walk instead of once per candidate.\n ...(alphaFor ? { alphaOf: composedAlphaFor } : {}),\n ...(viewLayerGate ? { layerIsPainted: viewLayerGate } : {}),\n selectTool: selectToolWithDefaults,\n });\n\n const getNodeAtPoint = useNodeAtPoint({\n pickBest: internalPickBest, nodes: adapter, kindOfData, isPointerInteractive,\n });\n\n const enabled = useEnabledFeatures(features, viewport !== undefined);\n const { tools, internal: internalTools, takeover: toolsTakeover } = useCanvasTools({\n select: internalSelect,\n enabled,\n tools: toolsProp,\n defaultTools,\n toolOptions,\n inertia: viewport?.inertia,\n ambient,\n pressFeedback: longPress?.feedback,\n initialActiveTool,\n modes,\n onToolsCreated,\n });\n const { contributions: featureContributions, standardActionsExclude } = useFeatureBindings({\n enabled,\n tools,\n move: internalMoveOptions as FeatureBindingOptions['move'],\n rotate: (selectToolOpts?.rotate || undefined) as FeatureBindingOptions['rotate'],\n });\n\n // Rides the gesture dispatcher as an OBSERVER rather than an Action binding because the\n // prop is a notification, not a behavior: as a binding it would lose first-match-wins to\n // `enterPathEdit` on every body hit and silently stop firing.\n const getNodeAtPointRef = useLatest(getNodeAtPoint);\n const onDoubleClickObserver = useHitObserver(onDoubleClick, getNodeAtPointRef);\n const onClickObserver = useHitObserver(onClick, getNodeAtPointRef);\n\n // `selectTool.rotate === false` disables rotation: its action is muted here and its\n // handle hidden by `useChromeRules`.\n const rotateOff = selectToolOpts?.rotate === false;\n const resolvedActions = useMemo<ActionsProp | undefined>(\n () => (rotateOff ? actionsMuting(actions, 'rotate') : actions),\n [actions, rotateOff],\n );\n\n const { dispatcher, getActionRef, gestureSource, previewIdsExtra, previewPoseExtra } = useCanvasDispatcher();\n\n const { layers: wiredLayers, rotationBadge, chromeAffordancesRef } = useSceneCanvasLayers({\n layers,\n targetScale: deviceProfile.targetScale,\n scene,\n adapter,\n poseDescriptor: descriptor,\n alphaFor,\n colorOverrides: animator?.colorOverrides,\n boundsOf: internalBoundsOf,\n planeOfNode: internalPlaneOfNode,\n previewIds: previewIdsExtra,\n dispatcher,\n pathEditState,\n slops: debug !== undefined && debug !== false && debug.slops === true,\n });\n\n const { getHover, canvasRef: trackHoverOn } = useSceneHover({\n canvasApiRef, viewRef, nodeAtPointRef: getNodeAtPointRef, enabled: chromeVisibility !== undefined,\n });\n const chromeRules = useChromeRules({ enabled, selectable, rotateOff, chromeVisibility });\n const { chromeCaps, getIsVisible: getIsVisibleForCanvas, getRuleCtx: getRuleCtxForCanvas } = useSurfaceChromeCaps({\n source: {\n rules: chromeRules,\n getMode: getActiveMode,\n getFocused: getFocusedProp,\n getHover,\n getModifiers: heldModifiers.get,\n resizable: selectToolOpts?.resize?.resizable,\n editingAnchors: () => pathEditState.getEditingId() !== '',\n device: deviceProfile,\n },\n selection: selection.current as readonly NodeId[],\n viewRef,\n dispatcher,\n });\n\n // `StandardActionsRegistrar` stashes the registry into this ref.\n const actionsRegistryRef = useRef<ActionsRegistry | null>(null);\n const { ingest, clipboard: ingestionClipboard } = useCanvasIngestion(\n adapter, () => actionsRegistryRef.current, ingestion,\n );\n\n const { views: addedViews, addView } = useAddedViews();\n // The consumer's handle extends the primitive's with `ingest`, which needs the action stack.\n const { handleRef, ready: canvasReady } = useSceneCanvasHandle({\n ref, elementRef: internalCanvasRef, apiRef: canvasApiRef, onElement: trackHoverOn,\n ingest, viewAnimation, camera, addView,\n });\n\n // What a view needs to build its own overlay-aware state. `geometry` is the\n // same descriptor handed to `<Canvas>`, so the two cannot diverge.\n const viewInputs = useMemo<SurfaceViewInputs>(() => ({\n adapter: adapter as unknown as { getPose(id: string): unknown },\n geometry: descriptor as PoseDescriptor<unknown>,\n boundsOf: internalBoundsOf,\n boundsOfPose: internalBoundsOfPose as SurfaceViewInputs['boundsOfPose'],\n planeOfNode: internalPlaneOfNode,\n pickEvery: internalPickEvery,\n pickBest: internalPickBest,\n kindOfNode,\n chromeCaps,\n selectionApi: selection,\n rotationBadge,\n }), [adapter, descriptor, internalBoundsOf, internalBoundsOfPose, internalPlaneOfNode,\n internalPickEvery, internalPickBest, kindOfNode, chromeCaps, selection, rotationBadge]);\n\n useTestHook({\n getScene: () => scene as never,\n getSelectionIds: () => (selection.current as readonly string[] | undefined) ?? [],\n getView: () => viewRef.current,\n getActiveToolId: () => tools.active ?? null,\n });\n\n return (\n <ViewInputsProvider value={viewInputs}>\n <PointerProviderIfRoot>\n <Canvas<TPose>\n ref={handleRef}\n adapter={adapter}\n selection={selection}\n poseDescriptor={descriptor}\n tools={tools}\n layers={wiredLayers}\n // The chrome's bounds are the picker's: a node on a parallax plane is\n // boxed where the plane draws it, and a `geometry.boundsOf` reaches both.\n boundsOf={internalBoundsOf}\n boundsOfPose={internalBoundsOfPose}\n getIsVisible={getIsVisibleForCanvas}\n // The gesture surface behind `helpersRef.getGestureBounds()` /\n // `subscribeGestures()` — Canvas has no dispatcher of its own.\n gestureSource={gestureSource}\n previewPoseExtra={previewPoseExtra}\n {...(debug !== undefined ? { debug: canvasDebug(debug) } : {})}\n contentVersion={scene.getVersion}\n layerVisibility={layerVisibility}\n layerOrder={layerOrder}\n viewState={viewState}\n redrawOn={redrawOn}\n {...restProps}\n />\n <DevHuds\n cursorCoords={cursorCoordsHud}\n pick={pickHud}\n modality={modalityHud}\n canvasRef={internalCanvasRef}\n canvasApiRef={canvasApiRef}\n detachedInput={restProps.paintInto ? restProps.inputElement ?? null : undefined}\n viewRef={viewRef}\n pickEvery={internalPickEvery}\n pickBest={internalPickBest}\n />\n <PointerPublisher canvasRef={internalCanvasRef} canvasApiRef={canvasApiRef} />\n <StandardActionsRegistrar\n selection={selection}\n scene={scene}\n adapter={adapter as unknown as BridgeAdapter}\n actions={resolvedActions}\n excludeActions={standardActionsExclude}\n currentViewRef={viewRef}\n onViewChange={viewState.setViewFromInput}\n resizeOptions={selectToolOpts?.resize as UseResizeOptions<unknown> | undefined}\n poseDescriptor={descriptor as PoseDescriptor<unknown>}\n geometryProjection={geometryProjection}\n dispatcher={dispatcher}\n getActionRef={getActionRef}\n pickEvery={internalPickEvery}\n layerIsPainted={viewLayerGate}\n alphaOf={alphaFor ? composedAlphaFor : undefined}\n viewportPanEnabled={enabled.has('view') ? (viewport?.pan ?? true) : false}\n viewportZoom={enabled.has('view') ? resolvedViewportZoom : false}\n viewportPinchZoom={enabled.has('view') ? (viewport?.pinchZoom ?? true) : false}\n viewportRecenter={viewport?.recenter}\n viewAnimation={viewAnimation}\n editAnchorsExternalState={pathEditState}\n layouts={layouts as SceneCanvasProps<unknown, string, unknown>['layouts']}\n layoutDropTarget={layoutDropTarget}\n reflowTransition={reflowTransition as ReflowTransition<unknown> | null | undefined}\n insertNodeFactories={insertNodeFactories}\n insertPaint={insertPaint}\n snapPoint={toolOptions?.snapPoint}\n canvasRef={internalCanvasRef}\n canvasApiRef={canvasApiRef}\n ingestionResolveSrc={ingestion?.resolveSrc}\n ingestionSvg={ingestion?.svg}\n ingestionClipboard={ingestionClipboard}\n actionsRegistryRef={actionsRegistryRef}\n />\n <GestureDispatcherMounter\n canvasRef={internalCanvasRef}\n canvasApiRef={canvasApiRef}\n tools={tools}\n contributions={featureContributions}\n enabled={enableGestureDispatcher}\n keyboard={enableKeybindings}\n claimKeys={claimKeys}\n selectionRef={selectionRef}\n boundsOf={internalBoundsOf}\n planeOfNode={internalPlaneOfNode}\n pickEvery={internalPickEvery}\n pickBest={internalPickBest}\n kindOfNode={kindOfNode}\n viewRef={viewRef}\n dispatcher={dispatcher}\n getIsVisibleForCanvas={getIsVisibleForCanvas}\n getRuleCtx={getRuleCtxForCanvas}\n targetScale={deviceProfile.targetScale}\n handleHitRadius={selectToolOpts?.handleHitRadius}\n rotationBadge={rotationBadge}\n chromeAffordancesRef={chromeAffordancesRef}\n onDoubleClick={onDoubleClickObserver}\n onClick={onClickObserver}\n longPress={longPress}\n />\n <ToolKeybindingsMounter\n internalTools={internalTools}\n toolsTakeover={toolsTakeover ?? undefined}\n enableKeybindings={enableKeybindings}\n modes={modes}\n canvasApi={canvasReady ? canvasApiRef.current : null}\n versionCheck={versionCheck}\n />\n {viewDescriptors?.map((v, i) => (\n <CanvasView key={v.id} {...v} order={v.order ?? i} />\n ))}\n {contributionEntries(tools).flatMap((e) => e.views ?? []).map((v) => (\n <CanvasView key={`contribution:${v.id}`} {...v} />\n ))}\n {addedViews.map((v) => <CanvasView key={`added:${v.id}`} {...v} />)}\n {children}\n </PointerProviderIfRoot>\n </ViewInputsProvider>\n );\n}\n\nconst SceneCanvasInnerForwardRef = forwardRef(SceneCanvasInner);\n\n// The canvas's input scope sits above `SceneCanvasInner`, whose own hooks\n// (`useTools` among them) must already read this canvas's tool and registries.\n// Its device profile too, so the canvas and everything under it share one.\nfunction SceneCanvasWrapper<TData, TLayer extends string, TPose>(\n { device, ...props }: SceneCanvasProps<TData, TLayer, TPose>,\n ref: React.ForwardedRef<SceneCanvasApi>,\n) {\n return (\n <InputScope yoke={props.yoke}>\n <DeviceProfileProvider value={device}>\n <ViewRegistryProvider>\n <SceneCanvasInnerForwardRef {...(props as SceneCanvasProps<unknown, string, unknown>)} ref={ref} />\n </ViewRegistryProvider>\n </DeviceProfileProvider>\n </InputScope>\n );\n}\n\n/**\n * The canvas component: renders a `Scene` and wires the interaction stack\n * around it.\n *\n * Mounted bare it renders the scene, keeps a selection no input sets, and\n * runs a gesture dispatcher for whatever bindings the consumer adds. The\n * `features` presets turn the kit's behavior on — `features={['draw']}` is the\n * whole editor: tools, standard actions and their keys, selection chrome,\n * undo. This is the intended entry point; the lower-level primitives it\n * composes are not part of the public surface.\n *\n * Its ref exposes a `SceneCanvasApi` for the imperative operations that do not\n * fit a prop (view control, hit queries, redraw requests).\n */\nexport const SceneCanvas = forwardRef(SceneCanvasWrapper) as <\n TData, TLayer extends string, TPose,\n>(\n props: SceneCanvasProps<TData, TLayer, TPose> & { ref?: React.Ref<SceneCanvasApi> },\n) => ReturnType<typeof SceneCanvasInner>;\n\nexport { DEFAULT_HANDLE_SIZE, mergeLayersWithDefaults, BUILTIN_TOOL_IDS } from './SceneCanvas/props';\nexport type {\n SceneCanvasProps,\n SceneCanvasHit,\n SceneCanvasLayers,\n SceneCanvasLongPress,\n BuiltinToolId,\n} from './SceneCanvas/props';\nexport type { CoordTraceEntry } from './SceneCanvas/coordTrace';\n"],"mappings":"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"}
1
+ {"version":3,"file":"SceneCanvas.js","names":["canvasDebug","debug","_slops","rest","SceneCanvasInner","sceneInput","selectToolOpts","selectionProp","toolsProp","viewDescriptors","getFocusedProp","redrawOnProp","restProps","props","descriptor","poseDescriptor","AUTO_POSE_DESCRIPTOR","deviceProfile","useDeviceProfile","bakedScene","useState","isSerializedScene","sceneFromJSON","scene","getActiveMode","useMemo","modes","getActiveModeFor","heldModifiers","useHeldModifiers","redrawOn","useSceneRedrawSources","internalCanvasRef","useRef","canvasApiRef","dlog","useCanvasCamera","viewState","viewportZoomProp","viewport","animatedZoom","resolvedViewportZoom","viewportZoomOption","selection","useCanvasSelection","selectionOptions","pathEditState","usePathEditState","pathEdit","isSelectedNode","id","selectToolWithDefaults","selectionRef","useLatest","useNodeKinds","routing","composedAlphaFor","composeAlphaFor","alphaFor","viewLayerGate","useViewLayerGate","layerVisibility","layerOrder","adapter","useSceneAdapter","internalSelect","internalPickEvery","internalPickBest","internalBoundsOf","internalBoundsOfPose","internalPlaneOfNode","internalMoveOptions","useSceneSelectTool","viewRef","getNodeAtPoint","useNodeAtPoint","enabled","useEnabledFeatures","features","internalTools","toolsTakeover","useCanvasTools","longPress","featureContributions","useFeatureBindings","getNodeAtPointRef","onDoubleClickObserver","useHitObserver","onDoubleClick","onClickObserver","onClick","rotateOff","resolvedActions","actionsMuting","actions","actionsRegistry","useActionsRegistry","useCanvasDispatcher","wiredLayers","useSceneCanvasLayers","animator","previewIdsExtra","trackHoverOn","useSceneHover","chromeVisibility","chromeRules","useChromeRules","getIsVisibleForCanvas","getRuleCtxForCanvas","useSurfaceChromeCaps","ingestionClipboard","useCanvasIngestion","ingestion","addedViews","useAddedViews","canvasReady","useSceneCanvasHandle","viewInputs","kindOfNode","chromeCaps","rotationBadge","useTestHook","tools","ViewInputsProvider","PointerProviderIfRoot","Canvas","handleRef","DevHuds","cursorCoordsHud","pickHud","modalityHud","PointerPublisher","StandardActionsRegistrar","standardActionsExclude","toolOptions","GestureDispatcherMounter","enableGestureDispatcher","enableKeybindings","ToolKeybindingsMounter","CanvasView","v","i","contributionEntries","children","SceneCanvasInnerForwardRef","forwardRef","SceneCanvasWrapper","InputScope","DeviceProfileProvider","device","ViewRegistryProvider","SceneCanvas","BUILTIN_TOOL_IDS","DEFAULT_HANDLE_SIZE","SCENE_CANVAS_FEATURES","rotateAroundAABBCenter"],"sources":["../../src/canvas/SceneCanvas.tsx"],"sourcesContent":["/**\n * `<SceneCanvas>` — `<Canvas>` wired to a `Scene` primitive. Bare, it only renders: behavior\n * comes from the `features` presets (`canvas/SceneCanvas/features.ts`), each of which turns on\n * its own actions, tools, ambient bindings, and chrome.\n *\n * A consumer needing custom tools can pass `tools={useTools(...)}` and SceneCanvas forwards it\n * as-is — the internal tool registry is ignored in that case.\n */\nimport { getActiveModeFor } from '@weasel-js/modes';\nimport { useLatest } from '@weasel-js/react';\nimport type { ActionsProp } from '@weasel-js/routing';\nimport { InputScope, useActionsRegistry } from '@weasel-js/routing/react';\nimport { sceneFromJSON } from 'core/scene/scene';\nimport { isSerializedScene } from 'core/scene/serialization';\nimport type { NodeId, Scene } from 'core/scene/types';\nimport { useCanvasCamera } from './SceneCanvas/useCanvasCamera';\nimport { useHeldModifiers } from './SceneCanvas/useHeldModifiers';\nimport { useCanvasIngestion } from 'features/ingestion/useCanvasIngestion';\nimport { isSelectedNode } from 'features/paths/pathEditState';\nimport { usePathEditState } from 'features/paths/usePathEdit';\nimport { AUTO_POSE_DESCRIPTOR } from 'core/geometry/autoPoseDescriptor';\nimport type { PoseDescriptor } from 'interactions/actions/resize/geometry';\nimport type { UseResizeOptions } from 'interactions/actions/resize/options';\nimport type React from 'react';\nimport { forwardRef, useEffect, useMemo, useRef, useState } from 'react';\nimport { DeviceProfileProvider, useDeviceProfile } from '../core/device/useDeviceProfile';\nimport { dlog } from '../debug/flag';\nimport type { DebugConfig } from '../debug/types';\nimport type { ReflowTransition } from '../layout/types';\nimport { useTestHook } from '../test-hook/useTestHook';\nimport { Canvas } from './Canvas';\nimport { CanvasView } from './CanvasView';\nimport { DevHuds } from './SceneCanvas/DevHuds';\nimport { GestureDispatcherMounter } from './SceneCanvas/GestureDispatcherMounter';\nimport { PointerProviderIfRoot, PointerPublisher } from './SceneCanvas/PointerProviderIfRoot';\nimport { StandardActionsRegistrar } from './SceneCanvas/StandardActionsRegistrar';\nimport { ToolKeybindingsMounter } from './SceneCanvas/ToolKeybindingsMounter';\nimport type { FeatureBindingOptions } from './SceneCanvas/features';\nimport type { BridgeAdapter, SceneCanvasProps } from './SceneCanvas/props';\nimport { actionsMuting } from './SceneCanvas/useActionsPropResolver';\nimport { useCanvasDispatcher } from './SceneCanvas/useCanvasDispatcher';\nimport { useCanvasSelection } from './SceneCanvas/useCanvasSelection';\nimport { useCanvasTools, useEnabledFeatures, useFeatureBindings } from './SceneCanvas/useCanvasTools';\nimport { contributionEntries } from './SceneCanvas/useContributionRoles';\nimport { useNodeAtPoint } from './SceneCanvas/useNodeAtPoint';\nimport { useNodeKinds } from './SceneCanvas/useNodeKinds';\nimport { useAddedViews, useSceneCanvasHandle } from './SceneCanvas/useSceneCanvasHandle';\nimport { useSceneCanvasLayers } from './SceneCanvas/useSceneCanvasLayers';\nimport { useChromeRules, useSceneHover, useSurfaceChromeCaps } from './SceneCanvas/useSceneChrome';\nimport { useSceneRedrawSources } from './SceneCanvas/useSceneRedrawSources';\nimport { useSceneSelectTool } from './SceneCanvas/useSceneSelectTool';\nimport { useViewLayerGate } from './SceneCanvas/useViewLayerGate';\nimport { viewportZoomOption } from './SceneCanvas/useViewportActions';\nimport type { CanvasExtensionApi, SceneCanvasApi } from './canvasExtension';\nimport { useSceneAdapter } from './useSceneAdapter';\nimport { composeAlphaFor } from './sceneSlotWiring';\nimport { useHitObserver } from './useHitObserver';\nimport { ViewInputsProvider, type SurfaceViewInputs } from './viewInputs';\nimport { ViewRegistryProvider } from './viewRegistry';\nexport { SCENE_CANVAS_FEATURES } from './SceneCanvas/features';\nexport type { Feature } from './SceneCanvas/features';\nexport type { BuiltinToolOptions } from './SceneCanvas/useBuiltinShapeTools';\nexport { defaultDrawOne } from './defaultDrawOne';\nexport { rotateAroundAABBCenter } from './poseRotation';\n\n/** `<SceneCanvas debug>` minus the flag only SceneCanvas reads. */\nfunction canvasDebug(debug: (DebugConfig & { slops?: boolean }) | false): DebugConfig | false {\n if (debug === false) return false;\n const { slops: _slops, ...rest } = debug;\n return rest;\n}\n\nfunction SceneCanvasInner<TData, TLayer extends string, TPose>(\n props: SceneCanvasProps<TData, TLayer, TPose>,\n ref: React.ForwardedRef<SceneCanvasApi>,\n) {\n const {\n scene: sceneInput,\n geometry,\n poseDescriptor,\n selectTool: selectToolOpts,\n insertNodeFactories,\n insertPaint,\n ingestion,\n layoutDropTarget,\n reflowTransition,\n geometryProjection,\n routing,\n selection: selectionProp,\n selectionOptions,\n selectable = true,\n tools: toolsProp,\n features,\n enableKeybindings = true,\n claimKeys = false,\n enableGestureDispatcher = true,\n onToolsCreated,\n defaultTools,\n toolOptions,\n initialActiveTool,\n ambient,\n versionCheck,\n longPress,\n viewport,\n layers,\n actions, tune,\n describeKind,\n animator,\n views: viewDescriptors,\n children,\n debug,\n alphaFor,\n layerVisibility,\n layerOrder,\n isPointerInteractive,\n onDoubleClick,\n onClick,\n chromeVisibility,\n modes,\n pathEdit,\n getFocused: getFocusedProp,\n cursorCoordsHud, pickHud, modalityHud,\n view, onViewChange, defaultView, viewBounds, redrawOn: redrawOnProp,\n ...restProps\n } = props;\n\n const descriptor = (poseDescriptor ?? AUTO_POSE_DESCRIPTOR) as PoseDescriptor<TPose>;\n const deviceProfile = useDeviceProfile();\n\n // `scene` accepts either a live `Scene` or a `SerializedScene` JSON object. JSON is baked\n // once; later prop changes are ignored (use a `key` on `<SceneCanvas>` to force a fresh canvas).\n const [bakedScene] = useState<Scene<TData, TLayer, TPose> | null>(\n () => (isSerializedScene<TData, TLayer, TPose>(sceneInput) ? sceneFromJSON(sceneInput, {}) : null),\n );\n const scene = bakedScene ?? (sceneInput as Scene<TData, TLayer, TPose>);\n\n const getActiveMode = useMemo(() => (modes ? getActiveModeFor(modes) : undefined), [modes]);\n const heldModifiers = useHeldModifiers();\n const redrawOn = useSceneRedrawSources({ supplied: redrawOnProp, scene, heldModifiers, animator, modes });\n\n // The canvas element, kept here so the dispatcher can attach its input listeners even when\n // the consumer passes their own forwarded ref, and the full handle, for `requestRedraw`.\n const internalCanvasRef = useRef<HTMLElement | null>(null);\n const canvasApiRef = useRef<CanvasExtensionApi | null>(null);\n\n useEffect(() => {\n dlog('scene-canvas', 'mount');\n return () => dlog('scene-canvas', 'unmount');\n }, []);\n\n const { viewState, viewAnimation, camera } = useCanvasCamera({\n view, defaultView, onViewChange, viewBounds,\n width: restProps.width,\n height: restProps.height,\n requestRedraw: () => { canvasApiRef.current?.requestRedraw(); },\n });\n const { viewRef } = viewState;\n\n const viewportZoomProp = viewport?.zoom;\n const animatedZoom = viewport?.animatedZoom;\n const resolvedViewportZoom = useMemo(\n () => viewportZoomOption(viewportZoomProp, animatedZoom),\n [viewportZoomProp, animatedZoom],\n );\n\n const selection = useCanvasSelection({\n scene, supplied: selectionProp, options: selectionOptions, selectable, describeKind,\n });\n\n // `isAllowed` is absent, not a predicate, when no mode registry is wired:\n // see `PathEditSource.isAllowed`.\n const pathEditState = usePathEditState({\n host: pathEdit,\n isAllowed: getActiveMode\n ? () => getActiveMode().allowedCapabilities.has('edits-anchors')\n : undefined,\n isSelectedNode: (id) => isSelectedNode(scene, selection, id),\n });\n\n const selectToolWithDefaults = useMemo(() => ({\n // Shift-click belongs to the anchor selection while a path is being\n // anchor-edited; see `UseSelectToolOptions.extendClickLocked`.\n extendClickLocked: () => pathEditState.getEditingId() !== '',\n ...selectToolOpts,\n }), [selectToolOpts, pathEditState]);\n\n const selectionRef = useLatest(selection);\n const { kindOfData, kindOfNode } = useNodeKinds(scene, routing);\n\n // The painted alpha of a node in this view: the caller's `alphaFor` times any per-node\n // override alpha. The pick path reads the same number the painter does, or a node faded\n // to nothing stays clickable.\n const composedAlphaFor = useMemo(\n () => composeAlphaFor(scene, alphaFor),\n [scene, alphaFor],\n );\n const viewLayerGate = useViewLayerGate(layerVisibility, layerOrder);\n\n const adapter = useSceneAdapter(scene, {\n // `adapterMethods` is memoized; `selection` itself is a fresh object each render.\n selection: selection.adapterMethods,\n poseDescriptor: descriptor,\n });\n\n const {\n selectTool: internalSelect, pickEvery: internalPickEvery, pickBest: internalPickBest,\n boundsOf: internalBoundsOf, boundsOfPose: internalBoundsOfPose, planeOfNode: internalPlaneOfNode,\n moveOptions: internalMoveOptions,\n } = useSceneSelectTool({\n scene,\n adapter,\n poseDescriptor: descriptor,\n geometry,\n // The pick tolerance is declared in screen pixels; this is what converts it.\n getView: () => viewRef.current,\n // Only when the consumer actually fades something. Without a prop the\n // composed function is just the override lookup, and the source resolves\n // that once per walk instead of once per candidate.\n ...(alphaFor ? { alphaOf: composedAlphaFor } : {}),\n ...(viewLayerGate ? { layerIsPainted: viewLayerGate } : {}),\n selectTool: selectToolWithDefaults,\n });\n\n const getNodeAtPoint = useNodeAtPoint({\n pickBest: internalPickBest, nodes: adapter, kindOfData, isPointerInteractive,\n });\n\n const enabled = useEnabledFeatures(features, viewport !== undefined);\n const { tools, internal: internalTools, takeover: toolsTakeover } = useCanvasTools({\n select: internalSelect,\n enabled,\n tools: toolsProp,\n defaultTools,\n toolOptions,\n inertia: viewport?.inertia,\n ambient,\n pressFeedback: longPress?.feedback,\n initialActiveTool,\n modes,\n onToolsCreated,\n });\n const { contributions: featureContributions, standardActionsExclude } = useFeatureBindings({\n enabled,\n tools,\n move: internalMoveOptions as FeatureBindingOptions['move'],\n rotate: (selectToolOpts?.rotate || undefined) as FeatureBindingOptions['rotate'],\n });\n\n // Rides the gesture dispatcher as an OBSERVER rather than an Action binding because the\n // prop is a notification, not a behavior: as a binding it would lose first-match-wins to\n // `enterPathEdit` on every body hit and silently stop firing.\n const getNodeAtPointRef = useLatest(getNodeAtPoint);\n const onDoubleClickObserver = useHitObserver(onDoubleClick, getNodeAtPointRef);\n const onClickObserver = useHitObserver(onClick, getNodeAtPointRef);\n\n // `selectTool.rotate === false` disables rotation: its action is muted here and its\n // handle hidden by `useChromeRules`.\n const rotateOff = selectToolOpts?.rotate === false;\n const resolvedActions = useMemo<ActionsProp | undefined>(\n () => (rotateOff ? actionsMuting(actions, 'rotate') : actions),\n [actions, rotateOff],\n );\n\n // The wrapper's `<InputScope>` provides it.\n const actionsRegistry = useActionsRegistry();\n const { dispatcher, gestureSource, previewIdsExtra, previewPoseExtra } = useCanvasDispatcher(actionsRegistry);\n\n const { layers: wiredLayers, rotationBadge, chromeAffordancesRef } = useSceneCanvasLayers({\n layers,\n targetScale: deviceProfile.targetScale,\n scene,\n adapter,\n poseDescriptor: descriptor,\n alphaFor,\n colorOverrides: animator?.colorOverrides,\n boundsOf: internalBoundsOf,\n planeOfNode: internalPlaneOfNode,\n previewIds: previewIdsExtra,\n dispatcher,\n pathEditState,\n slops: debug !== undefined && debug !== false && debug.slops === true,\n });\n\n const { getHover, canvasRef: trackHoverOn } = useSceneHover({\n canvasApiRef, viewRef, nodeAtPointRef: getNodeAtPointRef, enabled: chromeVisibility !== undefined,\n });\n const chromeRules = useChromeRules({ enabled, selectable, rotateOff, chromeVisibility });\n const { chromeCaps, getIsVisible: getIsVisibleForCanvas, getRuleCtx: getRuleCtxForCanvas } = useSurfaceChromeCaps({\n source: {\n rules: chromeRules,\n getMode: getActiveMode,\n getFocused: getFocusedProp,\n getHover,\n getModifiers: heldModifiers.get,\n resizable: selectToolOpts?.resize?.resizable,\n editingAnchors: () => pathEditState.getEditingId() !== '',\n device: deviceProfile,\n },\n selection: selection.current as readonly NodeId[],\n viewRef,\n dispatcher,\n });\n\n const { ingest, clipboard: ingestionClipboard } = useCanvasIngestion(\n adapter, () => actionsRegistry, ingestion,\n );\n\n const { views: addedViews, addView } = useAddedViews();\n // The consumer's handle extends the primitive's with `ingest`, which needs the action stack.\n const { handleRef, ready: canvasReady } = useSceneCanvasHandle({\n ref, elementRef: internalCanvasRef, apiRef: canvasApiRef, onElement: trackHoverOn,\n ingest, viewAnimation, camera, addView,\n });\n\n // What a view needs to build its own overlay-aware state. `geometry` is the\n // same descriptor handed to `<Canvas>`, so the two cannot diverge.\n const viewInputs = useMemo<SurfaceViewInputs>(() => ({\n adapter: adapter as unknown as { getPose(id: string): unknown },\n geometry: descriptor as PoseDescriptor<unknown>,\n boundsOf: internalBoundsOf,\n boundsOfPose: internalBoundsOfPose as SurfaceViewInputs['boundsOfPose'],\n planeOfNode: internalPlaneOfNode,\n pickEvery: internalPickEvery,\n pickBest: internalPickBest,\n kindOfNode,\n chromeCaps,\n selectionApi: selection,\n rotationBadge,\n }), [adapter, descriptor, internalBoundsOf, internalBoundsOfPose, internalPlaneOfNode,\n internalPickEvery, internalPickBest, kindOfNode, chromeCaps, selection, rotationBadge]);\n\n useTestHook({\n getScene: () => scene as never,\n getSelectionIds: () => (selection.current as readonly string[] | undefined) ?? [],\n getView: () => viewRef.current,\n getActiveToolId: () => tools.active ?? null,\n });\n\n return (\n <ViewInputsProvider value={viewInputs}>\n <PointerProviderIfRoot>\n <Canvas<TPose>\n ref={handleRef}\n adapter={adapter}\n selection={selection}\n poseDescriptor={descriptor}\n tools={tools}\n layers={wiredLayers}\n // The chrome's bounds are the picker's: a node on a parallax plane is\n // boxed where the plane draws it, and a `geometry.boundsOf` reaches both.\n boundsOf={internalBoundsOf}\n boundsOfPose={internalBoundsOfPose}\n getIsVisible={getIsVisibleForCanvas}\n // The gesture surface behind `helpersRef.getGestureBounds()` /\n // `subscribeGestures()` — Canvas has no dispatcher of its own.\n gestureSource={gestureSource}\n previewPoseExtra={previewPoseExtra}\n {...(debug !== undefined ? { debug: canvasDebug(debug) } : {})}\n contentVersion={scene.getVersion}\n layerVisibility={layerVisibility}\n layerOrder={layerOrder}\n viewState={viewState}\n redrawOn={redrawOn}\n {...restProps}\n />\n <DevHuds\n cursorCoords={cursorCoordsHud}\n pick={pickHud}\n modality={modalityHud}\n canvasRef={internalCanvasRef}\n canvasApiRef={canvasApiRef}\n detachedInput={restProps.paintInto ? restProps.inputElement ?? null : undefined}\n viewRef={viewRef}\n pickEvery={internalPickEvery}\n pickBest={internalPickBest}\n />\n <PointerPublisher canvasRef={internalCanvasRef} canvasApiRef={canvasApiRef} />\n <StandardActionsRegistrar\n selection={selection}\n scene={scene}\n adapter={adapter as unknown as BridgeAdapter}\n actions={resolvedActions} tune={tune}\n excludeActions={standardActionsExclude}\n currentViewRef={viewRef}\n onViewChange={viewState.setViewFromInput}\n resizeOptions={selectToolOpts?.resize as UseResizeOptions<unknown> | undefined}\n poseDescriptor={descriptor as PoseDescriptor<unknown>}\n geometryProjection={geometryProjection}\n dispatcher={dispatcher}\n pickEvery={internalPickEvery}\n layerIsPainted={viewLayerGate}\n alphaOf={alphaFor ? composedAlphaFor : undefined}\n viewportPanEnabled={enabled.has('view') ? (viewport?.pan ?? true) : false}\n viewportZoom={enabled.has('view') ? resolvedViewportZoom : false}\n viewportPinchZoom={enabled.has('view') ? (viewport?.pinchZoom ?? true) : false}\n viewportRecenter={viewport?.recenter}\n viewAnimation={viewAnimation}\n editAnchorsExternalState={pathEditState}\n layoutDropTarget={layoutDropTarget}\n reflowTransition={reflowTransition as ReflowTransition<unknown> | null | undefined}\n insertNodeFactories={insertNodeFactories}\n insertPaint={insertPaint}\n snapPoint={toolOptions?.snapPoint}\n canvasRef={internalCanvasRef}\n canvasApiRef={canvasApiRef}\n ingestionResolveSrc={ingestion?.resolveSrc}\n ingestionSvg={ingestion?.svg}\n ingestionClipboard={ingestionClipboard}\n />\n <GestureDispatcherMounter\n canvasRef={internalCanvasRef}\n canvasApiRef={canvasApiRef}\n tools={tools}\n contributions={featureContributions}\n enabled={enableGestureDispatcher}\n keyboard={enableKeybindings}\n claimKeys={claimKeys}\n selectionRef={selectionRef}\n boundsOf={internalBoundsOf}\n planeOfNode={internalPlaneOfNode}\n pickEvery={internalPickEvery}\n pickBest={internalPickBest}\n kindOfNode={kindOfNode}\n viewRef={viewRef}\n dispatcher={dispatcher}\n getIsVisibleForCanvas={getIsVisibleForCanvas}\n getRuleCtx={getRuleCtxForCanvas}\n targetScale={deviceProfile.targetScale}\n handleHitRadius={selectToolOpts?.handleHitRadius}\n rotationBadge={rotationBadge}\n chromeAffordancesRef={chromeAffordancesRef}\n onDoubleClick={onDoubleClickObserver}\n onClick={onClickObserver}\n longPress={longPress}\n />\n <ToolKeybindingsMounter\n internalTools={internalTools}\n toolsTakeover={toolsTakeover ?? undefined}\n enableKeybindings={enableKeybindings}\n modes={modes}\n canvasApi={canvasReady ? canvasApiRef.current : null}\n versionCheck={versionCheck}\n />\n {viewDescriptors?.map((v, i) => (\n <CanvasView key={v.id} {...v} order={v.order ?? i} />\n ))}\n {contributionEntries(tools).flatMap((e) => e.views ?? []).map((v) => (\n <CanvasView key={`contribution:${v.id}`} {...v} />\n ))}\n {addedViews.map((v) => <CanvasView key={`added:${v.id}`} {...v} />)}\n {children}\n </PointerProviderIfRoot>\n </ViewInputsProvider>\n );\n}\n\nconst SceneCanvasInnerForwardRef = forwardRef(SceneCanvasInner);\n\n// The canvas's input scope sits above `SceneCanvasInner`, whose own hooks\n// (`useTools` among them) must already read this canvas's tool and registries.\n// Its device profile too, so the canvas and everything under it share one.\nfunction SceneCanvasWrapper<TData, TLayer extends string, TPose>(\n { device, ...props }: SceneCanvasProps<TData, TLayer, TPose>,\n ref: React.ForwardedRef<SceneCanvasApi>,\n) {\n return (\n <InputScope yoke={props.yoke}>\n <DeviceProfileProvider value={device}>\n <ViewRegistryProvider>\n <SceneCanvasInnerForwardRef {...(props as SceneCanvasProps<unknown, string, unknown>)} ref={ref} />\n </ViewRegistryProvider>\n </DeviceProfileProvider>\n </InputScope>\n );\n}\n\n/**\n * The canvas component: renders a `Scene` and wires the interaction stack\n * around it.\n *\n * Mounted bare it renders the scene, keeps a selection no input sets, and\n * runs a gesture dispatcher for whatever bindings the consumer adds. The\n * `features` presets turn the kit's behavior on — `features={['draw']}` is the\n * whole editor: tools, standard actions and their keys, selection chrome,\n * undo. This is the intended entry point; the lower-level primitives it\n * composes are not part of the public surface.\n *\n * Its ref exposes a `SceneCanvasApi` for the imperative operations that do not\n * fit a prop (view control, hit queries, redraw requests).\n */\nexport const SceneCanvas = forwardRef(SceneCanvasWrapper) as <\n TData, TLayer extends string, TPose,\n>(\n props: SceneCanvasProps<TData, TLayer, TPose> & { ref?: React.Ref<SceneCanvasApi> },\n) => ReturnType<typeof SceneCanvasInner>;\n\nexport { DEFAULT_HANDLE_SIZE, mergeLayersWithDefaults, BUILTIN_TOOL_IDS } from './SceneCanvas/props';\nexport type {\n SceneCanvasProps,\n SceneCanvasHit,\n SceneCanvasLayers,\n SceneCanvasLongPress,\n BuiltinToolId,\n} from './SceneCanvas/props';\nexport type { CoordTraceEntry } from './SceneCanvas/coordTrace';\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { normalizeView as e } from "../core/viewport/view.js";
2
2
  import { useCanvasSurface as t } from "./useCanvasSurface.js";
3
- import { surfaceBox as n } from "./surfaceBox.js";
3
+ import { SurfaceCanvas as n } from "./SurfaceCanvas.js";
4
4
  import { sceneViewFrame as r } from "./sceneViewRender.js";
5
5
  import { useCallback as i, useEffect as a, useRef as o, useSyncExternalStore as s } from "react";
6
6
  import { assignRef as c } from "@weasel-js/react";
@@ -36,11 +36,11 @@ function u(u) {
36
36
  target: T,
37
37
  paintOnCommit: !0
38
38
  });
39
- return a(() => d.overrides.subscribe(D), [d, D]), a(() => y?.onTick(D), [y, D]), /* @__PURE__ */ l("canvas", {
39
+ return a(() => d.overrides.subscribe(D), [d, D]), a(() => y?.onTick(D), [y, D]), /* @__PURE__ */ l(n, {
40
40
  ref: E,
41
41
  width: f,
42
42
  height: p,
43
- ...n(f, p, b)
43
+ className: b
44
44
  });
45
45
  }
46
46
  var d = u;
@@ -1 +1 @@
1
- {"version":3,"file":"SceneViewCanvas.js","names":["SceneViewCanvasInner","props","view","normalizeView","scene","localRef","useRef","setCanvasRef","useCallback","el","assignRef","canvasRef","useCanvasSurface","canvas","commands","sceneViewFrame","animator","lease","useEffect","requestRedraw","surfaceBox","width","height","className","SceneViewCanvas"],"sources":["../../src/canvas/SceneViewCanvas.tsx"],"sourcesContent":["/**\n * `<SceneViewCanvas>` — pointer-inert, read-only render of a `Scene` at a\n * given `View` into its own `<canvas>` DOM element.\n *\n * It paints through `useFrameLoop` rather than from React: a render and an\n * override commit both just mark the surface dirty. The mount paint is\n * synchronous, so the first frame the user sees is the scene, and nothing\n * paints while the canvas is off screen or the tab is hidden.\n */\nimport {\n useCallback,\n useEffect,\n useRef,\n useSyncExternalStore,\n} from 'react';\nimport type { Ref } from 'react';\nimport { assignRef } from '@weasel-js/react';\nimport { useCanvasSurface } from './useCanvasSurface';\nimport type { CanvasRendererLease } from './canvasRenderer';\nimport { surfaceBox } from './surfaceBox';\nimport { sceneViewFrame } from './sceneViewRender';\nimport type { RenderSceneToCanvasArgs, SceneViewDrawOne, SceneViewLayers } from './sceneViewRender';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { normalizeView, type View } from '../core/viewport/view';\nimport type { Scene } from '../core/scene/types';\nimport type { Animator } from '@weasel-js/animator';\n\n/** Props for `<SceneViewCanvas>`. */\nexport interface SceneViewCanvasProps<TData, TLayer extends string, TPose> {\n /** Scene to render. The component subscribes to it and repaints when it\n * changes. */\n scene: Scene<TData, TLayer, TPose>;\n /** Camera. Applied to scene + `extraCommands` via the renderer's group\n * transform. */\n view: View;\n /** CSS-pixel width. Drives both layout (via the rendered drawing-buffer\n * size) and the renderer's coordinate space. */\n width: number;\n /** CSS-pixel height. */\n height: number;\n /** Per-node draw callback. See `SceneViewDrawOne`. The consumer is\n * responsible for what gets painted — there is no AABB-fill default. */\n drawOne: SceneViewDrawOne<TData, TLayer, TPose>;\n /** Optional extra commands appended after scene commands, inside the same\n * view transform — a world-space annotation over the scene. */\n extraCommands?: ReadonlyArray<DrawCommand>;\n /** Optional per-id alpha multiplier, mirroring `<SceneCanvas>`'s scene-slot\n * `alphaFor`. Pass the same function the main canvas uses to keep a\n * scoping-dim treatment consistent across both. Defaults to `() => 1`. */\n alphaFor?: (id: string) => number;\n /** Hide scene layers in this view only, keyed `scene:<layerId>` as on\n * `<SceneCanvas>` — pass the main canvas's map to keep the two in step. */\n layerVisibility?: SceneViewLayers['layerVisibility'];\n /** Paint order for this view, keyed as `layerVisibility`. */\n layerOrder?: SceneViewLayers['layerOrder'];\n /** Skip nodes and commands that cannot reach this view — the scene slot's\n * `cull`. Off by default; worth it when the view shows a small part of a\n * large scene. */\n cull?: boolean;\n /** Where `drawOne`'s output for a node can reach — the scene slot's\n * `paintBounds`. Defaults to `defaultPaintBounds` when `drawOne` is\n * `defaultDrawOne`. */\n paintBounds?: RenderSceneToCanvasArgs<TData, TLayer, TPose>['paintBounds'];\n /** Optional animator, as on `<SceneCanvas>`: the view repaints on its ticks\n * and paints its `colorOverrides`. Pass the main canvas's animator so both\n * show the same colors. */\n animator?: Animator;\n /** Optional CSS class for the `<canvas>`. Its size is `width` × `height`\n * unless a rule on this class sizes it. */\n className?: string;\n /** Forwarded ref to the underlying `<canvas>`. Consumers attach their own\n * pointer listeners or call `toBlob` for snapshots through this. */\n canvasRef?: Ref<HTMLCanvasElement>;\n}\n\nfunction SceneViewCanvasInner<TData, TLayer extends string, TPose>(\n props: SceneViewCanvasProps<TData, TLayer, TPose>,\n) {\n const {\n scene, width, height, drawOne, extraCommands, alphaFor, layerVisibility, layerOrder,\n animator, className, canvasRef, cull, paintBounds,\n } = props;\n const view = normalizeView(props.view);\n\n // Subscribe to scene version. The snapshot value isn't used directly —\n // we only need React to re-render the component when the scene mutates.\n useSyncExternalStore(scene.subscribe, scene.getVersion, scene.getVersion);\n\n const localRef = useRef<HTMLCanvasElement | null>(null);\n\n const setCanvasRef = useCallback((el: HTMLCanvasElement | null): void => {\n localRef.current = el;\n assignRef(canvasRef, el);\n }, [canvasRef]);\n\n const paint = (lease: CanvasRendererLease): boolean => {\n const canvas = localRef.current;\n if (!canvas) return false;\n const commands = sceneViewFrame({\n scene,\n view,\n width,\n height,\n drawOne,\n extraCommands: extraCommands as DrawCommand[] | undefined,\n alphaFor,\n layerVisibility,\n layerOrder,\n colorOverrides: animator?.colorOverrides,\n cull,\n paintBounds,\n });\n return lease.paint(canvas, commands, view, { width, height });\n };\n const { requestRedraw } = useCanvasSurface(paint, { target: localRef, paintOnCommit: true });\n\n // Override writes never bump the scene version, so the version subscription\n // above cannot see them.\n useEffect(() => scene.overrides.subscribe(requestRedraw), [scene, requestRedraw]);\n useEffect(() => animator?.onTick(requestRedraw), [animator, requestRedraw]);\n\n return (\n <canvas\n ref={setCanvasRef}\n width={width}\n height={height}\n {...surfaceBox(width, height, className)}\n />\n );\n}\n\n/**\n * Pointer-inert read-only scene view. It attaches no event listeners;\n * consumers attach their own through `canvasRef`, a plain prop because\n * `forwardRef` erases the component's generics. `width` and `height` are CSS\n * pixels and size the drawing buffer; a `className` rule that sizes the\n * element stretches that buffer to fit.\n */\nexport const SceneViewCanvas = SceneViewCanvasInner;\n"],"mappings":";;;;;;;;AA2EA,SAASA,EACP,GACA;CACA,IAAM,EACJ,UAAO,UAAO,WAAQ,YAAS,kBAAe,aAAU,oBAAiB,eACzE,aAAU,cAAW,cAAW,SAAM,mBACpCC,GACEC,IAAOC,EAAcF,EAAM,IAAI;CAIrC,EAAqBG,EAAM,WAAWA,EAAM,YAAYA,EAAM,UAAU;CAExE,IAAMC,IAAWC,EAAiC,IAAI,GAEhDC,IAAeC,GAAa,MAAuC;EAEvE,AADA,EAAS,UAAUC,GACnBC,EAAUC,GAAWF,CAAE;CACzB,GAAG,CAACE,CAAS,CAAC,GAqBR,EAAE,qBAAkBC,GAnBX,MAAwC;EACrD,IAAMC,IAASR,EAAS;EACxB,IAAI,CAACQ,GAAQ,OAAO;EACpB,IAAMC,IAAWC,EAAe;GAC9B;GACA;GACA;GACA;GACA;GACe;GACf;GACA;GACA;GACA,gBAAgBC,GAAU;GAC1B;GACA;EACF,CAAC;EACD,OAAOC,EAAM,MAAMJ,GAAQC,GAAUZ,GAAM;GAAE;GAAO;EAAO,CAAC;CAC9D,GACkD;EAAE,QAAQG;EAAU,eAAe;CAAK,CAAC;CAO3F,OAHAa,QAAgBd,EAAM,UAAU,UAAUe,CAAa,GAAG,CAACf,GAAOe,CAAa,CAAC,GAChFD,QAAgBF,GAAU,OAAOG,CAAa,GAAG,CAACH,GAAUG,CAAa,CAAC,GAGxE,kBAAC,UAAD;EACE,KAAKZ;EACE;EACC;EACR,GAAIa,EAAWC,GAAOC,GAAQC,CAAS;CACxC,CAAA;AAEL;AASA,IAAaC,IAAkBxB"}
1
+ {"version":3,"file":"SceneViewCanvas.js","names":["SceneViewCanvasInner","props","view","normalizeView","scene","localRef","useRef","setCanvasRef","useCallback","el","assignRef","canvasRef","useCanvasSurface","canvas","commands","sceneViewFrame","animator","lease","useEffect","requestRedraw","SurfaceCanvas","SceneViewCanvas"],"sources":["../../src/canvas/SceneViewCanvas.tsx"],"sourcesContent":["/**\n * `<SceneViewCanvas>` — pointer-inert, read-only render of a `Scene` at a\n * given `View` into its own `<canvas>` DOM element.\n *\n * It paints through `useFrameLoop` rather than from React: a render and an\n * override commit both just mark the surface dirty. The mount paint is\n * synchronous, so the first frame the user sees is the scene, and nothing\n * paints while the canvas is off screen or the tab is hidden.\n */\nimport {\n useCallback,\n useEffect,\n useRef,\n useSyncExternalStore,\n} from 'react';\nimport type { Ref } from 'react';\nimport { assignRef } from '@weasel-js/react';\nimport { useCanvasSurface } from './useCanvasSurface';\nimport type { CanvasRendererLease } from './canvasRenderer';\nimport { SurfaceCanvas } from './SurfaceCanvas';\nimport { sceneViewFrame } from './sceneViewRender';\nimport type { RenderSceneToCanvasArgs, SceneViewDrawOne, SceneViewLayers } from './sceneViewRender';\nimport type { DrawCommand } from '@weasel-js/renderer';\nimport { normalizeView, type View } from '../core/viewport/view';\nimport type { Scene } from '../core/scene/types';\nimport type { Animator } from '@weasel-js/animator';\n\n/** Props for `<SceneViewCanvas>`. */\nexport interface SceneViewCanvasProps<TData, TLayer extends string, TPose> {\n /** Scene to render. The component subscribes to it and repaints when it\n * changes. */\n scene: Scene<TData, TLayer, TPose>;\n /** Camera. Applied to scene + `extraCommands` via the renderer's group\n * transform. */\n view: View;\n /** CSS-pixel width. Drives both layout (via the rendered drawing-buffer\n * size) and the renderer's coordinate space. */\n width: number;\n /** CSS-pixel height. */\n height: number;\n /** Per-node draw callback. See `SceneViewDrawOne`. The consumer is\n * responsible for what gets painted — there is no AABB-fill default. */\n drawOne: SceneViewDrawOne<TData, TLayer, TPose>;\n /** Optional extra commands appended after scene commands, inside the same\n * view transform — a world-space annotation over the scene. */\n extraCommands?: ReadonlyArray<DrawCommand>;\n /** Optional per-id alpha multiplier, mirroring `<SceneCanvas>`'s scene-slot\n * `alphaFor`. Pass the same function the main canvas uses to keep a\n * scoping-dim treatment consistent across both. Defaults to `() => 1`. */\n alphaFor?: (id: string) => number;\n /** Hide scene layers in this view only, keyed `scene:<layerId>` as on\n * `<SceneCanvas>` — pass the main canvas's map to keep the two in step. */\n layerVisibility?: SceneViewLayers['layerVisibility'];\n /** Paint order for this view, keyed as `layerVisibility`. */\n layerOrder?: SceneViewLayers['layerOrder'];\n /** Skip nodes and commands that cannot reach this view — the scene slot's\n * `cull`. Off by default; worth it when the view shows a small part of a\n * large scene. */\n cull?: boolean;\n /** Where `drawOne`'s output for a node can reach — the scene slot's\n * `paintBounds`. Defaults to `defaultPaintBounds` when `drawOne` is\n * `defaultDrawOne`. */\n paintBounds?: RenderSceneToCanvasArgs<TData, TLayer, TPose>['paintBounds'];\n /** Optional animator, as on `<SceneCanvas>`: the view repaints on its ticks\n * and paints its `colorOverrides`. Pass the main canvas's animator so both\n * show the same colors. */\n animator?: Animator;\n /** Optional CSS class for the `<canvas>`. Its size is `width` × `height`\n * unless a rule on this class sizes it. */\n className?: string;\n /** Forwarded ref to the underlying `<canvas>`. Consumers attach their own\n * pointer listeners or call `toBlob` for snapshots through this. */\n canvasRef?: Ref<HTMLCanvasElement>;\n}\n\nfunction SceneViewCanvasInner<TData, TLayer extends string, TPose>(\n props: SceneViewCanvasProps<TData, TLayer, TPose>,\n) {\n const {\n scene, width, height, drawOne, extraCommands, alphaFor, layerVisibility, layerOrder,\n animator, className, canvasRef, cull, paintBounds,\n } = props;\n const view = normalizeView(props.view);\n\n // Subscribe to scene version. The snapshot value isn't used directly —\n // we only need React to re-render the component when the scene mutates.\n useSyncExternalStore(scene.subscribe, scene.getVersion, scene.getVersion);\n\n const localRef = useRef<HTMLCanvasElement | null>(null);\n\n const setCanvasRef = useCallback((el: HTMLCanvasElement | null): void => {\n localRef.current = el;\n assignRef(canvasRef, el);\n }, [canvasRef]);\n\n const paint = (lease: CanvasRendererLease): boolean => {\n const canvas = localRef.current;\n if (!canvas) return false;\n const commands = sceneViewFrame({\n scene,\n view,\n width,\n height,\n drawOne,\n extraCommands: extraCommands as DrawCommand[] | undefined,\n alphaFor,\n layerVisibility,\n layerOrder,\n colorOverrides: animator?.colorOverrides,\n cull,\n paintBounds,\n });\n return lease.paint(canvas, commands, view, { width, height });\n };\n const { requestRedraw } = useCanvasSurface(paint, { target: localRef, paintOnCommit: true });\n\n // Override writes never bump the scene version, so the version subscription\n // above cannot see them.\n useEffect(() => scene.overrides.subscribe(requestRedraw), [scene, requestRedraw]);\n useEffect(() => animator?.onTick(requestRedraw), [animator, requestRedraw]);\n\n return (\n <SurfaceCanvas\n ref={setCanvasRef}\n width={width}\n height={height}\n className={className}\n />\n );\n}\n\n/**\n * Pointer-inert read-only scene view. It attaches no event listeners;\n * consumers attach their own through `canvasRef`, a plain prop because\n * `forwardRef` erases the component's generics. `width` and `height` are CSS\n * pixels and size the drawing buffer; a `className` rule that sizes the\n * element stretches that buffer to fit.\n */\nexport const SceneViewCanvas = SceneViewCanvasInner;\n"],"mappings":";;;;;;;;AA2EA,SAASA,EACP,GACA;CACA,IAAM,EACJ,UAAO,UAAO,WAAQ,YAAS,kBAAe,aAAU,oBAAiB,eACzE,aAAU,cAAW,cAAW,SAAM,mBACpCC,GACEC,IAAOC,EAAcF,EAAM,IAAI;CAIrC,EAAqBG,EAAM,WAAWA,EAAM,YAAYA,EAAM,UAAU;CAExE,IAAMC,IAAWC,EAAiC,IAAI,GAEhDC,IAAeC,GAAa,MAAuC;EAEvE,AADA,EAAS,UAAUC,GACnBC,EAAUC,GAAWF,CAAE;CACzB,GAAG,CAACE,CAAS,CAAC,GAqBR,EAAE,qBAAkBC,GAnBX,MAAwC;EACrD,IAAMC,IAASR,EAAS;EACxB,IAAI,CAACQ,GAAQ,OAAO;EACpB,IAAMC,IAAWC,EAAe;GAC9B;GACA;GACA;GACA;GACA;GACe;GACf;GACA;GACA;GACA,gBAAgBC,GAAU;GAC1B;GACA;EACF,CAAC;EACD,OAAOC,EAAM,MAAMJ,GAAQC,GAAUZ,GAAM;GAAE;GAAO;EAAO,CAAC;CAC9D,GACkD;EAAE,QAAQG;EAAU,eAAe;CAAK,CAAC;CAO3F,OAHAa,QAAgBd,EAAM,UAAU,UAAUe,CAAa,GAAG,CAACf,GAAOe,CAAa,CAAC,GAChFD,QAAgBF,GAAU,OAAOG,CAAa,GAAG,CAACH,GAAUG,CAAa,CAAC,GAGxE,kBAACC,GAAD;EACE,KAAKb;EACE;EACC;EACG;CACZ,CAAA;AAEL;AASA,IAAac,IAAkBrB"}
@@ -0,0 +1,40 @@
1
+ import { forwardRef as e, useCallback as t } from "react";
2
+ import { assignRef as n } from "@weasel-js/react";
3
+ import { jsx as r } from "react/jsx-runtime";
4
+ //#region src/canvas/SurfaceCanvas.tsx
5
+ var i = ":where([data-wzl-surface]) { width: var(--wzl-surface-width); height: var(--wzl-surface-height); }", a = /* @__PURE__ */ new WeakSet();
6
+ function o(e) {
7
+ let t = e.ownerDocument, n = e.getRootNode(), r = "host" in n ? n : t;
8
+ if (a.has(r)) return;
9
+ a.add(r);
10
+ let o = t.defaultView?.CSSStyleSheet;
11
+ if (o && "replaceSync" in o.prototype && Array.isArray(r.adoptedStyleSheets)) {
12
+ let e = new o();
13
+ e.replaceSync(i), r.adoptedStyleSheets = [...r.adoptedStyleSheets, e];
14
+ return;
15
+ }
16
+ let s = t.createElement("style");
17
+ s.textContent = i, ("host" in r ? r : r.head).appendChild(s);
18
+ }
19
+ var s = e(function({ width: e, height: i, className: a, style: s, tabIndex: c }, l) {
20
+ let u = t((e) => {
21
+ e && o(e), n(l, e);
22
+ }, [l]), d = {
23
+ ...s,
24
+ "--wzl-surface-width": `${e}px`,
25
+ "--wzl-surface-height": `${i}px`
26
+ };
27
+ return /* @__PURE__ */ r("canvas", {
28
+ ref: u,
29
+ width: e,
30
+ height: i,
31
+ tabIndex: c,
32
+ className: a,
33
+ style: d,
34
+ "data-wzl-surface": ""
35
+ });
36
+ });
37
+ //#endregion
38
+ export { i as SURFACE_RULE, s as SurfaceCanvas, o as adoptSurfaceRule };
39
+
40
+ //# sourceMappingURL=SurfaceCanvas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SurfaceCanvas.js","names":["SURFACE_RULE","adopted","adoptSurfaceRule","doc","el","node","root","Sheet","sheet","style","SurfaceCanvas","forwardRef","setRef","useCallback","assignRef","ref","sized","width","height"],"sources":["../../src/canvas/SurfaceCanvas.tsx"],"sourcesContent":["import { forwardRef, useCallback, type CSSProperties } from 'react';\nimport { assignRef } from '@weasel-js/react';\n\n/** Where an element's styles come from. */\ntype StyleRoot = Document | ShadowRoot;\n\n/** The CSS size of a canvas the kit renders: its `width` and `height` props.\n * Zero specificity, so a class the consumer passes resizes the element. */\nexport const SURFACE_RULE =\n ':where([data-wzl-surface]) { width: var(--wzl-surface-width); height: var(--wzl-surface-height); }';\n\nlet adopted = new WeakSet<StyleRoot>();\n\n/**\n * Hold {@link SURFACE_RULE} in the root `el`'s styles come from: its shadow\n * root, else its document. Once per root, and never taken back out.\n */\nexport function adoptSurfaceRule(el: Element): void {\n const doc = el.ownerDocument;\n const node = el.getRootNode();\n const root: StyleRoot = 'host' in node ? (node as ShadowRoot) : doc;\n if (adopted.has(root)) return;\n adopted.add(root);\n const Sheet = doc.defaultView?.CSSStyleSheet;\n if (Sheet && 'replaceSync' in Sheet.prototype && Array.isArray(root.adoptedStyleSheets)) {\n // From the root's own window: a constructed sheet cannot be adopted across documents.\n const sheet = new Sheet();\n sheet.replaceSync(SURFACE_RULE);\n root.adoptedStyleSheets = [...root.adoptedStyleSheets, sheet];\n return;\n }\n const style = doc.createElement('style');\n style.textContent = SURFACE_RULE;\n ('host' in root ? root : root.head).appendChild(style);\n}\n\n/** Test seam: forgets which roots hold the rule. */\nexport function __resetSurfaceRule(): void {\n adopted = new WeakSet();\n}\n\nexport interface SurfaceCanvasProps {\n /** CSS pixels. The renderer sizes only the drawing buffer, so without the\n * rule this element holds it is as large as its buffer: `dpr` times too big. */\n width: number;\n height: number;\n className?: string;\n style?: CSSProperties;\n tabIndex?: number;\n}\n\n/** The `<canvas>` a kit component paints into, `width` × `height` CSS pixels. */\nexport const SurfaceCanvas = forwardRef<HTMLCanvasElement, SurfaceCanvasProps>(\n function SurfaceCanvas({ width, height, className, style, tabIndex }, ref) {\n // Stable while `ref` is, so a commit does not detach the element.\n const setRef = useCallback((el: HTMLCanvasElement | null) => {\n if (el) adoptSurfaceRule(el);\n assignRef(ref, el);\n }, [ref]);\n const sized = { ...style, '--wzl-surface-width': `${width}px`, '--wzl-surface-height': `${height}px` };\n return (\n <canvas\n ref={setRef}\n width={width}\n height={height}\n tabIndex={tabIndex}\n className={className}\n style={sized as CSSProperties}\n data-wzl-surface=\"\"\n />\n );\n },\n);\n"],"mappings":";;;;AAQA,IAAaA,IACX,sGAEEC,oBAAU,IAAI,QAAmB;AAMrC,SAAgBC,EAAiB,GAAmB;CAClD,IAAMC,IAAMC,EAAG,eACTC,IAAOD,EAAG,YAAY,GACtBE,IAAkB,UAAUD,IAAQA,IAAsBF;CAChE,IAAIF,EAAQ,IAAIK,CAAI,GAAG;CACvB,EAAQ,IAAIA,CAAI;CAChB,IAAMC,IAAQJ,EAAI,aAAa;CAC/B,IAAII,KAAS,iBAAiBA,EAAM,aAAa,MAAM,QAAQD,EAAK,kBAAkB,GAAG;EAEvF,IAAME,IAAQ,IAAID,EAAM;EAExB,AADAC,EAAM,YAAYR,CAAY,GAC9B,EAAK,qBAAqB,CAAC,GAAGM,EAAK,oBAAoBE,CAAK;EAC5D;CACF;CACA,IAAMC,IAAQN,EAAI,cAAc,OAAO;CAEvC,AADA,EAAM,cAAcH,IACnB,UAAUM,IAAOA,IAAOA,EAAK,KAAA,CAAM,YAAYG,CAAK;AACvD;AAkBA,IAAaC,IAAgBC,EAC3B,SAAuB,EAAE,UAAO,WAAQ,cAAW,UAAO,eAAY,GAAK;CAEzE,IAAMC,IAASC,GAAa,MAAiC;EAE3D,AADIT,KAAIF,EAAiBE,CAAE,GAC3BU,EAAUC,GAAKX,CAAE;CACnB,GAAG,CAACW,CAAG,CAAC,GACFC,IAAQ;EAAE,GAAGP;EAAO,uBAAuB,GAAGQ,EAAM;EAAK,wBAAwB,GAAGC,EAAO;CAAI;CACrG,OACE,kBAAC,UAAD;EACE,KAAKN;EACE;EACC;EACE;EACC;EACX,OAAOI;EACP,oBAAiB;CAClB,CAAA;AAEL,CACF"}