@weasel-js/core 1.9.3 → 1.9.4

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 (542) hide show
  1. package/CHANGELOG.md +356 -0
  2. package/README.md +2 -2
  3. package/dist/WeaselProvider.js +5 -5
  4. package/dist/affordances/composeAffordanceLayer.js +10 -20
  5. package/dist/affordances/composeAffordanceLayer.js.map +1 -1
  6. package/dist/affordances/cornerResize.js +25 -17
  7. package/dist/affordances/cornerResize.js.map +1 -1
  8. package/dist/affordances/hitAffordanceRegions.js +27 -20
  9. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  10. package/dist/affordances/rotationHandle.js +18 -18
  11. package/dist/affordances/rotationHandle.js.map +1 -1
  12. package/dist/animation/behaviors/momentum.js +93 -55
  13. package/dist/animation/behaviors/momentum.js.map +1 -1
  14. package/dist/animation/loop.js +10 -12
  15. package/dist/animation/loop.js.map +1 -1
  16. package/dist/animation/reflow.js +8 -8
  17. package/dist/animation/reflow.js.map +1 -1
  18. package/dist/animation/stagger.js +64 -56
  19. package/dist/animation/stagger.js.map +1 -1
  20. package/dist/animation/timeline/booking.js +62 -54
  21. package/dist/animation/timeline/booking.js.map +1 -1
  22. package/dist/animation/timeline/createTimeline.js +85 -76
  23. package/dist/animation/timeline/createTimeline.js.map +1 -1
  24. package/dist/animation/timeline/sampleTrack.js +13 -5
  25. package/dist/animation/timeline/sampleTrack.js.map +1 -1
  26. package/dist/animation/useAnimator.js +45 -35
  27. package/dist/animation/useAnimator.js.map +1 -1
  28. package/dist/animation/wrappers/animateLifecycle.js +31 -24
  29. package/dist/animation/wrappers/animateLifecycle.js.map +1 -1
  30. package/dist/animation/wrappers/animateOnSetPose.js +28 -26
  31. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -1
  32. package/dist/animation/wrappers/instantPose.js +13 -0
  33. package/dist/animation/wrappers/instantPose.js.map +1 -0
  34. package/dist/{poseDescriptor-D-OH-tu5.d.ts → autoPoseDescriptor-Ct7yqivU.d.ts} +28 -3
  35. package/dist/barrel/chrome.js +16 -0
  36. package/dist/barrel/input.js +19 -0
  37. package/dist/barrel/interactions.js +42 -0
  38. package/dist/barrel/paint.js +18 -0
  39. package/dist/barrel/paths.js +19 -0
  40. package/dist/barrel/renderer.js +20 -0
  41. package/dist/barrel/routing.js +51 -0
  42. package/dist/barrel/text.js +18 -0
  43. package/dist/barrel/viewport.js +52 -0
  44. package/dist/builtins-DPcdghtB.d.ts +1223 -0
  45. package/dist/canvas/Canvas.js +363 -448
  46. package/dist/canvas/Canvas.js.map +1 -1
  47. package/dist/canvas/CanvasView.js +164 -165
  48. package/dist/canvas/CanvasView.js.map +1 -1
  49. package/dist/canvas/CursorCoordsHud.js +37 -32
  50. package/dist/canvas/CursorCoordsHud.js.map +1 -1
  51. package/dist/canvas/DrawCanvas.js +49 -43
  52. package/dist/canvas/DrawCanvas.js.map +1 -1
  53. package/dist/canvas/MinimapCanvas.js +26 -25
  54. package/dist/canvas/MinimapCanvas.js.map +1 -1
  55. package/dist/canvas/NodeShape.js +59 -377
  56. package/dist/canvas/NodeShape.js.map +1 -1
  57. package/dist/canvas/PickHud.js +50 -47
  58. package/dist/canvas/PickHud.js.map +1 -1
  59. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js +167 -0
  60. package/dist/canvas/SceneCanvas/GestureDispatcherMounter.js.map +1 -0
  61. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +13 -13
  62. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js +67 -0
  63. package/dist/canvas/SceneCanvas/StandardActionsRegistrar.js.map +1 -0
  64. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js +16 -0
  65. package/dist/canvas/SceneCanvas/ToolKeybindingsMounter.js.map +1 -0
  66. package/dist/canvas/SceneCanvas/coordTrace.js +10 -0
  67. package/dist/canvas/SceneCanvas/coordTrace.js.map +1 -0
  68. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +112 -70
  69. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  70. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +9 -8
  71. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  72. package/dist/canvas/SceneCanvas/features.js +1 -0
  73. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  74. package/dist/canvas/SceneCanvas/isDev.js +12 -0
  75. package/dist/canvas/SceneCanvas/isDev.js.map +1 -0
  76. package/dist/canvas/SceneCanvas/poseGeometry.js +29 -28
  77. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -1
  78. package/dist/canvas/SceneCanvas/poseRegistrars.js +13 -0
  79. package/dist/canvas/SceneCanvas/poseRegistrars.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/props.js +38 -0
  81. package/dist/canvas/SceneCanvas/props.js.map +1 -0
  82. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +21 -62
  83. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -1
  84. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -1
  85. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +46 -48
  86. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -1
  87. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +33 -33
  88. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  89. package/dist/canvas/SceneCanvas.js +534 -788
  90. package/dist/canvas/SceneCanvas.js.map +1 -1
  91. package/dist/canvas/SceneViewCanvas.js +45 -43
  92. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  93. package/dist/canvas/buildSceneLayer.js +91 -0
  94. package/dist/canvas/buildSceneLayer.js.map +1 -0
  95. package/dist/canvas/buildSceneTree.js +16 -19
  96. package/dist/canvas/buildSceneTree.js.map +1 -1
  97. package/dist/canvas/canvasRenderer.js +68 -52
  98. package/dist/canvas/canvasRenderer.js.map +1 -1
  99. package/dist/canvas/deps/changes.js +13 -0
  100. package/dist/canvas/deps/changes.js.map +1 -0
  101. package/dist/canvas/deps/editAnchors.js +28 -28
  102. package/dist/canvas/deps/insert.js +119 -91
  103. package/dist/canvas/deps/insert.js.map +1 -1
  104. package/dist/canvas/deps/slice.js +46 -45
  105. package/dist/canvas/deps/slice.js.map +1 -1
  106. package/dist/canvas/deps/textEdit.js +10 -9
  107. package/dist/canvas/deps/textEdit.js.map +1 -1
  108. package/dist/canvas/derivedPath.js +46 -23
  109. package/dist/canvas/derivedPath.js.map +1 -1
  110. package/dist/canvas/getNodeAtPoint.js +7 -7
  111. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  112. package/dist/canvas/hud.module.js +1 -1
  113. package/dist/canvas/hud.module.js.map +1 -1
  114. package/dist/canvas/kitRequirements.js +2 -2
  115. package/dist/canvas/kitRequirements.js.map +1 -1
  116. package/dist/canvas/layerOrder.js +13 -6
  117. package/dist/canvas/layerOrder.js.map +1 -1
  118. package/dist/canvas/minimapMath.js +12 -10
  119. package/dist/canvas/minimapMath.js.map +1 -1
  120. package/dist/canvas/nodeShapes/derivedPainter.js +34 -0
  121. package/dist/canvas/nodeShapes/derivedPainter.js.map +1 -0
  122. package/dist/canvas/nodeShapes/imagePainter.js +87 -0
  123. package/dist/canvas/nodeShapes/imagePainter.js.map +1 -0
  124. package/dist/canvas/nodeShapes/memo.js +9 -0
  125. package/dist/canvas/nodeShapes/memo.js.map +1 -0
  126. package/dist/canvas/nodeShapes/nodePaint.js +57 -0
  127. package/dist/canvas/nodeShapes/nodePaint.js.map +1 -0
  128. package/dist/canvas/nodeShapes/pathPainter.js +38 -0
  129. package/dist/canvas/nodeShapes/pathPainter.js.map +1 -0
  130. package/dist/canvas/nodeShapes/poseBox.js +20 -0
  131. package/dist/canvas/nodeShapes/poseBox.js.map +1 -0
  132. package/dist/canvas/nodeShapes/rectFallbackPainter.js +38 -0
  133. package/dist/canvas/nodeShapes/rectFallbackPainter.js.map +1 -0
  134. package/dist/canvas/nodeShapes/shapePainter.js +72 -0
  135. package/dist/canvas/nodeShapes/shapePainter.js.map +1 -0
  136. package/dist/canvas/nodeShapes/textPainter.js +55 -0
  137. package/dist/canvas/nodeShapes/textPainter.js.map +1 -0
  138. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  139. package/dist/canvas/paintCull.js +10 -11
  140. package/dist/canvas/paintCull.js.map +1 -1
  141. package/dist/canvas/pickWalk.js +52 -63
  142. package/dist/canvas/pickWalk.js.map +1 -1
  143. package/dist/canvas/poseRotation.js +11 -23
  144. package/dist/canvas/poseRotation.js.map +1 -1
  145. package/dist/canvas/renderDebugSnapshot.js +5 -5
  146. package/dist/canvas/renderSceneToPixels.js +3 -1
  147. package/dist/canvas/renderSceneToPixels.js.map +1 -1
  148. package/dist/canvas/sceneAdapter.js +66 -148
  149. package/dist/canvas/sceneAdapter.js.map +1 -1
  150. package/dist/canvas/sceneClipboard.js +112 -0
  151. package/dist/canvas/sceneClipboard.js.map +1 -0
  152. package/dist/canvas/sceneSlotWiring.js +4 -4
  153. package/dist/canvas/sceneSlotWiring.js.map +1 -1
  154. package/dist/canvas/sceneViewRender.js +39 -40
  155. package/dist/canvas/sceneViewRender.js.map +1 -1
  156. package/dist/canvas/useCanvasRenderer.js +14 -6
  157. package/dist/canvas/useCanvasRenderer.js.map +1 -1
  158. package/dist/canvas/useCanvasView.js +58 -0
  159. package/dist/canvas/useCanvasView.js.map +1 -0
  160. package/dist/canvas/useFrameLoop.js +35 -26
  161. package/dist/canvas/useFrameLoop.js.map +1 -1
  162. package/dist/canvas/useSceneLayerList.js +21 -0
  163. package/dist/canvas/useSceneLayerList.js.map +1 -0
  164. package/dist/clipboard.d.ts +10 -6
  165. package/dist/clone.d.ts +4 -3
  166. package/dist/core/adapters/arrayAdapter.js +48 -39
  167. package/dist/core/adapters/arrayAdapter.js.map +1 -1
  168. package/dist/core/device/index.js +5 -4
  169. package/dist/core/device/useDeviceProfile.js +38 -44
  170. package/dist/core/device/useDeviceProfile.js.map +1 -1
  171. package/dist/core/device/watchDevicePixelRatio.js +17 -0
  172. package/dist/core/device/watchDevicePixelRatio.js.map +1 -0
  173. package/dist/core/fillInPoseFrame.js.map +1 -1
  174. package/dist/core/geometry/poseDescriptor.js +21 -19
  175. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  176. package/dist/core/geometry/poseFrame.js +44 -0
  177. package/dist/core/geometry/poseFrame.js.map +1 -0
  178. package/dist/core/geometry/poseRotation.js.map +1 -1
  179. package/dist/core/geometry/regionHit.js +9 -10
  180. package/dist/core/geometry/regionHit.js.map +1 -1
  181. package/dist/core/geometry/unionBounds.js +31 -29
  182. package/dist/core/geometry/unionBounds.js.map +1 -1
  183. package/dist/core/isPlainObject.js +2 -11
  184. package/dist/core/ops/arrange.js +1 -0
  185. package/dist/core/ops/arrange.js.map +1 -1
  186. package/dist/core/ops/create.js +10 -5
  187. package/dist/core/ops/create.js.map +1 -1
  188. package/dist/core/ops/delete.js +12 -24
  189. package/dist/core/ops/delete.js.map +1 -1
  190. package/dist/core/ops/reorder/index.js +43 -40
  191. package/dist/core/ops/reorder/index.js.map +1 -1
  192. package/dist/core/ops/reorder/setChildOrder.js +34 -0
  193. package/dist/core/ops/reorder/setChildOrder.js.map +1 -0
  194. package/dist/core/paintKinds.js +5 -5
  195. package/dist/core/paintKinds.js.map +1 -1
  196. package/dist/core/scene/NodeProperties.js.map +1 -1
  197. package/dist/core/scene/appliedLog.js +37 -0
  198. package/dist/core/scene/appliedLog.js.map +1 -0
  199. package/dist/core/scene/arrivalWindow.js +101 -0
  200. package/dist/core/scene/arrivalWindow.js.map +1 -0
  201. package/dist/core/scene/derivedPath.js.map +1 -1
  202. package/dist/core/scene/historyFacade.js +84 -0
  203. package/dist/core/scene/historyFacade.js.map +1 -0
  204. package/dist/core/scene/kitOps.js +173 -0
  205. package/dist/core/scene/kitOps.js.map +1 -0
  206. package/dist/core/scene/layerStack.js +38 -0
  207. package/dist/core/scene/layerStack.js.map +1 -0
  208. package/dist/core/scene/lockGuard.js +37 -0
  209. package/dist/core/scene/lockGuard.js.map +1 -0
  210. package/dist/core/scene/nodeFnFields.js +5 -6
  211. package/dist/core/scene/nodeFnFields.js.map +1 -1
  212. package/dist/core/scene/nodeMemo.js +45 -19
  213. package/dist/core/scene/nodeMemo.js.map +1 -1
  214. package/dist/core/scene/nodeStore.js +126 -0
  215. package/dist/core/scene/nodeStore.js.map +1 -0
  216. package/dist/core/scene/pickability.js +6 -0
  217. package/dist/core/scene/pickability.js.map +1 -0
  218. package/dist/core/scene/poseFeed.js +38 -38
  219. package/dist/core/scene/poseFeed.js.map +1 -1
  220. package/dist/core/scene/poseOverrides.js +34 -38
  221. package/dist/core/scene/poseOverrides.js.map +1 -1
  222. package/dist/core/scene/renderOrder.js +84 -0
  223. package/dist/core/scene/renderOrder.js.map +1 -0
  224. package/dist/core/scene/scene.js +289 -866
  225. package/dist/core/scene/scene.js.map +1 -1
  226. package/dist/core/scene/serialization.js +68 -0
  227. package/dist/core/scene/serialization.js.map +1 -0
  228. package/dist/core/scene/treeOrder.js +13 -0
  229. package/dist/core/scene/treeOrder.js.map +1 -0
  230. package/dist/core/scene/types.js.map +1 -1
  231. package/dist/core/viewport/meanScale.js +1 -1
  232. package/dist/core/viewport/meanScale.js.map +1 -1
  233. package/dist/core/viewport/view.js +12 -12
  234. package/dist/core/viewport/view.js.map +1 -1
  235. package/dist/core/viewport/zoomBounds.js +10 -8
  236. package/dist/core/viewport/zoomBounds.js.map +1 -1
  237. package/dist/{cornerHandles-BCrDp_mH.d.ts → cornerHandles-CtCb8a3G.d.ts} +1 -1
  238. package/dist/debug/createDebugOverlayLayer.js +14 -14
  239. package/dist/debug/createDebugOverlayLayer.js.map +1 -1
  240. package/dist/debug/flag.js +2 -41
  241. package/dist/features/chrome-caps/useHoverTracking.js +22 -17
  242. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -1
  243. package/dist/features/focus/gateLayer.js +3 -4
  244. package/dist/features/focus/gateLayer.js.map +1 -1
  245. package/dist/features/images/imageCache.js +19 -9
  246. package/dist/features/images/imageCache.js.map +1 -1
  247. package/dist/features/ingestion/contentHandlers.js +14 -11
  248. package/dist/features/ingestion/contentHandlers.js.map +1 -1
  249. package/dist/features/ingestion/index.js +1 -1
  250. package/dist/features/ingestion/registerKitHandlers.js +7 -7
  251. package/dist/features/ingestion/weaselJsonHandler.js +17 -14
  252. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -1
  253. package/dist/features/meshPaint/lazyKind.js +201 -35
  254. package/dist/features/meshPaint/lazyKind.js.map +1 -1
  255. package/dist/features/meshPaint/meshPaint.js +82 -79
  256. package/dist/features/meshPaint/meshPaint.js.map +1 -1
  257. package/dist/features/minimap/createMinimapContribution.js +42 -42
  258. package/dist/features/minimap/layers.js +44 -62
  259. package/dist/features/minimap/layers.js.map +1 -1
  260. package/dist/features/parallax/createParallaxPlane.js +10 -14
  261. package/dist/features/parallax/createParallaxPlane.js.map +1 -1
  262. package/dist/features/paths/anchorEdits.js +19 -8
  263. package/dist/features/paths/anchorEdits.js.map +1 -1
  264. package/dist/features/paths/anchors.js +31 -26
  265. package/dist/features/paths/anchors.js.map +1 -1
  266. package/dist/features/paths/booleans.js +2 -2
  267. package/dist/features/paths/index.js +13 -11
  268. package/dist/features/paths/markerCommands.js +37 -36
  269. package/dist/features/paths/markerCommands.js.map +1 -1
  270. package/dist/features/paths/pathInWorld.js +19 -19
  271. package/dist/features/paths/pathInWorld.js.map +1 -1
  272. package/dist/features/paths/pathLayer.js.map +1 -1
  273. package/dist/features/paths/strokeToPath.js +40 -0
  274. package/dist/features/paths/strokeToPath.js.map +1 -0
  275. package/dist/features/paths/tessellate/stroke.js.map +1 -1
  276. package/dist/features/patterns/commandPaint.js +18 -0
  277. package/dist/features/patterns/commandPaint.js.map +1 -0
  278. package/dist/features/patterns/index.js +5 -17
  279. package/dist/features/patterns/index.js.map +1 -1
  280. package/dist/features/patterns/rasterizeTile.js +17 -0
  281. package/dist/features/patterns/rasterizeTile.js.map +1 -0
  282. package/dist/features/patterns/resolveSpec.js +52 -44
  283. package/dist/features/patterns/resolveSpec.js.map +1 -1
  284. package/dist/features/poseRun/usePoseRun.js +8 -3
  285. package/dist/features/poseRun/usePoseRun.js.map +1 -1
  286. package/dist/features/selection/SelectionContext.js +5 -0
  287. package/dist/features/selection/SelectionContext.js.map +1 -1
  288. package/dist/features/selection/overlay.js +18 -18
  289. package/dist/features/selection/overlay.js.map +1 -1
  290. package/dist/features/text/domOffsets.js +82 -0
  291. package/dist/features/text/domOffsets.js.map +1 -0
  292. package/dist/features/text/domRuns.js +103 -131
  293. package/dist/features/text/domRuns.js.map +1 -1
  294. package/dist/features/text/hitTest.js +5 -2
  295. package/dist/features/text/hitTest.js.map +1 -1
  296. package/dist/features/text/isTextData.js +8 -0
  297. package/dist/features/text/isTextData.js.map +1 -0
  298. package/dist/features/text/overlayDirection.js +15 -0
  299. package/dist/features/text/overlayDirection.js.map +1 -0
  300. package/dist/features/text/runs/rangeStyle.js +32 -34
  301. package/dist/features/text/runs/rangeStyle.js.map +1 -1
  302. package/dist/features/text/textCommand.js +34 -33
  303. package/dist/features/text/textCommand.js.map +1 -1
  304. package/dist/features/text/textToPath.js +40 -40
  305. package/dist/features/text/textToPath.js.map +1 -1
  306. package/dist/features/text/useSceneTextEdit.js +76 -82
  307. package/dist/features/text/useSceneTextEdit.js.map +1 -1
  308. package/dist/features/text/useTextEdit.js +184 -160
  309. package/dist/features/text/useTextEdit.js.map +1 -1
  310. package/dist/features/tiling/createTiledLayer.js +24 -22
  311. package/dist/features/tiling/createTiledLayer.js.map +1 -1
  312. package/dist/index.d.ts +11033 -7749
  313. package/dist/index.js +316 -309
  314. package/dist/input/keyState.js +42 -43
  315. package/dist/input/keyState.js.map +1 -1
  316. package/dist/input/useKeyModifiers.js +11 -0
  317. package/dist/input/useKeyModifiers.js.map +1 -0
  318. package/dist/interactions/actions/align/align.js +8 -8
  319. package/dist/interactions/actions/clipboard/clipboardOps.js +34 -32
  320. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  321. package/dist/interactions/actions/clipboard/materializePaste.js +10 -7
  322. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
  323. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -1
  324. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -1
  325. package/dist/interactions/actions/defaultCommitAdapter.js +20 -18
  326. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -1
  327. package/dist/interactions/actions/defaults/align.js +9 -10
  328. package/dist/interactions/actions/defaults/align.js.map +1 -1
  329. package/dist/interactions/actions/defaults/anchorEditing.js +59 -81
  330. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  331. package/dist/interactions/actions/defaults/areaSelect.js +35 -38
  332. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -1
  333. package/dist/interactions/actions/defaults/clipboard.js +26 -10
  334. package/dist/interactions/actions/defaults/clipboard.js.map +1 -1
  335. package/dist/interactions/actions/defaults/clone.js +44 -60
  336. package/dist/interactions/actions/defaults/clone.js.map +1 -1
  337. package/dist/interactions/actions/defaults/copySubtree.js +40 -0
  338. package/dist/interactions/actions/defaults/copySubtree.js.map +1 -0
  339. package/dist/interactions/actions/defaults/distribute.js +14 -13
  340. package/dist/interactions/actions/defaults/distribute.js.map +1 -1
  341. package/dist/interactions/actions/defaults/duplicate.js +17 -57
  342. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  343. package/dist/interactions/actions/defaults/editAnchors.js +18 -18
  344. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -1
  345. package/dist/interactions/actions/defaults/flip.js +52 -46
  346. package/dist/interactions/actions/defaults/flip.js.map +1 -1
  347. package/dist/interactions/actions/defaults/group.js +43 -48
  348. package/dist/interactions/actions/defaults/group.js.map +1 -1
  349. package/dist/interactions/actions/defaults/ingest.js +35 -33
  350. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  351. package/dist/interactions/actions/defaults/insert.js +50 -51
  352. package/dist/interactions/actions/defaults/insert.js.map +1 -1
  353. package/dist/interactions/actions/defaults/insertPathAnchor.js +7 -7
  354. package/dist/interactions/actions/defaults/lassoSelect.js +67 -70
  355. package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -1
  356. package/dist/interactions/actions/defaults/move.js +267 -249
  357. package/dist/interactions/actions/defaults/move.js.map +1 -1
  358. package/dist/interactions/actions/defaults/nudge.js +40 -68
  359. package/dist/interactions/actions/defaults/nudge.js.map +1 -1
  360. package/dist/interactions/actions/defaults/nudgeSteps.js +37 -0
  361. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -0
  362. package/dist/interactions/actions/defaults/reorder.js +2 -0
  363. package/dist/interactions/actions/defaults/reorder.js.map +1 -1
  364. package/dist/interactions/actions/defaults/resize.js +104 -98
  365. package/dist/interactions/actions/defaults/resize.js.map +1 -1
  366. package/dist/interactions/actions/defaults/rotate.js +111 -110
  367. package/dist/interactions/actions/defaults/rotate.js.map +1 -1
  368. package/dist/interactions/actions/defaults/setFill.js +7 -7
  369. package/dist/interactions/actions/defaults/setFillOpacity.js +4 -4
  370. package/dist/interactions/actions/defaults/setStroke.js +12 -12
  371. package/dist/interactions/actions/defaults/setStrokeOpacity.js +6 -6
  372. package/dist/interactions/actions/defaults/sliceOps.js +19 -19
  373. package/dist/interactions/actions/defaults/viewportDragPan.js +37 -26
  374. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -1
  375. package/dist/interactions/actions/edit-anchors/geometry.js +28 -23
  376. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  377. package/dist/interactions/actions/flip/helpers.js +30 -17
  378. package/dist/interactions/actions/flip/helpers.js.map +1 -1
  379. package/dist/interactions/actions/hitSelection.js +8 -0
  380. package/dist/interactions/actions/hitSelection.js.map +1 -0
  381. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +14 -18
  382. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -1
  383. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +5 -5
  384. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -1
  385. package/dist/interactions/actions/move/behaviors/snapToContainer.js +32 -21
  386. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  387. package/dist/interactions/actions/move/gestureAdapter.js +32 -15
  388. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -1
  389. package/dist/interactions/actions/move/landedDescendants.js +33 -0
  390. package/dist/interactions/actions/move/landedDescendants.js.map +1 -0
  391. package/dist/interactions/actions/outlines/createOutlines.js +18 -18
  392. package/dist/interactions/actions/poseDescriptorDep.js +16 -4
  393. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -1
  394. package/dist/interactions/actions/poseFrame.js +11 -6
  395. package/dist/interactions/actions/poseFrame.js.map +1 -1
  396. package/dist/interactions/actions/previewOverrides.js +5 -5
  397. package/dist/interactions/actions/previewOverrides.js.map +1 -1
  398. package/dist/interactions/actions/selectionSubtree.js +69 -0
  399. package/dist/interactions/actions/selectionSubtree.js.map +1 -0
  400. package/dist/interactions/actions/useStandardActions.js +66 -62
  401. package/dist/interactions/actions/useStandardActions.js.map +1 -1
  402. package/dist/interactions/gestures/dragGesture/dragGesture.js +4 -7
  403. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -1
  404. package/dist/interactions/gestures/dragGesture/dragPointOf.js +23 -0
  405. package/dist/interactions/gestures/dragGesture/dragPointOf.js.map +1 -0
  406. package/dist/interactions/gestures/handleDrag/handleDrag.js +21 -26
  407. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -1
  408. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +8 -6
  409. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -1
  410. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +8 -4
  411. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -1
  412. package/dist/{math-Drrw4ewZ.d.ts → math-J-ACHyEg.d.ts} +1 -2
  413. package/dist/math.d.ts +2 -3
  414. package/dist/move.d.ts +12 -11
  415. package/dist/{originProjection-DEklpDc_.d.ts → originProjection-gHnOup4e.d.ts} +1 -1
  416. package/dist/{registerProgram-BMZRDgrh.d.ts → registerProgram-T9S_PfAX.d.ts} +18 -7
  417. package/dist/renderer/DrawCommand.js.map +1 -1
  418. package/dist/renderer/WeaselRenderer.js +75 -73
  419. package/dist/renderer/WeaselRenderer.js.map +1 -1
  420. package/dist/renderer/cache/GLImageCache.js +15 -5
  421. package/dist/renderer/cache/GLImageCache.js.map +1 -1
  422. package/dist/renderer/cache/GLMeshCache.js +23 -23
  423. package/dist/renderer/cache/GLMeshCache.js.map +1 -1
  424. package/dist/renderer/cache/GLTextureCache.js +18 -1
  425. package/dist/renderer/cache/GLTextureCache.js.map +1 -1
  426. package/dist/renderer/cache/cache.js.map +1 -1
  427. package/dist/renderer/cache/markerCommandCache.js.map +1 -1
  428. package/dist/renderer/cache/strokeMeshCache.js.map +1 -1
  429. package/dist/renderer/cullDrawCommands.js +11 -11
  430. package/dist/renderer/draw/batch.js +133 -0
  431. package/dist/renderer/draw/batch.js.map +1 -0
  432. package/dist/renderer/draw/clip.js +89 -0
  433. package/dist/renderer/draw/clip.js.map +1 -0
  434. package/dist/renderer/draw/customShader.js +230 -0
  435. package/dist/renderer/draw/customShader.js.map +1 -0
  436. package/dist/renderer/draw/drawTriangles.js +8 -0
  437. package/dist/renderer/draw/drawTriangles.js.map +1 -0
  438. package/dist/renderer/draw/effects.js +28 -0
  439. package/dist/renderer/draw/effects.js.map +1 -0
  440. package/dist/renderer/draw/flushBatch.js +35 -0
  441. package/dist/renderer/draw/flushBatch.js.map +1 -0
  442. package/dist/renderer/draw/gradient.js +90 -0
  443. package/dist/renderer/draw/gradient.js.map +1 -0
  444. package/dist/renderer/draw/image.js +38 -0
  445. package/dist/renderer/draw/image.js.map +1 -0
  446. package/dist/renderer/draw/mesh.js +16 -0
  447. package/dist/renderer/draw/mesh.js.map +1 -0
  448. package/dist/renderer/draw/paintBind.js +70 -0
  449. package/dist/renderer/draw/paintBind.js.map +1 -0
  450. package/dist/renderer/draw/pathPaint.js +142 -0
  451. package/dist/renderer/draw/pathPaint.js.map +1 -0
  452. package/dist/renderer/draw/scratchPass.js +83 -0
  453. package/dist/renderer/draw/scratchPass.js.map +1 -0
  454. package/dist/renderer/draw/stencil.js +28 -0
  455. package/dist/renderer/draw/stencil.js.map +1 -0
  456. package/dist/renderer/draw/text.js +167 -0
  457. package/dist/renderer/draw/text.js.map +1 -0
  458. package/dist/renderer/draw/uniforms.js +77 -0
  459. package/dist/renderer/draw/uniforms.js.map +1 -0
  460. package/dist/renderer/draw.js +60 -1116
  461. package/dist/renderer/draw.js.map +1 -1
  462. package/dist/renderer/effects/EffectTargets.js +3 -0
  463. package/dist/renderer/effects/EffectTargets.js.map +1 -1
  464. package/dist/renderer/effects/composite.js +7 -5
  465. package/dist/renderer/effects/composite.js.map +1 -1
  466. package/dist/renderer/index.js +18 -17
  467. package/dist/renderer/math/color.js +63 -83
  468. package/dist/renderer/math/color.js.map +1 -1
  469. package/dist/renderer/math/mat3.js +15 -11
  470. package/dist/renderer/math/mat3.js.map +1 -1
  471. package/dist/renderer/math/viewToMat3.js +1 -1
  472. package/dist/renderer/math/viewToMat3.js.map +1 -1
  473. package/dist/renderer/shaders/ShaderProgram.js +13 -13
  474. package/dist/renderer/shaders/ShaderProgram.js.map +1 -1
  475. package/dist/renderer/shaders/glyphPaint.js +3 -3
  476. package/dist/renderer/shaders/glyphPaint.js.map +1 -1
  477. package/dist/renderer/shaders/gradFill.js +2 -1
  478. package/dist/renderer/shaders/gradFill.js.map +1 -1
  479. package/dist/renderer/shaders/pathFill.js +2 -1
  480. package/dist/renderer/shaders/pathFill.js.map +1 -1
  481. package/dist/renderer/shaders/patternFill.js +2 -1
  482. package/dist/renderer/shaders/patternFill.js.map +1 -1
  483. package/dist/renderer/shaders/registerProgram.js.map +1 -1
  484. package/dist/renderer/strokeLengths.js.map +1 -1
  485. package/dist/renderer/textures/registerTexture.js +25 -5
  486. package/dist/renderer/textures/registerTexture.js.map +1 -1
  487. package/dist/renderer.d.ts +16 -15
  488. package/dist/renderer.js +17 -16
  489. package/dist/resize.d.ts +5 -6
  490. package/dist/resize.js +5 -5
  491. package/dist/style.css +1 -1
  492. package/dist/test-hook/install.js +12 -6
  493. package/dist/test-hook/install.js.map +1 -1
  494. package/dist/{test-seams-CuIxe0xY.d.ts → test-seams-DM2B87-g.d.ts} +4 -4
  495. package/dist/test-seams.d.ts +2 -2
  496. package/dist/tools/builtin/ellipse/useEllipseTool.js +1 -0
  497. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -1
  498. package/dist/tools/builtin/hand/useHandTool.js +1 -0
  499. package/dist/tools/builtin/hand/useHandTool.js.map +1 -1
  500. package/dist/tools/builtin/lasso/useLassoTool.js +11 -11
  501. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -1
  502. package/dist/tools/builtin/line/useLineTool.js +1 -0
  503. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  504. package/dist/tools/builtin/pen/usePenTool.js +153 -103
  505. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  506. package/dist/tools/builtin/pencil/usePencilTool.js +1 -0
  507. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -1
  508. package/dist/tools/builtin/polygon/usePolygonTool.js +13 -8
  509. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  510. package/dist/tools/builtin/rect/useRectTool.js +1 -0
  511. package/dist/tools/builtin/rect/useRectTool.js.map +1 -1
  512. package/dist/tools/builtin/select/selectionContributions.js +24 -23
  513. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  514. package/dist/tools/builtin/select/useSelectTool.js +51 -48
  515. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  516. package/dist/tools/builtin/shared/pointerFollower.js +17 -0
  517. package/dist/tools/builtin/shared/pointerFollower.js.map +1 -0
  518. package/dist/tools/builtin/slice/useSliceTool.js +49 -54
  519. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  520. package/dist/tools/builtin/star/useStarTool.js +22 -16
  521. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  522. package/dist/tools/builtin/text/useTextTool.js +1 -0
  523. package/dist/tools/builtin/text/useTextTool.js.map +1 -1
  524. package/dist/tools/useKeybindings.js +14 -30
  525. package/dist/tools/useKeybindings.js.map +1 -1
  526. package/dist/{types-B_9g6hMM.d.ts → types-B4iJRHC3.d.ts} +5 -1
  527. package/dist/{types-A37hYkeR.d.ts → types-k-5Oqh-U.d.ts} +31 -7
  528. package/dist/util/color.js +3 -3
  529. package/dist/util/color.js.map +1 -1
  530. package/dist/util/paint.js.map +1 -1
  531. package/dist/version.js +1 -1
  532. package/package.json +20 -18
  533. package/dist/autoPoseDescriptor-vCdt55xm.d.ts +0 -27
  534. package/dist/builtins-C-VgUlWI.d.ts +0 -4514
  535. package/dist/core/isPlainObject.js.map +0 -1
  536. package/dist/debug/flag.js.map +0 -1
  537. package/dist/interactions/actions/defaults/freshNodeId.js +0 -10
  538. package/dist/interactions/actions/defaults/freshNodeId.js.map +0 -1
  539. package/dist/renderer/shaders/imageFill.js +0 -14
  540. package/dist/renderer/shaders/imageFill.js.map +0 -1
  541. package/dist/tools/prefs.js +0 -62
  542. package/dist/tools/prefs.js.map +0 -1
@@ -1,22 +1,23 @@
1
1
  import { resolveColor as e, rgbaToHex as t } from "../../renderer/math/color.js";
2
- import { isValidPatch as n } from "./surface.js";
3
- import { bakeMesh as r, meshBounds as i } from "./bake.js";
4
- import { MeshBakeCache as a, meshBakeSize as o } from "./bakeCache.js";
5
- import { MESH_FRAG_SRC as s, MESH_PROGRAM_ID as c, MESH_VERT_SRC as l } from "./meshShader.js";
6
- import { oklabToOklch as u, oklabToSrgbU8 as d, oklchToOklab as f, srgbFloatToOklab as p } from "@weasel-js/paint";
2
+ import { mat3 as n } from "../../renderer/math/mat3.js";
3
+ import { isValidPatch as r } from "./surface.js";
4
+ import { bakeMesh as i, meshBounds as a } from "./bake.js";
5
+ import { MeshBakeCache as o, meshBakeSize as s } from "./bakeCache.js";
6
+ import { MESH_FRAG_SRC as c, MESH_PROGRAM_ID as l, MESH_VERT_SRC as u } from "./meshShader.js";
7
+ import { oklabToOklch as d, oklabToSrgbU8 as f, oklchToOklab as p, srgbFloatToOklab as m } from "@weasel-js/paint";
7
8
  //#region src/features/meshPaint/meshPaint.ts
8
- var m = "mesh-gradient";
9
- function h(e) {
10
- return e != null && e.fill === m;
11
- }
9
+ var h = "mesh-gradient";
12
10
  function g(e) {
13
- return e;
11
+ return e != null && e.fill === h;
14
12
  }
15
13
  function _(e) {
16
14
  return e;
17
15
  }
18
- function v(n, r, i, a) {
19
- let [o, s, c, l] = e(n), [m, h, g] = p(o, s, c), [, _, v] = u(m, h, g), [y, b, x] = f(Math.min(1, Math.max(0, m + r)), Math.max(0, _ * i), v + a * Math.PI / 180), [S, C, w] = d(y, b, x);
16
+ function v(e) {
17
+ return e;
18
+ }
19
+ function y(n, r, i, a) {
20
+ let [o, s, c, l] = e(n), [u, h, g] = m(o, s, c), [, _, v] = d(u, h, g), [y, b, x] = p(Math.min(1, Math.max(0, u + r)), Math.max(0, _ * i), v + a * Math.PI / 180), [S, C, w] = f(y, b, x);
20
21
  return t([
21
22
  S / 255,
22
23
  C / 255,
@@ -24,7 +25,7 @@ function v(n, r, i, a) {
24
25
  l
25
26
  ]);
26
27
  }
27
- function y(e) {
28
+ function b(e) {
28
29
  let t = [
29
30
  {
30
31
  x: 0,
@@ -54,20 +55,20 @@ function y(e) {
54
55
  });
55
56
  }
56
57
  return {
57
- fill: m,
58
+ fill: h,
58
59
  patches: [{
59
60
  points: n,
60
61
  colors: [
61
62
  e,
62
- v(e, .14, .85, 0),
63
- v(e, -.06, 1.1, 38),
64
- v(e, -.16, 1, -22)
63
+ y(e, .14, .85, 0),
64
+ y(e, -.06, 1.1, 38),
65
+ y(e, -.16, 1, -22)
65
66
  ]
66
67
  }],
67
68
  units: "bounds"
68
69
  };
69
70
  }
70
- function b(e, t, n, r) {
71
+ function x(e, t, n, r) {
71
72
  let i = [
72
73
  {
73
74
  x: e,
@@ -106,27 +107,27 @@ function b(e, t, n, r) {
106
107
  ]
107
108
  };
108
109
  }
109
- function x(e) {
110
+ function S(e) {
110
111
  let t = [...e].sort((e, t) => e.offset - t.offset);
111
112
  if (t.length === 1 && t.push({
112
113
  offset: 1,
113
114
  color: t[0].color
114
- }), t.length === 0) return y("#000000ff");
115
+ }), t.length === 0) return b("#000000ff");
115
116
  let n = [];
116
117
  for (let e = 0; e < t.length - 1; e++) {
117
118
  let r = t[e], i = t[e + 1];
118
- i.offset > r.offset && n.push(b(r.offset, i.offset, r.color, i.color));
119
+ i.offset > r.offset && n.push(x(r.offset, i.offset, r.color, i.color));
119
120
  }
120
121
  return {
121
- fill: m,
122
+ fill: h,
122
123
  patches: n,
123
124
  units: "bounds"
124
125
  };
125
126
  }
126
- function S(e) {
127
- let t = e.patches.filter(n);
127
+ function C(e) {
128
+ let t = e.patches.filter(r);
128
129
  if (t.length === 0) return [];
129
- let r = t.flatMap((e) => [e.points[0].x, e.points[3].x]), i = Math.min(...r), a = Math.max(...r) - i, o = (e) => a > 0 ? (e - i) / a : 0, s = [];
130
+ let n = t.flatMap((e) => [e.points[0].x, e.points[3].x]), i = Math.min(...n), a = Math.max(...n) - i, o = (e) => a > 0 ? (e - i) / a : 0, s = [];
130
131
  for (let e of t) for (let [t, n] of [[e.points[0], e.colors[0]], [e.points[3], e.colors[1]]]) {
131
132
  let e = o(t.x);
132
133
  s.some((t) => t.offset === e && t.color === n) || s.push({
@@ -136,101 +137,103 @@ function S(e) {
136
137
  }
137
138
  return s.sort((e, t) => e.offset - t.offset);
138
139
  }
139
- function C(e, t) {
140
+ function w(e, t) {
140
141
  return e.patches.map((e) => ({
141
142
  ...e,
142
143
  points: e.points.map(t)
143
144
  }));
144
145
  }
145
- var w = /* @__PURE__ */ new WeakMap();
146
- function T(e) {
147
- let t = w.get(e.resources);
146
+ var T = /* @__PURE__ */ new WeakMap(), E = /* @__PURE__ */ new WeakMap();
147
+ function D(e) {
148
+ let t = E.get(e.resources);
148
149
  if (!t) {
149
- let n = e.gl, r = new a((e) => n.deleteTexture(e.texture));
150
+ let n = e.gl, r = new o((e) => n.deleteTexture(e));
150
151
  e.resources.onRelease(() => {
151
- r.clear(), w.delete(e.resources);
152
- }), w.set(e.resources, r), t = r;
152
+ r.clear(), E.delete(e.resources);
153
+ }), E.set(e.resources, r), t = r;
153
154
  }
154
155
  return t;
155
156
  }
156
- function E(e, t, n) {
157
+ function O(e, t, n) {
157
158
  let r = e.spaceToDevice(t.units);
158
159
  return r ? Math.max(n.width * Math.hypot(r[0], r[1]), n.height * Math.hypot(r[3], r[4])) : NaN;
159
160
  }
160
- function D(e, t) {
161
- let n = i(t.patches);
161
+ function k(e, t) {
162
+ let n = a(t.patches);
162
163
  if (!n) return null;
163
- let a = o(E(e, t, n), e.maxTextureSize), s = T(e), c = s.get(t, a);
164
- if (c) return c;
165
- let l = r(t.patches, t.interpolate ?? "rgb", a);
166
- if (!l) return null;
167
- let u = e.gl, d = u.createTexture();
168
- if (!d) return null;
169
- u.bindTexture(u.TEXTURE_2D, d), u.texParameteri(u.TEXTURE_2D, u.TEXTURE_MIN_FILTER, u.LINEAR), u.texParameteri(u.TEXTURE_2D, u.TEXTURE_MAG_FILTER, u.LINEAR), u.texParameteri(u.TEXTURE_2D, u.TEXTURE_WRAP_S, u.CLAMP_TO_EDGE), u.texParameteri(u.TEXTURE_2D, u.TEXTURE_WRAP_T, u.CLAMP_TO_EDGE), u.texImage2D(u.TEXTURE_2D, 0, u.RGBA, l.size, l.size, 0, u.RGBA, u.UNSIGNED_BYTE, l.pixels), u.bindTexture(u.TEXTURE_2D, null);
170
- let f = {
171
- texture: d,
172
- baked: l
164
+ let r = s(O(e, t, n), e.maxTextureSize), o = D(e), c = T.get(t) ?? t, l = o.get(c, r);
165
+ if (l) return {
166
+ texture: l,
167
+ box: n
173
168
  };
174
- return s.set(t, a, f), f;
169
+ let u = i(t.patches, t.interpolate ?? "rgb", r);
170
+ if (!u) return null;
171
+ let d = e.gl, f = d.createTexture();
172
+ return f ? (d.bindTexture(d.TEXTURE_2D, f), d.texParameteri(d.TEXTURE_2D, d.TEXTURE_MIN_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_2D, d.TEXTURE_MAG_FILTER, d.LINEAR), d.texParameteri(d.TEXTURE_2D, d.TEXTURE_WRAP_S, d.CLAMP_TO_EDGE), d.texParameteri(d.TEXTURE_2D, d.TEXTURE_WRAP_T, d.CLAMP_TO_EDGE), d.texImage2D(d.TEXTURE_2D, 0, d.RGBA, u.size, u.size, 0, d.RGBA, d.UNSIGNED_BYTE, u.pixels), d.bindTexture(d.TEXTURE_2D, null), o.set(c, r, f), {
173
+ texture: f,
174
+ box: n
175
+ }) : null;
175
176
  }
176
- function O(e, t) {
177
- let r = g(t);
178
- if (!r.patches.some(n)) return null;
179
- let i = e.spaceInverse(r.units);
180
- if (!i) return null;
181
- let a = e.program(c);
177
+ function A(e, t) {
178
+ let i = _(t);
179
+ if (!i.patches.some(r)) return null;
180
+ let a = e.spaceInverse(i.units);
182
181
  if (!a) return null;
183
- let o = D(e, r);
182
+ let o = e.program(l);
184
183
  if (!o) return null;
185
- let s = e.gl;
186
- s.useProgram(a.handle), e.setProjAndModel(a), s.uniformMatrix3fv(a.uniform("u_worldInv"), !1, i), s.activeTexture(s.TEXTURE0), s.bindTexture(s.TEXTURE_2D, o.texture), s.uniform1i(a.uniform("u_sampler"), 0);
187
- let { box: l } = o.baked;
188
- return s.uniform2f(a.uniform("u_meshOrigin"), l.x, l.y), s.uniform2f(a.uniform("u_meshSize"), l.width, l.height), s.uniform1f(a.uniform("u_opacity"), r.opacity ?? 1), s.uniform1f(a.uniform("u_alpha"), e.alpha), a;
184
+ let s = k(e, i);
185
+ if (!s) return null;
186
+ let c = e.gl;
187
+ c.useProgram(o.handle), e.setProjAndModel(o), c.uniformMatrix3fv(o.uniform("u_worldInv"), !1, n.toUniform(a)), c.activeTexture(c.TEXTURE0), c.bindTexture(c.TEXTURE_2D, s.texture), c.uniform1i(o.uniform("u_sampler"), 0);
188
+ let { box: u } = s;
189
+ return c.uniform2f(o.uniform("u_meshOrigin"), u.x, u.y), c.uniform2f(o.uniform("u_meshSize"), u.width, u.height), c.uniform1f(o.uniform("u_opacity"), i.opacity ?? 1), c.uniform1f(o.uniform("u_alpha"), e.alpha), o;
189
190
  }
190
- var k = {
191
- id: m,
192
- programs: { [c]: {
193
- vert: l,
194
- frag: s
191
+ var j = {
192
+ id: h,
193
+ programs: { [l]: {
194
+ vert: u,
195
+ frag: c
195
196
  } },
196
197
  label: "Mesh",
197
198
  icon: "paintMesh",
198
- seed: (e) => _(y(e)),
199
- colorOf: (e) => g(e).patches?.[0]?.colors?.[0],
200
- stopsOf: (e) => S(g(e)),
201
- fromStops: (e) => _(x(e)),
202
- bind: O,
199
+ seed: (e) => v(b(e)),
200
+ colorOf: (e) => _(e).patches?.[0]?.colors?.[0],
201
+ stopsOf: (e) => C(_(e)),
202
+ fromStops: (e) => v(S(e)),
203
+ bind: A,
203
204
  inPoseFrame: (e, t) => {
204
- let n = g(e);
205
- return n.units === "bounds" ? _({
205
+ let n = _(e);
206
+ if (n.units !== "bounds") return e;
207
+ let r = v({
206
208
  ...n,
207
- patches: C(n, (e) => ({
209
+ patches: w(n, (e) => ({
208
210
  x: t.x + e.x * t.width,
209
211
  y: t.y + e.y * t.height
210
212
  })),
211
213
  units: "local"
212
- }) : e;
214
+ });
215
+ return T.set(r, e), r;
213
216
  },
214
217
  toBoundsFrame: (e, t) => {
215
- let n = g(e);
216
- return n.units === "bounds" || t.width === 0 || t.height === 0 ? e : _({
218
+ let n = _(e);
219
+ return n.units === "bounds" || t.width === 0 || t.height === 0 ? e : v({
217
220
  ...n,
218
- patches: C(n, (e) => ({
221
+ patches: w(n, (e) => ({
219
222
  x: (e.x - t.x) / t.width,
220
223
  y: (e.y - t.y) / t.height
221
224
  })),
222
225
  units: "bounds"
223
226
  });
224
227
  },
225
- toSvg: (e, t) => A(e, g(t))
228
+ toSvg: (e, t) => M(e, _(t))
226
229
  };
227
- function A(e, t) {
228
- return `<wzl:meshGradient id="${e}" gradientUnits="${t.units === "bounds" ? "objectBoundingBox" : "userSpaceOnUse"}"${t.interpolate && t.interpolate !== "rgb" ? ` interpolate="${t.interpolate}"` : ""}>${t.patches.map((e) => `<wzl:patch points="${e.points.map((e) => `${j(e.x)},${j(e.y)}`).join(" ")}" colors="${e.colors.join(" ")}"/>`).join("")}</wzl:meshGradient>`;
230
+ function M(e, t) {
231
+ return `<wzl:meshGradient id="${e}" gradientUnits="${t.units === "bounds" ? "objectBoundingBox" : "userSpaceOnUse"}"${t.interpolate && t.interpolate !== "rgb" ? ` interpolate="${t.interpolate}"` : ""}>${t.patches.map((e) => `<wzl:patch points="${e.points.map((e) => `${N(e.x)},${N(e.y)}`).join(" ")}" colors="${e.colors.join(" ")}"/>`).join("")}</wzl:meshGradient>`;
229
232
  }
230
- function j(e) {
233
+ function N(e) {
231
234
  return String(Number.isInteger(e) ? e : Number(e.toFixed(4)));
232
235
  }
233
236
  //#endregion
234
- export { m as MESH_GRADIENT_KIND, h as isMeshGradientFill, x as meshFromStops, k as meshGradientKind, A as meshGradientXml, S as meshStops, y as seedMeshPatch };
237
+ export { h as MESH_GRADIENT_KIND, g as isMeshGradientFill, S as meshFromStops, j as meshGradientKind, M as meshGradientXml, C as meshStops, b as seedMeshPatch };
235
238
 
236
239
  //# sourceMappingURL=meshPaint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"meshPaint.js","names":["MESH_GRADIENT_KIND","isMeshGradientFill","fill","asMesh","asFill","mesh","shifted","r","g","b","a","resolveColor","color","L","A","B","srgbFloatToOklab","C","h","oklabToOklch","nL","nA","nB","oklchToOklab","dL","cScale","dHueDeg","nr","ng","nb","oklabToSrgbU8","rgbaToHex","seedMeshPatch","corners","points","i","nx","ny","bandPatch","x0","x1","left","right","meshFromStops","sorted","stops","patches","meshStops","valid","isValidPatch","xs","p","lo","span","offsetOf","x","patch","point","offset","s","mapPatches","move","CACHES","cacheFor","cache","ctx","gl","made","MeshBakeCache","entry","devicePixelsOf","m","box","bakeFor","meshBounds","size","meshBakeSize","hit","baked","bakeMesh","texture","bindMesh","inverse","program","MESH_PROGRAM_ID","meshGradientKind","MESH_VERT_SRC","MESH_FRAG_SRC","paint","meshGradientXml","id","trim","n"],"sources":["../../../src/features/meshPaint/meshPaint.ts"],"sourcesContent":["/**\n * The `mesh-gradient` paint kind — PDF's shading types 6 and 7 as a registered\n * paint.\n *\n * A mesh gradient is a set of curved quadrilateral patches, each with a color\n * at every corner. It is the paint SVG tried to standardize as\n * `<meshgradient>` and abandoned, and the one PDF has had since 1993; what it\n * buys over the three gradients is a color field that bends, so a highlight\n * can follow a form instead of running straight across it.\n *\n * This is a registered kind rather than a sixth branch in the renderer, and\n * deliberately: it uses only the slots `registerPaintKind` gives a consumer, so\n * whatever it can do, a consumer's own kind can do too. Its one concession is\n * living in this package, because that is where the shader registry is.\n *\n * `docs/proposals/2026-09-17-paint-kinds-beyond-svg.md` is the design.\n */\n\nimport type { GradStop } from '@weasel-js/paint';\nimport type { PaintBindContext, PaintKindEntry, PaintProgram, PaintResources } from '../../core/paintKinds';\nimport { resolveColor, rgbaToHex } from '../../renderer/math/color';\nimport { oklabToOklch, oklabToSrgbU8, oklchToOklab, srgbFloatToOklab } from '@weasel-js/paint';\nimport type { ColorSpace, FillStyle, GradientUnits } from '@weasel-js/paint';\nimport type { FillPoseBox } from '../../core/fillInPoseFrame';\nimport { bakeMesh, meshBounds, type BakedMesh, type MeshBox } from './bake';\nimport { MeshBakeCache, meshBakeSize } from './bakeCache';\nimport { isValidPatch, type MeshPatch, type MeshPoint } from './surface';\nimport { MESH_FRAG_SRC, MESH_PROGRAM_ID, MESH_VERT_SRC } from './meshShader';\n\nexport type { MeshPatch, MeshPoint } from './surface';\n\n/**\n * A mesh gradient paint.\n *\n * `patches` are in the space `units` names, the same way a gradient's\n * geometry is — under `'bounds'` every point is a fraction of the painted\n * node's box, which is what lets the paint survive a resize.\n *\n * `interpolate` is the space corner colors blend through, matching the three\n * gradients. It is more visible here than there: a mesh blends in two\n * directions at once, so an sRGB blend's muddy middle covers area rather than\n * a line.\n */\nexport interface MeshGradientFill {\n fill: 'mesh-gradient';\n patches: MeshPatch[];\n units?: GradientUnits;\n interpolate?: ColorSpace;\n opacity?: number;\n}\n\n/** The kind's id, as `FillStyle['fill']` carries it. */\nexport const MESH_GRADIENT_KIND = 'mesh-gradient';\n\n/** A mesh paint, narrowed. */\nexport function isMeshGradientFill(fill: FillStyle | null | undefined): fill is FillStyle & MeshGradientFill {\n // `FillStyle`'s discriminant stays closed over the built-in kinds — see\n // `asPaint` — so a registered kind reads it widened.\n return fill != null && (fill.fill as string | undefined) === MESH_GRADIENT_KIND;\n}\n\nfunction asMesh(fill: FillStyle): MeshGradientFill {\n return fill as unknown as MeshGradientFill;\n}\n\n// `asPaint`'s cast, kept local: this module must import nothing from the\n// registry, whose state `lazyKind`'s self-contained copy would duplicate.\nfunction asFill(mesh: MeshGradientFill): FillStyle {\n return mesh as unknown as FillStyle;\n}\n\n/**\n * `color` moved in OKLCh — lightness, chroma and hue by the given deltas, with\n * its alpha kept. The seed's corners come from one color, and they have to\n * differ enough to read as a mesh rather than as a flat fill.\n */\nfunction shifted(color: string, dL: number, cScale: number, dHueDeg: number): string {\n const [r, g, b, a] = resolveColor(color);\n const [L, A, B] = srgbFloatToOklab(r, g, b);\n const [, C, h] = oklabToOklch(L, A, B);\n const [nL, nA, nB] = oklchToOklab(\n Math.min(1, Math.max(0, L + dL)),\n Math.max(0, C * cScale),\n h + (dHueDeg * Math.PI) / 180,\n );\n const [nr, ng, nb] = oklabToSrgbU8(nL, nA, nB);\n return rgbaToHex([nr / 255, ng / 255, nb / 255, a]);\n}\n\n/** A one-patch square covering the unit box, its four corners four readings of\n * `color` — a mesh seeded from a solid has to show *something* curved, or\n * switching kind looks like nothing happened. */\nexport function seedMeshPatch(color: string): MeshGradientFill {\n const corners: MeshPoint[] = [\n { x: 0, y: 0 }, { x: 1, y: 0 }, { x: 1, y: 1 }, { x: 0, y: 1 },\n ];\n const points: MeshPoint[] = [];\n for (let i = 0; i < 4; i++) {\n const a = corners[i];\n const b = corners[(i + 1) % 4];\n // Bow each edge outward by an eighth, so the seed is a patch and not a\n // rectangle wearing one's clothes.\n const nx = (b.y - a.y) * 0.125;\n const ny = -(b.x - a.x) * 0.125;\n points.push(\n a,\n { x: a.x + (b.x - a.x) / 3 + nx, y: a.y + (b.y - a.y) / 3 + ny },\n { x: a.x + (2 * (b.x - a.x)) / 3 + nx, y: a.y + (2 * (b.y - a.y)) / 3 + ny },\n );\n }\n return {\n fill: MESH_GRADIENT_KIND,\n patches: [{\n points,\n colors: [\n color,\n shifted(color, 0.14, 0.85, 0),\n shifted(color, -0.06, 1.1, 38),\n shifted(color, -0.16, 1.0, -22),\n ],\n }],\n units: 'bounds',\n };\n}\n\n/** The straight-edged patch covering `[x0, x1] × [0, 1]`, in walk order. */\nfunction bandPatch(x0: number, x1: number, left: string, right: string): MeshPatch {\n const corners: MeshPoint[] = [{ x: x0, y: 0 }, { x: x1, y: 0 }, { x: x1, y: 1 }, { x: x0, y: 1 }];\n const points: MeshPoint[] = [];\n for (let i = 0; i < 4; i++) {\n const a = corners[i];\n const b = corners[(i + 1) % 4];\n points.push(a, { x: a.x + (b.x - a.x) / 3, y: a.y + (b.y - a.y) / 3 }, { x: a.x + (2 * (b.x - a.x)) / 3, y: a.y + (2 * (b.y - a.y)) / 3 });\n }\n return { points, colors: [left, right, right, left] };\n}\n\n/**\n * A stop list as a mesh: one full-height band per gap between neighboring\n * stops, colored left to right. The bands blend exactly the way the ramp\n * does, so a horizontal gradient survives the switch unchanged. A zero-width\n * gap is a hard break and gets no band.\n */\nexport function meshFromStops(stops: readonly GradStop[]): MeshGradientFill {\n const sorted = [...stops].sort((a, b) => a.offset - b.offset);\n if (sorted.length === 1) sorted.push({ offset: 1, color: sorted[0].color });\n if (sorted.length === 0) return seedMeshPatch('#000000ff');\n const patches: MeshPatch[] = [];\n for (let i = 0; i < sorted.length - 1; i++) {\n const a = sorted[i];\n const b = sorted[i + 1];\n if (b.offset > a.offset) patches.push(bandPatch(a.offset, b.offset, a.color, b.color));\n }\n return { fill: MESH_GRADIENT_KIND, patches, units: 'bounds' };\n}\n\n/**\n * A mesh read as a stop list: every patch's top edge — corner 0 to corner 1 —\n * placed by its `x` across the mesh's horizontal extent. The inverse of\n * `meshFromStops`, and for any other mesh the ramp across its top.\n */\nexport function meshStops(mesh: MeshGradientFill): GradStop[] {\n const valid = mesh.patches.filter(isValidPatch);\n if (valid.length === 0) return [];\n const xs = valid.flatMap((p) => [p.points[0].x, p.points[3].x]);\n const lo = Math.min(...xs);\n const span = Math.max(...xs) - lo;\n const offsetOf = (x: number) => (span > 0 ? (x - lo) / span : 0);\n const stops: GradStop[] = [];\n for (const patch of valid) {\n for (const [point, color] of [[patch.points[0], patch.colors[0]], [patch.points[3], patch.colors[1]]] as const) {\n const offset = offsetOf(point.x);\n if (!stops.some((s) => s.offset === offset && s.color === color)) stops.push({ offset, color });\n }\n }\n return stops.sort((a, b) => a.offset - b.offset);\n}\n\n/** Every patch mapped through `move`. */\nfunction mapPatches(mesh: MeshGradientFill, move: (p: MeshPoint) => MeshPoint): MeshPatch[] {\n return mesh.patches.map((patch) => ({ ...patch, points: patch.points.map(move) }));\n}\n\n// ─── The bake cache ─────────────────────────────────────────────────────────\n//\n// A kind owns its own GPU state; the registry hands it a `gl` and a resource\n// lifetime. One cache per lifetime, so two renderers — or one renderer past a\n// context restore — never trade textures, and the lifetime's end frees them.\n\ninterface CachedBake {\n texture: WebGLTexture;\n baked: BakedMesh;\n}\n\nconst CACHES = new WeakMap<PaintResources, MeshBakeCache<CachedBake>>();\n\nfunction cacheFor(ctx: PaintBindContext): MeshBakeCache<CachedBake> {\n let cache = CACHES.get(ctx.resources);\n if (!cache) {\n const gl = ctx.gl;\n const made = new MeshBakeCache<CachedBake>((entry) => gl.deleteTexture(entry.texture));\n ctx.resources.onRelease(() => {\n made.clear();\n CACHES.delete(ctx.resources);\n });\n CACHES.set(ctx.resources, made);\n cache = made;\n }\n return cache;\n}\n\n/** Device pixels the larger side of `box` covers when drawn in `units`. */\nfunction devicePixelsOf(ctx: PaintBindContext, mesh: MeshGradientFill, box: MeshBox): number {\n const m = ctx.spaceToDevice(mesh.units);\n if (!m) return Number.NaN;\n return Math.max(box.width * Math.hypot(m[0], m[1]), box.height * Math.hypot(m[3], m[4]));\n}\n\nfunction bakeFor(ctx: PaintBindContext, mesh: MeshGradientFill): CachedBake | null {\n const box = meshBounds(mesh.patches);\n if (!box) return null;\n const size = meshBakeSize(devicePixelsOf(ctx, mesh, box), ctx.maxTextureSize);\n\n const cache = cacheFor(ctx);\n const hit = cache.get(mesh, size);\n if (hit) return hit;\n\n const baked = bakeMesh(mesh.patches, mesh.interpolate ?? 'rgb', size);\n if (!baked) return null;\n\n const gl = ctx.gl;\n const texture = gl.createTexture();\n if (!texture) return null;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n baked.size, baked.size, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, baked.pixels,\n );\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n const entry = { texture, baked };\n cache.set(mesh, size, entry);\n return entry;\n}\n\nfunction bindMesh(ctx: PaintBindContext, fill: FillStyle): PaintProgram | null {\n const mesh = asMesh(fill);\n if (!mesh.patches.some(isValidPatch)) return null;\n\n const inverse = ctx.spaceInverse(mesh.units);\n if (!inverse) return null;\n\n const program = ctx.program(MESH_PROGRAM_ID);\n if (!program) return null;\n\n const entry = bakeFor(ctx, mesh);\n if (!entry) return null;\n\n const gl = ctx.gl;\n gl.useProgram(program.handle);\n ctx.setProjAndModel(program);\n gl.uniformMatrix3fv(program.uniform('u_worldInv')!, false, inverse);\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, entry.texture);\n gl.uniform1i(program.uniform('u_sampler')!, 0);\n\n const { box } = entry.baked;\n gl.uniform2f(program.uniform('u_meshOrigin')!, box.x, box.y);\n gl.uniform2f(program.uniform('u_meshSize')!, box.width, box.height);\n gl.uniform1f(program.uniform('u_opacity')!, mesh.opacity ?? 1);\n gl.uniform1f(program.uniform('u_alpha')!, ctx.alpha);\n return program;\n}\n\n/** The kind's registry entry, shader program included. `./register` registers\n * it; core's paint-kind registry loads it on demand otherwise. */\nexport const meshGradientKind: PaintKindEntry = {\n id: MESH_GRADIENT_KIND,\n programs: { [MESH_PROGRAM_ID]: { vert: MESH_VERT_SRC, frag: MESH_FRAG_SRC } },\n label: 'Mesh',\n icon: 'paintMesh',\n seed: (color) => asFill(seedMeshPatch(color)),\n // The first corner of the first patch: a mesh has no single color, and this\n // is the one a fallback swatch and an SVG paint fallback both read.\n colorOf: (paint) => asMesh(paint).patches?.[0]?.colors?.[0],\n stopsOf: (paint) => meshStops(asMesh(paint)),\n fromStops: (stops) => asFill(meshFromStops(stops)),\n bind: bindMesh,\n inPoseFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units !== 'bounds') return fill;\n return asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: box.x + p.x * box.width,\n y: box.y + p.y * box.height,\n })),\n units: 'local' as const,\n });\n },\n toBoundsFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units === 'bounds' || box.width === 0 || box.height === 0) return fill;\n return asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: (p.x - box.x) / box.width,\n y: (p.y - box.y) / box.height,\n })),\n units: 'bounds' as const,\n });\n },\n toSvg: (id, fill) => meshGradientXml(id, asMesh(fill)),\n};\n\n/**\n * The `<defs>` entry for a mesh paint, in weasel's own namespace.\n *\n * Not SVG's abandoned `<meshgradient>`: that vocabulary only reaches Coons\n * patches, shares patch edges implicitly — a reader that gets the sharing\n * wrong tears the surface rather than failing outright — and has exactly one\n * implementation in the world. Ours writes every patch's points in full.\n * `@weasel-js/svg` puts the paint fallback color beside the reference, so a\n * foreign renderer paints flat instead of nothing.\n */\nexport function meshGradientXml(id: string, mesh: MeshGradientFill): string {\n const P = 'wzl';\n const units = mesh.units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n const space = mesh.interpolate && mesh.interpolate !== 'rgb'\n ? ` interpolate=\"${mesh.interpolate}\"` : '';\n const patches = mesh.patches.map((patch) => {\n const points = patch.points.map((p) => `${trim(p.x)},${trim(p.y)}`).join(' ');\n const colors = patch.colors.join(' ');\n return `<${P}:patch points=\"${points}\" colors=\"${colors}\"/>`;\n }).join('');\n return (\n `<${P}:meshGradient id=\"${id}\" gradientUnits=\"${units}\"${space}>` +\n `${patches}</${P}:meshGradient>`\n );\n}\n\n/** Short decimals, matching what `@weasel-js/svg` writes elsewhere. */\nfunction trim(n: number): string {\n return Number.isInteger(n) ? String(n) : String(Number(n.toFixed(4)));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"meshPaint.js","names":["MESH_GRADIENT_KIND","isMeshGradientFill","fill","asMesh","asFill","mesh","shifted","r","g","b","a","resolveColor","color","L","A","B","srgbFloatToOklab","C","h","oklabToOklch","nL","nA","nB","oklchToOklab","dL","cScale","dHueDeg","nr","ng","nb","oklabToSrgbU8","rgbaToHex","seedMeshPatch","corners","points","i","nx","ny","bandPatch","x0","x1","left","right","meshFromStops","sorted","stops","patches","meshStops","valid","isValidPatch","xs","p","lo","span","offsetOf","x","patch","point","offset","s","mapPatches","move","BAKE_SOURCE","CACHES","cacheFor","cache","ctx","gl","made","MeshBakeCache","texture","devicePixelsOf","m","box","bakeFor","meshBounds","size","meshBakeSize","key","hit","baked","bakeMesh","bindMesh","inverse","program","MESH_PROGRAM_ID","entry","mat3","meshGradientKind","MESH_VERT_SRC","MESH_FRAG_SRC","paint","posed","meshGradientXml","id","trim","n"],"sources":["../../../src/features/meshPaint/meshPaint.ts"],"sourcesContent":["/**\n * The `mesh-gradient` paint kind — PDF's shading types 6 and 7 as a registered\n * paint.\n *\n * A mesh gradient is a set of curved quadrilateral patches, each with a color\n * at every corner. It is the paint SVG tried to standardize as\n * `<meshgradient>` and abandoned, and the one PDF has had since 1993; what it\n * buys over the three gradients is a color field that bends, so a highlight\n * can follow a form instead of running straight across it.\n *\n * This is a registered kind rather than a sixth branch in the renderer, and\n * deliberately: it uses only the slots `registerPaintKind` gives a consumer, so\n * whatever it can do, a consumer's own kind can do too. Its one concession is\n * living in this package, because that is where the shader registry is.\n *\n * `docs/proposals/2026-09-17-paint-kinds-beyond-svg.md` is the design.\n */\n\nimport type { GradStop } from '@weasel-js/paint';\nimport type { PaintBindContext, PaintKindEntry, PaintProgram, PaintResources } from '../../core/paintKinds';\nimport { resolveColor, rgbaToHex } from '../../renderer/math/color';\nimport { mat3 } from '../../renderer/math/mat3';\nimport { oklabToOklch, oklabToSrgbU8, oklchToOklab, srgbFloatToOklab } from '@weasel-js/paint';\nimport type { ColorSpace, FillStyle, GradientUnits } from '@weasel-js/paint';\nimport type { FillPoseBox } from '../../core/fillInPoseFrame';\nimport { bakeMesh, meshBounds, type MeshBox } from './bake';\nimport { MeshBakeCache, meshBakeSize } from './bakeCache';\nimport { isValidPatch, type MeshPatch, type MeshPoint } from './surface';\nimport { MESH_FRAG_SRC, MESH_PROGRAM_ID, MESH_VERT_SRC } from './meshShader';\n\nexport type { MeshPatch, MeshPoint } from './surface';\n\n/**\n * A mesh gradient paint.\n *\n * `patches` are in the space `units` names, the same way a gradient's\n * geometry is — under `'bounds'` every point is a fraction of the painted\n * node's box, which is what lets the paint survive a resize.\n *\n * `interpolate` is the space corner colors blend through, matching the three\n * gradients. It is more visible here than there: a mesh blends in two\n * directions at once, so an sRGB blend's muddy middle covers area rather than\n * a line.\n */\nexport interface MeshGradientFill {\n fill: 'mesh-gradient';\n patches: MeshPatch[];\n units?: GradientUnits;\n interpolate?: ColorSpace;\n opacity?: number;\n}\n\n/** The kind's id, as `FillStyle['fill']` carries it. */\nexport const MESH_GRADIENT_KIND = 'mesh-gradient';\n\n/** A mesh paint, narrowed. */\nexport function isMeshGradientFill(fill: FillStyle | null | undefined): fill is FillStyle & MeshGradientFill {\n // `FillStyle`'s discriminant stays closed over the built-in kinds — see\n // `asPaint` — so a registered kind reads it widened.\n return fill != null && (fill.fill as string | undefined) === MESH_GRADIENT_KIND;\n}\n\nfunction asMesh(fill: FillStyle): MeshGradientFill {\n return fill as unknown as MeshGradientFill;\n}\n\n// `asPaint`'s cast, kept local: this module must import nothing from the\n// registry, whose state `lazyKind`'s self-contained copy would duplicate.\nfunction asFill(mesh: MeshGradientFill): FillStyle {\n return mesh as unknown as FillStyle;\n}\n\n/**\n * `color` moved in OKLCh — lightness, chroma and hue by the given deltas, with\n * its alpha kept. The seed's corners come from one color, and they have to\n * differ enough to read as a mesh rather than as a flat fill.\n */\nfunction shifted(color: string, dL: number, cScale: number, dHueDeg: number): string {\n const [r, g, b, a] = resolveColor(color);\n const [L, A, B] = srgbFloatToOklab(r, g, b);\n const [, C, h] = oklabToOklch(L, A, B);\n const [nL, nA, nB] = oklchToOklab(\n Math.min(1, Math.max(0, L + dL)),\n Math.max(0, C * cScale),\n h + (dHueDeg * Math.PI) / 180,\n );\n const [nr, ng, nb] = oklabToSrgbU8(nL, nA, nB);\n return rgbaToHex([nr / 255, ng / 255, nb / 255, a]);\n}\n\n/** A one-patch square covering the unit box, its four corners four readings of\n * `color` — a mesh seeded from a solid has to show *something* curved, or\n * switching kind looks like nothing happened. */\nexport function seedMeshPatch(color: string): MeshGradientFill {\n const corners: MeshPoint[] = [\n { x: 0, y: 0 }, { x: 1, y: 0 }, { x: 1, y: 1 }, { x: 0, y: 1 },\n ];\n const points: MeshPoint[] = [];\n for (let i = 0; i < 4; i++) {\n const a = corners[i];\n const b = corners[(i + 1) % 4];\n // Bow each edge outward by an eighth, so the seed is a patch and not a\n // rectangle wearing one's clothes.\n const nx = (b.y - a.y) * 0.125;\n const ny = -(b.x - a.x) * 0.125;\n points.push(\n a,\n { x: a.x + (b.x - a.x) / 3 + nx, y: a.y + (b.y - a.y) / 3 + ny },\n { x: a.x + (2 * (b.x - a.x)) / 3 + nx, y: a.y + (2 * (b.y - a.y)) / 3 + ny },\n );\n }\n return {\n fill: MESH_GRADIENT_KIND,\n patches: [{\n points,\n colors: [\n color,\n shifted(color, 0.14, 0.85, 0),\n shifted(color, -0.06, 1.1, 38),\n shifted(color, -0.16, 1.0, -22),\n ],\n }],\n units: 'bounds',\n };\n}\n\n/** The straight-edged patch covering `[x0, x1] × [0, 1]`, in walk order. */\nfunction bandPatch(x0: number, x1: number, left: string, right: string): MeshPatch {\n const corners: MeshPoint[] = [{ x: x0, y: 0 }, { x: x1, y: 0 }, { x: x1, y: 1 }, { x: x0, y: 1 }];\n const points: MeshPoint[] = [];\n for (let i = 0; i < 4; i++) {\n const a = corners[i];\n const b = corners[(i + 1) % 4];\n points.push(a, { x: a.x + (b.x - a.x) / 3, y: a.y + (b.y - a.y) / 3 }, { x: a.x + (2 * (b.x - a.x)) / 3, y: a.y + (2 * (b.y - a.y)) / 3 });\n }\n return { points, colors: [left, right, right, left] };\n}\n\n/**\n * A stop list as a mesh: one full-height band per gap between neighboring\n * stops, colored left to right. The bands blend exactly the way the ramp\n * does, so a horizontal gradient survives the switch unchanged. A zero-width\n * gap is a hard break and gets no band.\n */\nexport function meshFromStops(stops: readonly GradStop[]): MeshGradientFill {\n const sorted = [...stops].sort((a, b) => a.offset - b.offset);\n if (sorted.length === 1) sorted.push({ offset: 1, color: sorted[0].color });\n if (sorted.length === 0) return seedMeshPatch('#000000ff');\n const patches: MeshPatch[] = [];\n for (let i = 0; i < sorted.length - 1; i++) {\n const a = sorted[i];\n const b = sorted[i + 1];\n if (b.offset > a.offset) patches.push(bandPatch(a.offset, b.offset, a.color, b.color));\n }\n return { fill: MESH_GRADIENT_KIND, patches, units: 'bounds' };\n}\n\n/**\n * A mesh read as a stop list: every patch's top edge — corner 0 to corner 1 —\n * placed by its `x` across the mesh's horizontal extent. The inverse of\n * `meshFromStops`, and for any other mesh the ramp across its top.\n */\nexport function meshStops(mesh: MeshGradientFill): GradStop[] {\n const valid = mesh.patches.filter(isValidPatch);\n if (valid.length === 0) return [];\n const xs = valid.flatMap((p) => [p.points[0].x, p.points[3].x]);\n const lo = Math.min(...xs);\n const span = Math.max(...xs) - lo;\n const offsetOf = (x: number) => (span > 0 ? (x - lo) / span : 0);\n const stops: GradStop[] = [];\n for (const patch of valid) {\n for (const [point, color] of [[patch.points[0], patch.colors[0]], [patch.points[3], patch.colors[1]]] as const) {\n const offset = offsetOf(point.x);\n if (!stops.some((s) => s.offset === offset && s.color === color)) stops.push({ offset, color });\n }\n }\n return stops.sort((a, b) => a.offset - b.offset);\n}\n\n/** Every patch mapped through `move`. */\nfunction mapPatches(mesh: MeshGradientFill, move: (p: MeshPoint) => MeshPoint): MeshPatch[] {\n return mesh.patches.map((patch) => ({ ...patch, points: patch.points.map(move) }));\n}\n\n// ─── The bake cache ─────────────────────────────────────────────────────────\n//\n// A kind owns its own GPU state; the registry hands it a `gl` and a resource\n// lifetime. One cache per lifetime, so two renderers — or one renderer past a\n// context restore — never trade textures, and the lifetime's end frees them.\n\ninterface CachedBake {\n texture: WebGLTexture;\n /** Where the mesh being bound sits in paint space. The texels are shared by\n * every pose-frame copy of one paint; the box is each copy's own. */\n box: MeshBox;\n}\n\n/** The paint a pose-frame copy was made from. A copy is rebuilt whenever its\n * node's pose changes, and bakes the same texels as its source. */\nconst BAKE_SOURCE = new WeakMap<object, object>();\n\nconst CACHES = new WeakMap<PaintResources, MeshBakeCache<WebGLTexture>>();\n\nfunction cacheFor(ctx: PaintBindContext): MeshBakeCache<WebGLTexture> {\n let cache = CACHES.get(ctx.resources);\n if (!cache) {\n const gl = ctx.gl;\n const made = new MeshBakeCache<WebGLTexture>((texture) => gl.deleteTexture(texture));\n ctx.resources.onRelease(() => {\n made.clear();\n CACHES.delete(ctx.resources);\n });\n CACHES.set(ctx.resources, made);\n cache = made;\n }\n return cache;\n}\n\n/** Device pixels the larger side of `box` covers when drawn in `units`. */\nfunction devicePixelsOf(ctx: PaintBindContext, mesh: MeshGradientFill, box: MeshBox): number {\n const m = ctx.spaceToDevice(mesh.units);\n if (!m) return Number.NaN;\n return Math.max(box.width * Math.hypot(m[0], m[1]), box.height * Math.hypot(m[3], m[4]));\n}\n\nfunction bakeFor(ctx: PaintBindContext, mesh: MeshGradientFill): CachedBake | null {\n const box = meshBounds(mesh.patches);\n if (!box) return null;\n const size = meshBakeSize(devicePixelsOf(ctx, mesh, box), ctx.maxTextureSize);\n\n const cache = cacheFor(ctx);\n const key = BAKE_SOURCE.get(mesh) ?? mesh;\n const hit = cache.get(key, size);\n if (hit) return { texture: hit, box };\n\n const baked = bakeMesh(mesh.patches, mesh.interpolate ?? 'rgb', size);\n if (!baked) return null;\n\n const gl = ctx.gl;\n const texture = gl.createTexture();\n if (!texture) return null;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n baked.size, baked.size, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, baked.pixels,\n );\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n cache.set(key, size, texture);\n return { texture, box };\n}\n\nfunction bindMesh(ctx: PaintBindContext, fill: FillStyle): PaintProgram | null {\n const mesh = asMesh(fill);\n if (!mesh.patches.some(isValidPatch)) return null;\n\n const inverse = ctx.spaceInverse(mesh.units);\n if (!inverse) return null;\n\n const program = ctx.program(MESH_PROGRAM_ID);\n if (!program) return null;\n\n const entry = bakeFor(ctx, mesh);\n if (!entry) return null;\n\n const gl = ctx.gl;\n gl.useProgram(program.handle);\n ctx.setProjAndModel(program);\n gl.uniformMatrix3fv(program.uniform('u_worldInv')!, false, mat3.toUniform(inverse));\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, entry.texture);\n gl.uniform1i(program.uniform('u_sampler')!, 0);\n\n const { box } = entry;\n gl.uniform2f(program.uniform('u_meshOrigin')!, box.x, box.y);\n gl.uniform2f(program.uniform('u_meshSize')!, box.width, box.height);\n gl.uniform1f(program.uniform('u_opacity')!, mesh.opacity ?? 1);\n gl.uniform1f(program.uniform('u_alpha')!, ctx.alpha);\n return program;\n}\n\n/** The kind's registry entry, shader program included. `./register` registers\n * it; core's paint-kind registry loads it on demand otherwise. */\nexport const meshGradientKind: PaintKindEntry = {\n id: MESH_GRADIENT_KIND,\n programs: { [MESH_PROGRAM_ID]: { vert: MESH_VERT_SRC, frag: MESH_FRAG_SRC } },\n label: 'Mesh',\n icon: 'paintMesh',\n seed: (color) => asFill(seedMeshPatch(color)),\n // The first corner of the first patch: a mesh has no single color, and this\n // is the one a fallback swatch and an SVG paint fallback both read.\n colorOf: (paint) => asMesh(paint).patches?.[0]?.colors?.[0],\n stopsOf: (paint) => meshStops(asMesh(paint)),\n fromStops: (stops) => asFill(meshFromStops(stops)),\n bind: bindMesh,\n inPoseFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units !== 'bounds') return fill;\n const posed = asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: box.x + p.x * box.width,\n y: box.y + p.y * box.height,\n })),\n units: 'local' as const,\n });\n BAKE_SOURCE.set(posed, fill);\n return posed;\n },\n toBoundsFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units === 'bounds' || box.width === 0 || box.height === 0) return fill;\n return asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: (p.x - box.x) / box.width,\n y: (p.y - box.y) / box.height,\n })),\n units: 'bounds' as const,\n });\n },\n toSvg: (id, fill) => meshGradientXml(id, asMesh(fill)),\n};\n\n/**\n * The `<defs>` entry for a mesh paint, in weasel's own namespace.\n *\n * Not SVG's abandoned `<meshgradient>`: that vocabulary only reaches Coons\n * patches, shares patch edges implicitly — a reader that gets the sharing\n * wrong tears the surface rather than failing outright — and has exactly one\n * implementation in the world. Ours writes every patch's points in full.\n * `@weasel-js/svg` puts the paint fallback color beside the reference, so a\n * foreign renderer paints flat instead of nothing.\n */\nexport function meshGradientXml(id: string, mesh: MeshGradientFill): string {\n const P = 'wzl';\n const units = mesh.units === 'bounds' ? 'objectBoundingBox' : 'userSpaceOnUse';\n const space = mesh.interpolate && mesh.interpolate !== 'rgb'\n ? ` interpolate=\"${mesh.interpolate}\"` : '';\n const patches = mesh.patches.map((patch) => {\n const points = patch.points.map((p) => `${trim(p.x)},${trim(p.y)}`).join(' ');\n const colors = patch.colors.join(' ');\n return `<${P}:patch points=\"${points}\" colors=\"${colors}\"/>`;\n }).join('');\n return (\n `<${P}:meshGradient id=\"${id}\" gradientUnits=\"${units}\"${space}>` +\n `${patches}</${P}:meshGradient>`\n );\n}\n\n/** Short decimals, matching what `@weasel-js/svg` writes elsewhere. */\nfunction trim(n: number): string {\n return Number.isInteger(n) ? String(n) : String(Number(n.toFixed(4)));\n}\n"],"mappings":"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"}
@@ -1,28 +1,28 @@
1
1
  import { AUTO_POSE_DESCRIPTOR as e } from "../../interactions/actions/resize/autoPoseDescriptor.js";
2
- import { FALLBACK_ACCENT as t, accentColorOf as n } from "../../canvas/accentColor.js";
3
- import { MINIMAP_CENTER as r, MINIMAP_PAN as i, minimapCenterAction as a, minimapPanAction as o } from "./actions.js";
2
+ import { MINIMAP_CENTER as t, MINIMAP_PAN as n, minimapCenterAction as r, minimapPanAction as i } from "./actions.js";
3
+ import { FALLBACK_FIT_VIEW as a, computeFitView as o } from "../../canvas/minimapMath.js";
4
4
  import { createIndicatorLayer as s, createLinkedCursorLayer as c } from "./layers.js";
5
- import { FALLBACK_FIT_VIEW as l, computeFitView as u } from "../../canvas/minimapMath.js";
5
+ import { FALLBACK_ACCENT as l, accentColorOf as u } from "../../canvas/accentColor.js";
6
6
  //#region src/features/minimap/createMinimapContribution.ts
7
- function d(e, r) {
8
- let i = null, a = t, o = (e) => e !== null && r.some((t) => t !== e.viewId);
7
+ function d(e, t) {
8
+ let n = null, r = l, i = (e) => e !== null && t.some((t) => t !== e.viewId);
9
9
  return {
10
10
  layer: c({
11
11
  id: e,
12
- pointer: () => i,
13
- color: () => a,
14
- views: r
12
+ pointer: () => n,
13
+ color: () => r,
14
+ views: t
15
15
  }),
16
16
  attach: (e, t) => {
17
- let r = t.get("pointer");
18
- if (!r) return () => {};
19
- a = n(e.element), i = r.get();
20
- let s = r.subscribe(() => {
21
- let t = i;
22
- i = r.get(), (o(t) || o(i)) && e.requestRedraw();
17
+ let a = t.get("pointer");
18
+ if (!a) return () => {};
19
+ r = u(e.element), n = a.get();
20
+ let o = a.subscribe(() => {
21
+ let t = n;
22
+ n = a.get(), (i(t) || i(n)) && e.requestRedraw();
23
23
  });
24
24
  return () => {
25
- s(), i = null, e.requestRedraw();
25
+ o(), n = null, e.requestRedraw();
26
26
  };
27
27
  }
28
28
  };
@@ -37,48 +37,48 @@ function f(e = {}) {
37
37
  };
38
38
  }
39
39
  var p = "#18181c";
40
- function m(t) {
41
- let n = t.id ?? "minimap", c = t.fit ?? "scene", f = null, m = null, h = (n, r) => {
42
- let i = f?.get("scene");
43
- if (!i) return l;
44
- let a = typeof t.rect == "function" ? t.rect(n, r) : t.rect, o = i.getVersion();
45
- if (m && m.scene === i && m.version === o && m.w === a.w && m.h === a.h) return m.view;
46
- let s = f?.get("poseDescriptor") ?? e, d = u(i, {
47
- width: a.w,
48
- height: a.h
49
- }, c, s);
40
+ function m(c) {
41
+ let l = c.id ?? "minimap", u = c.fit ?? "scene", f = null, m = null, h = (t, n) => {
42
+ let r = f?.get("scene");
43
+ if (!r) return a;
44
+ let i = typeof c.rect == "function" ? c.rect(t, n) : c.rect, s = r.getVersion();
45
+ if (m && m.scene === r && m.version === s && m.w === i.w && m.h === i.h) return m.view;
46
+ let l = f?.get("poseDescriptor") ?? e, d = o(r, {
47
+ width: i.w,
48
+ height: i.h
49
+ }, u, l);
50
50
  return m = {
51
- scene: i,
52
- version: o,
53
- w: a.w,
54
- h: a.h,
51
+ scene: r,
52
+ version: s,
53
+ w: i.w,
54
+ h: i.h,
55
55
  view: d
56
56
  }, d;
57
- }, g = d(`${n}.cursor`, [null, n]), _ = s({
58
- viewId: n,
57
+ }, g = d(`${l}.cursor`, [null, l]), _ = s({
58
+ viewId: l,
59
59
  root: () => f?.get("rootView"),
60
- ...t.indicatorStyle ? { style: t.indicatorStyle } : {}
60
+ ...c.indicatorStyle ? { style: c.indicatorStyle } : {}
61
61
  });
62
62
  return {
63
- id: n,
63
+ id: l,
64
64
  eligibility: { always: !0 },
65
65
  views: [{
66
- id: n,
67
- bounds: t.rect,
66
+ id: l,
67
+ bounds: c.rect,
68
68
  view: h,
69
69
  interactive: !0,
70
- background: t.background ?? p,
71
- ...t.layers ? { layers: t.layers } : {}
70
+ background: c.background ?? p,
71
+ ...c.layers ? { layers: c.layers } : {}
72
72
  }],
73
- actions: [a(), o()],
73
+ actions: [r(), i()],
74
74
  bindings: [{
75
75
  spec: { kind: "pointerDown" },
76
- actionId: r,
77
- opts: { views: [n] }
76
+ actionId: t,
77
+ opts: { views: [l] }
78
78
  }, {
79
79
  spec: { kind: "drag" },
80
- actionId: i,
81
- opts: { views: [n] }
80
+ actionId: n,
81
+ opts: { views: [l] }
82
82
  }],
83
83
  overlay: [_, g.layer],
84
84
  attach: (e, t) => {
@@ -1,85 +1,67 @@
1
+ import { computeIndicatorCommand as e } from "../../canvas/minimapMath.js";
1
2
  //#region src/features/minimap/layers.ts
2
- function e(e) {
3
+ function t(e) {
3
4
  return e?.viewId ?? null;
4
5
  }
5
- function t(t) {
6
- let { viewId: n, root: r, style: i = {} } = t;
6
+ function n(n) {
7
+ let { viewId: r, root: i, style: a = {} } = n;
7
8
  return {
8
- id: `${n}.indicator`,
9
+ id: `${r}.indicator`,
9
10
  label: "Minimap indicator",
10
- draw: (t, a) => {
11
- if (e(t) !== n) return [];
12
- let o = r(), s = o?.hostSize?.();
13
- if (!o || !s) return [];
14
- let c = o.get(), l = 1 / a.scale.x;
15
- return [{
16
- kind: "path",
17
- path: {
18
- kind: "rect",
19
- x: c.x,
20
- y: c.y,
21
- width: s.width / c.scale.x,
22
- height: s.height / c.scale.y
23
- },
24
- stroke: {
25
- paint: {
26
- fill: "solid",
27
- color: i.stroke ?? "#ffffff"
28
- },
29
- width: (i.width ?? 1) * l,
30
- dash: (i.dash ?? [2, 3]).map((e) => e * l)
31
- }
32
- }];
11
+ draw: (n, o) => {
12
+ if (t(n) !== r) return [];
13
+ let s = i(), c = s?.hostSize?.();
14
+ return !s || !c ? [] : [e(s.get(), c, a, o)];
33
15
  }
34
16
  };
35
17
  }
36
- var n = "rgba(0, 0, 0, 0.6)";
37
- function r(e, t, n) {
38
- let r = n, i = 9 * r, a = 3 * r, o = 2 * r, s = 1 * r, c = [
18
+ var r = 9, i = 3, a = 2, o = 1, s = "rgba(0, 0, 0, 0.6)";
19
+ function c(e, t, n) {
20
+ let s = n, c = r * s, l = i * s, u = a * s, d = o * s, f = [
39
21
  {
40
- x: e - a - i,
41
- y: t - o / 2,
42
- w: i,
43
- h: o
22
+ x: e - l - c,
23
+ y: t - u / 2,
24
+ w: c,
25
+ h: u
44
26
  },
45
27
  {
46
- x: e + a,
47
- y: t - o / 2,
48
- w: i,
49
- h: o
28
+ x: e + l,
29
+ y: t - u / 2,
30
+ w: c,
31
+ h: u
50
32
  },
51
33
  {
52
- x: e - o / 2,
53
- y: t - a - i,
54
- w: o,
55
- h: i
34
+ x: e - u / 2,
35
+ y: t - l - c,
36
+ w: u,
37
+ h: c
56
38
  },
57
39
  {
58
- x: e - o / 2,
59
- y: t + a,
60
- w: o,
61
- h: i
40
+ x: e - u / 2,
41
+ y: t + l,
42
+ w: u,
43
+ h: c
62
44
  }
63
45
  ];
64
46
  return {
65
- halo: c.map((e) => ({
66
- x: e.x - s,
67
- y: e.y - s,
68
- w: e.w + 2 * s,
69
- h: e.h + 2 * s
47
+ halo: f.map((e) => ({
48
+ x: e.x - d,
49
+ y: e.y - d,
50
+ w: e.w + 2 * d,
51
+ h: e.h + 2 * d
70
52
  })),
71
- bars: c
53
+ bars: f
72
54
  };
73
55
  }
74
- function i(t) {
75
- let { id: i, pointer: a, color: o, views: s } = t;
56
+ function l(e) {
57
+ let { id: n, pointer: r, color: i, views: a } = e;
76
58
  return {
77
- id: i,
59
+ id: n,
78
60
  label: "Linked cursor",
79
- draw: (t, i) => {
80
- let c = a(), l = e(t);
81
- if (!c || c.viewId === l || s && !s.includes(l)) return [];
82
- let { halo: u, bars: d } = r(c.worldX, c.worldY, 1 / i.scale.x), f = (e, t) => ({
61
+ draw: (e, n) => {
62
+ let o = r(), l = t(e);
63
+ if (!o || o.viewId === l || a && !a.includes(l)) return [];
64
+ let { halo: u, bars: d } = c(o.worldX, o.worldY, 1 / n.scale.x), f = (e, t) => ({
83
65
  kind: "path",
84
66
  path: {
85
67
  kind: "rect",
@@ -92,12 +74,12 @@ function i(t) {
92
74
  fill: "solid",
93
75
  color: t
94
76
  }
95
- }), p = o();
96
- return [...u.map((e) => f(e, n)), ...d.map((e) => f(e, p))];
77
+ }), p = i();
78
+ return [...u.map((e) => f(e, s)), ...d.map((e) => f(e, p))];
97
79
  }
98
80
  };
99
81
  }
100
82
  //#endregion
101
- export { n as CROSSHAIR_HALO, t as createIndicatorLayer, i as createLinkedCursorLayer, r as crosshairRects };
83
+ export { s as CROSSHAIR_HALO, n as createIndicatorLayer, l as createLinkedCursorLayer, c as crosshairRects };
102
84
 
103
85
  //# sourceMappingURL=layers.js.map