@weasel-js/core 1.6.1 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1005) hide show
  1. package/CHANGELOG.md +1006 -0
  2. package/README.md +28 -9
  3. package/dist/WeaselProvider.js +15 -0
  4. package/dist/WeaselProvider.js.map +1 -0
  5. package/dist/affordances/composeAffordanceLayer.js +224 -0
  6. package/dist/affordances/composeAffordanceLayer.js.map +1 -0
  7. package/dist/affordances/cornerResize.js +69 -0
  8. package/dist/affordances/cornerResize.js.map +1 -0
  9. package/dist/affordances/hitAffordanceRegions.js +138 -0
  10. package/dist/affordances/hitAffordanceRegions.js.map +1 -0
  11. package/dist/affordances/pathAnchors.js +66 -0
  12. package/dist/affordances/pathAnchors.js.map +1 -0
  13. package/dist/affordances/rotationHandle.js +103 -0
  14. package/dist/affordances/rotationHandle.js.map +1 -0
  15. package/dist/animation/behaviors/momentum.js +118 -0
  16. package/dist/animation/behaviors/momentum.js.map +1 -0
  17. package/dist/animation/colorHelpers.js +135 -0
  18. package/dist/animation/colorHelpers.js.map +1 -0
  19. package/dist/animation/colorRegistry.js +37 -0
  20. package/dist/animation/colorRegistry.js.map +1 -0
  21. package/dist/animation/index.js +20 -0
  22. package/dist/animation/loop.js +62 -0
  23. package/dist/animation/loop.js.map +1 -0
  24. package/dist/animation/observe.js +23 -0
  25. package/dist/animation/observe.js.map +1 -0
  26. package/dist/animation/poseHelpers.js +50 -0
  27. package/dist/animation/poseHelpers.js.map +1 -0
  28. package/dist/animation/reflow.js +121 -0
  29. package/dist/animation/reflow.js.map +1 -0
  30. package/dist/animation/rig/bindRig.js +74 -0
  31. package/dist/animation/rig/bindRig.js.map +1 -0
  32. package/dist/animation/rig/blendPoses.js +43 -0
  33. package/dist/animation/rig/blendPoses.js.map +1 -0
  34. package/dist/animation/rig/mirrorPose.js +19 -0
  35. package/dist/animation/rig/mirrorPose.js.map +1 -0
  36. package/dist/animation/rig/resolveSkeleton.js +33 -0
  37. package/dist/animation/rig/resolveSkeleton.js.map +1 -0
  38. package/dist/animation/rig/solveIk.js +103 -0
  39. package/dist/animation/rig/solveIk.js.map +1 -0
  40. package/dist/animation/rig/types.js +12 -0
  41. package/dist/animation/rig/types.js.map +1 -0
  42. package/dist/animation/rig/useRig.js +23 -0
  43. package/dist/animation/rig/useRig.js.map +1 -0
  44. package/dist/animation/slew.js +27 -0
  45. package/dist/animation/slew.js.map +1 -0
  46. package/dist/animation/stagger.js +138 -0
  47. package/dist/animation/stagger.js.map +1 -0
  48. package/dist/animation/timeline/booking.js +106 -0
  49. package/dist/animation/timeline/booking.js.map +1 -0
  50. package/dist/animation/timeline/createTimeline.js +116 -0
  51. package/dist/animation/timeline/createTimeline.js.map +1 -0
  52. package/dist/animation/timeline/sampleTrack.js +29 -0
  53. package/dist/animation/timeline/sampleTrack.js.map +1 -0
  54. package/dist/animation/useAnimator.js +329 -0
  55. package/dist/animation/useAnimator.js.map +1 -0
  56. package/dist/animation/wrappers/animateLifecycle.js +40 -0
  57. package/dist/animation/wrappers/animateLifecycle.js.map +1 -0
  58. package/dist/animation/wrappers/animateOnSetPose.js +44 -0
  59. package/dist/animation/wrappers/animateOnSetPose.js.map +1 -0
  60. package/dist/{autoPoseDescriptor-_XOyF7t4.d.ts → autoPoseDescriptor-BT_vp9FO.d.ts} +2 -2
  61. package/dist/{builtins-HWyuLzE-.d.ts → builtins-BSUfH8nU.d.ts} +1301 -508
  62. package/dist/canvas/Canvas.js +608 -0
  63. package/dist/canvas/Canvas.js.map +1 -0
  64. package/dist/canvas/CanvasView.js +255 -0
  65. package/dist/canvas/CanvasView.js.map +1 -0
  66. package/dist/canvas/CursorCoordsHud.js +75 -0
  67. package/dist/canvas/CursorCoordsHud.js.map +1 -0
  68. package/dist/canvas/DrawCanvas.js +67 -0
  69. package/dist/canvas/DrawCanvas.js.map +1 -0
  70. package/dist/canvas/MinimapCanvas.js +139 -0
  71. package/dist/canvas/MinimapCanvas.js.map +1 -0
  72. package/dist/canvas/ModalityHud.js +66 -0
  73. package/dist/canvas/ModalityHud.js.map +1 -0
  74. package/dist/canvas/NodeShape.js +391 -0
  75. package/dist/canvas/NodeShape.js.map +1 -0
  76. package/dist/canvas/PickHud.js +93 -0
  77. package/dist/canvas/PickHud.js.map +1 -0
  78. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js +10 -0
  79. package/dist/canvas/SceneCanvas/ActionsProviderIfRoot.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js +10 -0
  81. package/dist/canvas/SceneCanvas/DepRegistryProviderIfRoot.js.map +1 -0
  82. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +51 -0
  83. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -0
  84. package/dist/canvas/SceneCanvas/contributionFrameHooks.js +42 -0
  85. package/dist/canvas/SceneCanvas/contributionFrameHooks.js.map +1 -0
  86. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +549 -0
  87. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -0
  88. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +26 -0
  89. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -0
  90. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js +69 -0
  91. package/dist/canvas/SceneCanvas/dispatcherGestureBounds.js.map +1 -0
  92. package/dist/canvas/SceneCanvas/features.js +97 -0
  93. package/dist/canvas/SceneCanvas/features.js.map +1 -0
  94. package/dist/canvas/SceneCanvas/poseGeometry.js +46 -0
  95. package/dist/canvas/SceneCanvas/poseGeometry.js.map +1 -0
  96. package/dist/canvas/SceneCanvas/useActionsPropResolver.js +48 -0
  97. package/dist/canvas/SceneCanvas/useActionsPropResolver.js.map +1 -0
  98. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js +70 -0
  99. package/dist/canvas/SceneCanvas/useBuiltinShapeTools.js.map +1 -0
  100. package/dist/canvas/SceneCanvas/useContributionRoles.js +75 -0
  101. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -0
  102. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +172 -0
  103. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js.map +1 -0
  104. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js +69 -0
  105. package/dist/canvas/SceneCanvas/usePreviewGhostLayer.js.map +1 -0
  106. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +127 -0
  107. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -0
  108. package/dist/canvas/SceneCanvas/useViewportActions.js +30 -0
  109. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -0
  110. package/dist/canvas/SceneCanvas.js +992 -0
  111. package/dist/canvas/SceneCanvas.js.map +1 -0
  112. package/dist/canvas/SceneViewCanvas.js +54 -0
  113. package/dist/canvas/SceneViewCanvas.js.map +1 -0
  114. package/dist/canvas/accentColor.js +9 -0
  115. package/dist/canvas/accentColor.js.map +1 -0
  116. package/dist/canvas/affordanceAt.js +63 -0
  117. package/dist/canvas/affordanceAt.js.map +1 -0
  118. package/dist/canvas/buildSceneTree.js +65 -0
  119. package/dist/canvas/buildSceneTree.js.map +1 -0
  120. package/dist/canvas/canvasRenderer.js +89 -0
  121. package/dist/canvas/canvasRenderer.js.map +1 -0
  122. package/dist/canvas/colorOverrides.js +16 -0
  123. package/dist/canvas/colorOverrides.js.map +1 -0
  124. package/dist/canvas/defaultDrawOne.js +43 -0
  125. package/dist/canvas/defaultDrawOne.js.map +1 -0
  126. package/dist/canvas/deps/areaSelect.js +19 -0
  127. package/dist/canvas/deps/areaSelect.js.map +1 -0
  128. package/dist/canvas/deps/debug.js +9 -0
  129. package/dist/canvas/deps/debug.js.map +1 -0
  130. package/dist/canvas/deps/dispatcher.js +11 -0
  131. package/dist/canvas/deps/dispatcher.js.map +1 -0
  132. package/dist/canvas/deps/editAnchors.js +101 -0
  133. package/dist/canvas/deps/editAnchors.js.map +1 -0
  134. package/dist/canvas/deps/geometryProjection.js +11 -0
  135. package/dist/canvas/deps/geometryProjection.js.map +1 -0
  136. package/dist/canvas/deps/hitTestArea.js +51 -0
  137. package/dist/canvas/deps/hitTestArea.js.map +1 -0
  138. package/dist/canvas/deps/ingestion.js +31 -0
  139. package/dist/canvas/deps/ingestion.js.map +1 -0
  140. package/dist/canvas/deps/insert.js +116 -0
  141. package/dist/canvas/deps/insert.js.map +1 -0
  142. package/dist/canvas/deps/lassoSelect.js +20 -0
  143. package/dist/canvas/deps/lassoSelect.js.map +1 -0
  144. package/dist/canvas/deps/layout.js +34 -0
  145. package/dist/canvas/deps/layout.js.map +1 -0
  146. package/dist/canvas/deps/nodeAtPoint.js +19 -0
  147. package/dist/canvas/deps/nodeAtPoint.js.map +1 -0
  148. package/dist/canvas/deps/poseComposition.js +11 -0
  149. package/dist/canvas/deps/poseComposition.js.map +1 -0
  150. package/dist/canvas/deps/poseDescriptor.js +12 -0
  151. package/dist/canvas/deps/poseDescriptor.js.map +1 -0
  152. package/dist/canvas/deps/resizePolicy.js +35 -0
  153. package/dist/canvas/deps/resizePolicy.js.map +1 -0
  154. package/dist/canvas/deps/slice.js +99 -0
  155. package/dist/canvas/deps/slice.js.map +1 -0
  156. package/dist/canvas/deps/snap.js +11 -0
  157. package/dist/canvas/deps/snap.js.map +1 -0
  158. package/dist/canvas/deps/textEdit.js +21 -0
  159. package/dist/canvas/deps/textEdit.js.map +1 -0
  160. package/dist/canvas/deps/view.js +43 -0
  161. package/dist/canvas/deps/view.js.map +1 -0
  162. package/dist/canvas/derivedPath.js +47 -0
  163. package/dist/canvas/derivedPath.js.map +1 -0
  164. package/dist/canvas/drawEnvelope.js +22 -0
  165. package/dist/canvas/drawEnvelope.js.map +1 -0
  166. package/dist/canvas/getNodeAtPoint.js +18 -0
  167. package/dist/canvas/getNodeAtPoint.js.map +1 -0
  168. package/dist/canvas/hostAnchor.js +29 -0
  169. package/dist/canvas/hostAnchor.js.map +1 -0
  170. package/dist/canvas/hud.module.js +18 -0
  171. package/dist/canvas/hud.module.js.map +1 -0
  172. package/dist/canvas/insertPreviewExtent.js +103 -0
  173. package/dist/canvas/insertPreviewExtent.js.map +1 -0
  174. package/dist/canvas/kitRequirements.js +177 -0
  175. package/dist/canvas/kitRequirements.js.map +1 -0
  176. package/dist/canvas/layerOrder.js +66 -0
  177. package/dist/canvas/layerOrder.js.map +1 -0
  178. package/dist/canvas/layerSlots.js +14 -0
  179. package/dist/canvas/layerSlots.js.map +1 -0
  180. package/dist/canvas/minimapMath.js +80 -0
  181. package/dist/canvas/minimapMath.js.map +1 -0
  182. package/dist/canvas/mountedCanvases.js +20 -0
  183. package/dist/canvas/mountedCanvases.js.map +1 -0
  184. package/dist/canvas/overlayRoleStrokes.js +17 -0
  185. package/dist/canvas/overlayRoleStrokes.js.map +1 -0
  186. package/dist/canvas/paintCull.js +20 -0
  187. package/dist/canvas/paintCull.js.map +1 -0
  188. package/dist/canvas/pickWalk.js +158 -0
  189. package/dist/canvas/pickWalk.js.map +1 -0
  190. package/dist/canvas/planeClips.js +30 -0
  191. package/dist/canvas/planeClips.js.map +1 -0
  192. package/dist/canvas/poseRotation.js +35 -0
  193. package/dist/canvas/poseRotation.js.map +1 -0
  194. package/dist/canvas/rasterToPng.js +21 -0
  195. package/dist/canvas/rasterToPng.js.map +1 -0
  196. package/dist/canvas/renderDebugSnapshot.js +32 -0
  197. package/dist/canvas/renderDebugSnapshot.js.map +1 -0
  198. package/dist/canvas/renderNeeds.js +25 -0
  199. package/dist/canvas/renderNeeds.js.map +1 -0
  200. package/dist/canvas/renderSceneToPixels.js +143 -0
  201. package/dist/canvas/renderSceneToPixels.js.map +1 -0
  202. package/dist/canvas/sceneAdapter.js +270 -0
  203. package/dist/canvas/sceneAdapter.js.map +1 -0
  204. package/dist/canvas/sceneLayerPaint.js +37 -0
  205. package/dist/canvas/sceneLayerPaint.js.map +1 -0
  206. package/dist/canvas/sceneSlotWiring.js +20 -0
  207. package/dist/canvas/sceneSlotWiring.js.map +1 -0
  208. package/dist/canvas/sceneViewRender.js +72 -0
  209. package/dist/canvas/sceneViewRender.js.map +1 -0
  210. package/dist/canvas/slopsDebugLayer.js +61 -0
  211. package/dist/canvas/slopsDebugLayer.js.map +1 -0
  212. package/dist/canvas/surfaceContribution.js +15 -0
  213. package/dist/canvas/surfaceContribution.js.map +1 -0
  214. package/dist/canvas/toolPreview.js +39 -0
  215. package/dist/canvas/toolPreview.js.map +1 -0
  216. package/dist/canvas/useCanvasRenderer.js +11 -0
  217. package/dist/canvas/useCanvasRenderer.js.map +1 -0
  218. package/dist/canvas/useFrameLoop.js +60 -0
  219. package/dist/canvas/useFrameLoop.js.map +1 -0
  220. package/dist/canvas/useHostAnchor.js +71 -0
  221. package/dist/canvas/useHostAnchor.js.map +1 -0
  222. package/dist/canvas/useLateContentRedraw.js +21 -0
  223. package/dist/canvas/useLateContentRedraw.js.map +1 -0
  224. package/dist/canvas/useRedrawOn.js +21 -0
  225. package/dist/canvas/useRedrawOn.js.map +1 -0
  226. package/dist/canvas/useViewHelpers.js +120 -0
  227. package/dist/canvas/useViewHelpers.js.map +1 -0
  228. package/dist/canvas/viewInputs.js +17 -0
  229. package/dist/canvas/viewInputs.js.map +1 -0
  230. package/dist/canvas/viewRegistry.js +61 -0
  231. package/dist/canvas/viewRegistry.js.map +1 -0
  232. package/dist/canvas/wrapNodeOutput.js +14 -0
  233. package/dist/canvas/wrapNodeOutput.js.map +1 -0
  234. package/dist/clipboard.d.ts +10 -5
  235. package/dist/clipboard.js +3 -5
  236. package/dist/clone.d.ts +3 -3
  237. package/dist/clone.js +2 -5
  238. package/dist/core/adapters/arrayAdapter.js +85 -0
  239. package/dist/core/adapters/arrayAdapter.js.map +1 -0
  240. package/dist/core/adapters/useArrayAdapter.js +13 -0
  241. package/dist/core/adapters/useArrayAdapter.js.map +1 -0
  242. package/dist/core/applyOps.js +12 -0
  243. package/dist/core/applyOps.js.map +1 -0
  244. package/dist/core/device/index.js +4 -0
  245. package/dist/core/device/targets.js +17 -0
  246. package/dist/core/device/targets.js.map +1 -0
  247. package/dist/core/device/useDeviceProfile.js +75 -0
  248. package/dist/core/device/useDeviceProfile.js.map +1 -0
  249. package/dist/core/fillInPoseFrame.js +102 -0
  250. package/dist/core/fillInPoseFrame.js.map +1 -0
  251. package/dist/core/geometry/poseDescriptor.js +98 -0
  252. package/dist/core/geometry/poseDescriptor.js.map +1 -0
  253. package/dist/core/geometry/poseRotation.js +58 -0
  254. package/dist/core/geometry/poseRotation.js.map +1 -0
  255. package/dist/core/geometry/regionHit.js +102 -0
  256. package/dist/core/geometry/regionHit.js.map +1 -0
  257. package/dist/core/geometry/unionBounds.js +60 -0
  258. package/dist/core/geometry/unionBounds.js.map +1 -0
  259. package/dist/core/gradient.js +136 -0
  260. package/dist/core/gradient.js.map +1 -0
  261. package/dist/core/isPlainObject.js +11 -0
  262. package/dist/core/isPlainObject.js.map +1 -0
  263. package/dist/core/layers/render.js +150 -0
  264. package/dist/core/layers/render.js.map +1 -0
  265. package/dist/core/markerInset.js +24 -0
  266. package/dist/core/markerInset.js.map +1 -0
  267. package/dist/core/mixed.js +6 -0
  268. package/dist/core/mixed.js.map +1 -0
  269. package/dist/core/ops/arrange.js +31 -0
  270. package/dist/core/ops/arrange.js.map +1 -0
  271. package/dist/core/ops/create.js +32 -0
  272. package/dist/core/ops/create.js.map +1 -0
  273. package/dist/core/ops/createHistory.js +20 -0
  274. package/dist/core/ops/createHistory.js.map +1 -0
  275. package/dist/core/ops/delete.js +89 -0
  276. package/dist/core/ops/delete.js.map +1 -0
  277. package/dist/core/ops/registry.js +17 -0
  278. package/dist/core/ops/registry.js.map +1 -0
  279. package/dist/core/ops/reorder/algorithms.js +55 -0
  280. package/dist/core/ops/reorder/algorithms.js.map +1 -0
  281. package/dist/core/ops/reorder/index.js +140 -0
  282. package/dist/core/ops/reorder/index.js.map +1 -0
  283. package/dist/core/ops/reparent.js +52 -0
  284. package/dist/core/ops/reparent.js.map +1 -0
  285. package/dist/core/ops/select.js +34 -0
  286. package/dist/core/ops/select.js.map +1 -0
  287. package/dist/core/ops/setData.js +34 -0
  288. package/dist/core/ops/setData.js.map +1 -0
  289. package/dist/core/ops/setLayer.js +34 -0
  290. package/dist/core/ops/setLayer.js.map +1 -0
  291. package/dist/core/ops/setLayout.js +31 -0
  292. package/dist/core/ops/setLayout.js.map +1 -0
  293. package/dist/core/ops/setPath.js +57 -0
  294. package/dist/core/ops/setPath.js.map +1 -0
  295. package/dist/core/ops/setText.js +34 -0
  296. package/dist/core/ops/setText.js.map +1 -0
  297. package/dist/core/ops/slot.js +37 -0
  298. package/dist/core/ops/slot.js.map +1 -0
  299. package/dist/core/ops/transform.js +42 -0
  300. package/dist/core/ops/transform.js.map +1 -0
  301. package/dist/core/paintKinds.js +156 -0
  302. package/dist/core/paintKinds.js.map +1 -0
  303. package/dist/core/scene/NodeProperties.js +20 -0
  304. package/dist/core/scene/NodeProperties.js.map +1 -0
  305. package/dist/core/scene/NodeRouting.js +24 -0
  306. package/dist/core/scene/NodeRouting.js.map +1 -0
  307. package/dist/core/scene/arrivals.js +12 -0
  308. package/dist/core/scene/arrivals.js.map +1 -0
  309. package/dist/core/scene/composeFrame.js +29 -0
  310. package/dist/core/scene/composeFrame.js.map +1 -0
  311. package/dist/core/scene/depMemo.js +18 -0
  312. package/dist/core/scene/depMemo.js.map +1 -0
  313. package/dist/core/scene/dependents.js +66 -0
  314. package/dist/core/scene/dependents.js.map +1 -0
  315. package/dist/core/scene/derivedPath.js +31 -0
  316. package/dist/core/scene/derivedPath.js.map +1 -0
  317. package/dist/core/scene/effectivePose.js +78 -0
  318. package/dist/core/scene/effectivePose.js.map +1 -0
  319. package/dist/core/scene/kitRegistry.js +33 -0
  320. package/dist/core/scene/kitRegistry.js.map +1 -0
  321. package/dist/core/scene/layoutPass.js +96 -0
  322. package/dist/core/scene/layoutPass.js.map +1 -0
  323. package/dist/core/scene/nodeFnFields.js +83 -0
  324. package/dist/core/scene/nodeFnFields.js.map +1 -0
  325. package/dist/core/scene/nodeMemo.js +28 -0
  326. package/dist/core/scene/nodeMemo.js.map +1 -0
  327. package/dist/core/scene/poseFeed.js +87 -0
  328. package/dist/core/scene/poseFeed.js.map +1 -0
  329. package/dist/core/scene/poseOverrides.js +52 -0
  330. package/dist/core/scene/poseOverrides.js.map +1 -0
  331. package/dist/core/scene/poseSnapshot.js +54 -0
  332. package/dist/core/scene/poseSnapshot.js.map +1 -0
  333. package/dist/core/scene/scene.js +1271 -0
  334. package/dist/core/scene/scene.js.map +1 -0
  335. package/dist/core/scene/types.js +6 -0
  336. package/dist/core/scene/types.js.map +1 -0
  337. package/dist/core/scene/useScene.js +32 -0
  338. package/dist/core/scene/useScene.js.map +1 -0
  339. package/dist/core/selection/chromeState.js +31 -0
  340. package/dist/core/selection/chromeState.js.map +1 -0
  341. package/dist/core/selection/selectionTarget.js +6 -0
  342. package/dist/core/selection/selectionTarget.js.map +1 -0
  343. package/dist/core/selection/useSelection.js +71 -0
  344. package/dist/core/selection/useSelection.js.map +1 -0
  345. package/dist/core/shapeKinds.js +54 -0
  346. package/dist/core/shapeKinds.js.map +1 -0
  347. package/dist/core/strokeMarkerShapes.js +139 -0
  348. package/dist/core/strokeMarkerShapes.js.map +1 -0
  349. package/dist/core/strokeMarkers.js +28 -0
  350. package/dist/core/strokeMarkers.js.map +1 -0
  351. package/dist/core/stylus/stylus.js +39 -0
  352. package/dist/core/stylus/stylus.js.map +1 -0
  353. package/dist/core/stylus/usePointerStylus.js +51 -0
  354. package/dist/core/stylus/usePointerStylus.js.map +1 -0
  355. package/dist/core/usePaintKinds.js +17 -0
  356. package/dist/core/usePaintKinds.js.map +1 -0
  357. package/dist/core/viewport/clampView.js +24 -0
  358. package/dist/core/viewport/clampView.js.map +1 -0
  359. package/dist/core/viewport/clientToWorld.js +8 -0
  360. package/dist/core/viewport/clientToWorld.js.map +1 -0
  361. package/dist/core/viewport/createVelocityTracker.js +39 -0
  362. package/dist/core/viewport/createVelocityTracker.js.map +1 -0
  363. package/dist/core/viewport/fitToBounds.js +18 -0
  364. package/dist/core/viewport/fitToBounds.js.map +1 -0
  365. package/dist/core/viewport/fitViewToBounds.js +36 -0
  366. package/dist/core/viewport/fitViewToBounds.js.map +1 -0
  367. package/dist/core/viewport/interpolateView.js +34 -0
  368. package/dist/core/viewport/interpolateView.js.map +1 -0
  369. package/dist/core/viewport/meanScale.js +8 -0
  370. package/dist/core/viewport/meanScale.js.map +1 -0
  371. package/dist/core/viewport/parallax.js +111 -0
  372. package/dist/core/viewport/parallax.js.map +1 -0
  373. package/dist/core/viewport/pxExtent.js +42 -0
  374. package/dist/core/viewport/pxExtent.js.map +1 -0
  375. package/dist/core/viewport/sceneNodeClientRect.js +18 -0
  376. package/dist/core/viewport/sceneNodeClientRect.js.map +1 -0
  377. package/dist/core/viewport/screenSlop.js +27 -0
  378. package/dist/core/viewport/screenSlop.js.map +1 -0
  379. package/dist/core/viewport/useAutoCenter.js +32 -0
  380. package/dist/core/viewport/useAutoCenter.js.map +1 -0
  381. package/dist/core/viewport/useCanvasSize.js +29 -0
  382. package/dist/core/viewport/useCanvasSize.js.map +1 -0
  383. package/dist/core/viewport/useDecayLoop.js +63 -0
  384. package/dist/core/viewport/useDecayLoop.js.map +1 -0
  385. package/dist/core/viewport/useVelocityTracker.js +10 -0
  386. package/dist/core/viewport/useVelocityTracker.js.map +1 -0
  387. package/dist/core/viewport/useViewAnimation.js +63 -0
  388. package/dist/core/viewport/useViewAnimation.js.map +1 -0
  389. package/dist/core/viewport/view.js +37 -0
  390. package/dist/core/viewport/view.js.map +1 -0
  391. package/dist/core/viewport/viewTransform.js +11 -0
  392. package/dist/core/viewport/viewTransform.js.map +1 -0
  393. package/dist/core/viewport/viewportWorldRect.js +13 -0
  394. package/dist/core/viewport/viewportWorldRect.js.map +1 -0
  395. package/dist/core/viewport/wheelHandler.js +30 -0
  396. package/dist/core/viewport/wheelHandler.js.map +1 -0
  397. package/dist/core/viewport/zoomAt.js +22 -0
  398. package/dist/core/viewport/zoomAt.js.map +1 -0
  399. package/dist/core/viewport/zoomBounds.js +20 -0
  400. package/dist/core/viewport/zoomBounds.js.map +1 -0
  401. package/dist/{pointSnapToGrid-7mCcm6qG.d.ts → cornerHandles-CDcZOV8h.d.ts} +54 -71
  402. package/dist/debug/createDebugOverlayLayer.js +358 -0
  403. package/dist/debug/createDebugOverlayLayer.js.map +1 -0
  404. package/dist/debug/createDebugSink.js +83 -0
  405. package/dist/debug/createDebugSink.js.map +1 -0
  406. package/dist/debug/defaultTheme.js +31 -0
  407. package/dist/debug/defaultTheme.js.map +1 -0
  408. package/dist/debug/flag.js +41 -0
  409. package/dist/debug/flag.js.map +1 -0
  410. package/dist/debug/frameStats.js +16 -0
  411. package/dist/debug/frameStats.js.map +1 -0
  412. package/dist/debug/parseDebugFlags.js +32 -0
  413. package/dist/debug/parseDebugFlags.js.map +1 -0
  414. package/dist/features/chrome-caps/buildChromeCtx.js +16 -0
  415. package/dist/features/chrome-caps/buildChromeCtx.js.map +1 -0
  416. package/dist/features/chrome-caps/conditions.js +36 -0
  417. package/dist/features/chrome-caps/conditions.js.map +1 -0
  418. package/dist/features/chrome-caps/defaults.js +26 -0
  419. package/dist/features/chrome-caps/defaults.js.map +1 -0
  420. package/dist/features/chrome-caps/index.js +7 -0
  421. package/dist/features/chrome-caps/resolve.js +23 -0
  422. package/dist/features/chrome-caps/resolve.js.map +1 -0
  423. package/dist/features/chrome-caps/useHoverTracking.js +27 -0
  424. package/dist/features/chrome-caps/useHoverTracking.js.map +1 -0
  425. package/dist/features/cursor/paintedCursorLayer.js +60 -0
  426. package/dist/features/cursor/paintedCursorLayer.js.map +1 -0
  427. package/dist/features/focus/gateLayer.js +14 -0
  428. package/dist/features/focus/gateLayer.js.map +1 -0
  429. package/dist/features/focus/useCanvasFocus.js +29 -0
  430. package/dist/features/focus/useCanvasFocus.js.map +1 -0
  431. package/dist/features/groups/children.js +23 -0
  432. package/dist/features/groups/children.js.map +1 -0
  433. package/dist/features/groups/composePose.js +67 -0
  434. package/dist/features/groups/composePose.js.map +1 -0
  435. package/dist/features/groups/nestedHit.js +40 -0
  436. package/dist/features/groups/nestedHit.js.map +1 -0
  437. package/dist/features/groups/unionOfChildren.js +15 -0
  438. package/dist/features/groups/unionOfChildren.js.map +1 -0
  439. package/dist/features/images/imageCache.js +94 -0
  440. package/dist/features/images/imageCache.js.map +1 -0
  441. package/dist/features/ingestion/contentHandlers.js +37 -0
  442. package/dist/features/ingestion/contentHandlers.js.map +1 -0
  443. package/dist/features/ingestion/imageHandler.js +45 -0
  444. package/dist/features/ingestion/imageHandler.js.map +1 -0
  445. package/dist/features/ingestion/index.js +8 -0
  446. package/dist/features/ingestion/openFilePicker.js +15 -0
  447. package/dist/features/ingestion/openFilePicker.js.map +1 -0
  448. package/dist/features/ingestion/registerKitHandlers.js +26 -0
  449. package/dist/features/ingestion/registerKitHandlers.js.map +1 -0
  450. package/dist/features/ingestion/svgHandler.js +58 -0
  451. package/dist/features/ingestion/svgHandler.js.map +1 -0
  452. package/dist/features/ingestion/weaselJsonHandler.js +39 -0
  453. package/dist/features/ingestion/weaselJsonHandler.js.map +1 -0
  454. package/dist/features/longPress/longPressFeedback.js +96 -0
  455. package/dist/features/longPress/longPressFeedback.js.map +1 -0
  456. package/dist/features/meshPaint/bake.js +79 -0
  457. package/dist/features/meshPaint/bake.js.map +1 -0
  458. package/dist/features/meshPaint/bakeCache.js +59 -0
  459. package/dist/features/meshPaint/bakeCache.js.map +1 -0
  460. package/dist/features/meshPaint/handles.js +86 -0
  461. package/dist/features/meshPaint/handles.js.map +1 -0
  462. package/dist/features/meshPaint/lazyKind.js +1298 -0
  463. package/dist/features/meshPaint/lazyKind.js.map +1 -0
  464. package/dist/features/meshPaint/meshPaint.js +236 -0
  465. package/dist/features/meshPaint/meshPaint.js.map +1 -0
  466. package/dist/features/meshPaint/meshShader.js +6 -0
  467. package/dist/features/meshPaint/meshShader.js.map +1 -0
  468. package/dist/features/meshPaint/register.js +7 -0
  469. package/dist/features/meshPaint/register.js.map +1 -0
  470. package/dist/features/meshPaint/surface.js +110 -0
  471. package/dist/features/meshPaint/surface.js.map +1 -0
  472. package/dist/features/minimap/actions.js +53 -0
  473. package/dist/features/minimap/actions.js.map +1 -0
  474. package/dist/features/minimap/createMinimapContribution.js +96 -0
  475. package/dist/features/minimap/createMinimapContribution.js.map +1 -0
  476. package/dist/features/minimap/layers.js +103 -0
  477. package/dist/features/minimap/layers.js.map +1 -0
  478. package/dist/features/modes/modeLayers.js +113 -0
  479. package/dist/features/modes/modeLayers.js.map +1 -0
  480. package/dist/features/overlays/useNodeOverlayFrame.js +103 -0
  481. package/dist/features/overlays/useNodeOverlayFrame.js.map +1 -0
  482. package/dist/features/parallax/createParallaxLayer.js +26 -0
  483. package/dist/features/parallax/createParallaxLayer.js.map +1 -0
  484. package/dist/features/parallax/createParallaxPlane.js +26 -0
  485. package/dist/features/parallax/createParallaxPlane.js.map +1 -0
  486. package/dist/features/paths/anchorEdits.js +156 -0
  487. package/dist/features/paths/anchorEdits.js.map +1 -0
  488. package/dist/features/paths/anchors.js +154 -0
  489. package/dist/features/paths/anchors.js.map +1 -0
  490. package/dist/features/paths/booleans.js +2 -0
  491. package/dist/features/paths/index.js +15 -0
  492. package/dist/features/paths/markerCommands.js +116 -0
  493. package/dist/features/paths/markerCommands.js.map +1 -0
  494. package/dist/features/paths/markerSites.js +59 -0
  495. package/dist/features/paths/markerSites.js.map +1 -0
  496. package/dist/features/paths/markers.js +95 -0
  497. package/dist/features/paths/markers.js.map +1 -0
  498. package/dist/features/paths/nearestAnchor.js +36 -0
  499. package/dist/features/paths/nearestAnchor.js.map +1 -0
  500. package/dist/features/paths/originProjection.js +16 -0
  501. package/dist/features/paths/originProjection.js.map +1 -0
  502. package/dist/features/paths/pathEditingOverlayLayer.js +137 -0
  503. package/dist/features/paths/pathEditingOverlayLayer.js.map +1 -0
  504. package/dist/features/paths/pathInWorld.js +41 -0
  505. package/dist/features/paths/pathInWorld.js.map +1 -0
  506. package/dist/features/paths/pathLayer.js +44 -0
  507. package/dist/features/paths/pathLayer.js.map +1 -0
  508. package/dist/features/paths/penPreviewLayer.js +220 -0
  509. package/dist/features/paths/penPreviewLayer.js.map +1 -0
  510. package/dist/features/paths/poseDescriptor.js +44 -0
  511. package/dist/features/paths/poseDescriptor.js.map +1 -0
  512. package/dist/features/paths/tessellate/stroke.js +230 -0
  513. package/dist/features/paths/tessellate/stroke.js.map +1 -0
  514. package/dist/features/patterns/index.js +23 -0
  515. package/dist/features/patterns/index.js.map +1 -0
  516. package/dist/features/patterns/patterns-builtin.js +38 -0
  517. package/dist/features/patterns/patterns-builtin.js.map +1 -0
  518. package/dist/features/patterns/resolveSpec.js +57 -0
  519. package/dist/features/patterns/resolveSpec.js.map +1 -0
  520. package/dist/features/patterns/tileGeometry.js +158 -0
  521. package/dist/features/patterns/tileGeometry.js.map +1 -0
  522. package/dist/features/pointer/PointerContext.js +45 -0
  523. package/dist/features/pointer/PointerContext.js.map +1 -0
  524. package/dist/features/poseRun/usePoseRun.js +70 -0
  525. package/dist/features/poseRun/usePoseRun.js.map +1 -0
  526. package/dist/features/selection/SelectionContext.js +46 -0
  527. package/dist/features/selection/SelectionContext.js.map +1 -0
  528. package/dist/features/selection/overlay.js +442 -0
  529. package/dist/features/selection/overlay.js.map +1 -0
  530. package/dist/features/simulation/createSimulation.js +61 -0
  531. package/dist/features/simulation/createSimulation.js.map +1 -0
  532. package/dist/features/simulation/types.js +6 -0
  533. package/dist/features/simulation/types.js.map +1 -0
  534. package/dist/features/simulation/useSimulation.js +74 -0
  535. package/dist/features/simulation/useSimulation.js.map +1 -0
  536. package/dist/features/text/domRuns.js +258 -0
  537. package/dist/features/text/domRuns.js.map +1 -0
  538. package/dist/features/text/fitTextPose.js +38 -0
  539. package/dist/features/text/fitTextPose.js.map +1 -0
  540. package/dist/features/text/hitTest.js +45 -0
  541. package/dist/features/text/hitTest.js.map +1 -0
  542. package/dist/features/text/renderLabel.js +14 -0
  543. package/dist/features/text/renderLabel.js.map +1 -0
  544. package/dist/features/text/runs/effectiveRangeStyle.js +66 -0
  545. package/dist/features/text/runs/effectiveRangeStyle.js.map +1 -0
  546. package/dist/features/text/runs/flagRange.js +53 -0
  547. package/dist/features/text/runs/flagRange.js.map +1 -0
  548. package/dist/features/text/runs/rangeStyle.js +135 -0
  549. package/dist/features/text/runs/rangeStyle.js.map +1 -0
  550. package/dist/features/text/textCommand.js +59 -0
  551. package/dist/features/text/textCommand.js.map +1 -0
  552. package/dist/features/text/textLayer.js +35 -0
  553. package/dist/features/text/textLayer.js.map +1 -0
  554. package/dist/features/text/textToPath.js +181 -0
  555. package/dist/features/text/textToPath.js.map +1 -0
  556. package/dist/features/text/useSceneTextEdit.js +138 -0
  557. package/dist/features/text/useSceneTextEdit.js.map +1 -0
  558. package/dist/features/text/useTextEdit.js +465 -0
  559. package/dist/features/text/useTextEdit.js.map +1 -0
  560. package/dist/features/tiling/createTiledLayer.js +63 -0
  561. package/dist/features/tiling/createTiledLayer.js.map +1 -0
  562. package/dist/features/tiling/tiledProject.js +14 -0
  563. package/dist/features/tiling/tiledProject.js.map +1 -0
  564. package/dist/features/viewports/viewResolver.js +59 -0
  565. package/dist/features/viewports/viewResolver.js.map +1 -0
  566. package/dist/features/viewports/viewportLayer.js +58 -0
  567. package/dist/features/viewports/viewportLayer.js.map +1 -0
  568. package/dist/icons/ArrowIcon.js +23 -0
  569. package/dist/icons/ArrowIcon.js.map +1 -0
  570. package/dist/icons/EllipseIcon.js +21 -0
  571. package/dist/icons/EllipseIcon.js.map +1 -0
  572. package/dist/icons/EyedropperIcon.js +49 -0
  573. package/dist/icons/EyedropperIcon.js.map +1 -0
  574. package/dist/icons/HandIcon.js +59 -0
  575. package/dist/icons/HandIcon.js.map +1 -0
  576. package/dist/icons/ImageIcon.js +34 -0
  577. package/dist/icons/ImageIcon.js.map +1 -0
  578. package/dist/icons/LassoIcon.js +22 -0
  579. package/dist/icons/LassoIcon.js.map +1 -0
  580. package/dist/icons/LineIcon.js +22 -0
  581. package/dist/icons/LineIcon.js.map +1 -0
  582. package/dist/icons/PenIcon.js +36 -0
  583. package/dist/icons/PenIcon.js.map +1 -0
  584. package/dist/icons/PencilIcon.js +25 -0
  585. package/dist/icons/PencilIcon.js.map +1 -0
  586. package/dist/icons/PolygonIcon.js +19 -0
  587. package/dist/icons/PolygonIcon.js.map +1 -0
  588. package/dist/icons/RectIcon.js +37 -0
  589. package/dist/icons/RectIcon.js.map +1 -0
  590. package/dist/icons/SelectIcon.js +20 -0
  591. package/dist/icons/SelectIcon.js.map +1 -0
  592. package/dist/icons/StarIcon.js +19 -0
  593. package/dist/icons/StarIcon.js.map +1 -0
  594. package/dist/icons/TextIcon.js +19 -0
  595. package/dist/icons/TextIcon.js.map +1 -0
  596. package/dist/icons/UnknownIcon.js +33 -0
  597. package/dist/icons/UnknownIcon.js.map +1 -0
  598. package/dist/icons/_base.js +12 -0
  599. package/dist/icons/_base.js.map +1 -0
  600. package/dist/index.css +2 -86
  601. package/dist/index.d.ts +2349 -2609
  602. package/dist/index.js +312 -13
  603. package/dist/input/keyState.js +76 -0
  604. package/dist/input/keyState.js.map +1 -0
  605. package/dist/input/useKeyState.js +22 -0
  606. package/dist/input/useKeyState.js.map +1 -0
  607. package/dist/interactions/actions/actionShortcuts.js +32 -0
  608. package/dist/interactions/actions/actionShortcuts.js.map +1 -0
  609. package/dist/interactions/actions/align/align.js +81 -0
  610. package/dist/interactions/actions/align/align.js.map +1 -0
  611. package/dist/interactions/actions/booleans/booleans.js +120 -0
  612. package/dist/interactions/actions/booleans/booleans.js.map +1 -0
  613. package/dist/interactions/actions/booleans/useBooleans.js +20 -0
  614. package/dist/interactions/actions/booleans/useBooleans.js.map +1 -0
  615. package/dist/interactions/actions/booleans/useBooleansAdapter.js +9 -0
  616. package/dist/interactions/actions/booleans/useBooleansAdapter.js.map +1 -0
  617. package/dist/interactions/actions/clipboard/clipboardOps.js +94 -0
  618. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -0
  619. package/dist/interactions/actions/clipboard/materializePaste.js +25 -0
  620. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -0
  621. package/dist/interactions/actions/clipboard/wireFormat.js +43 -0
  622. package/dist/interactions/actions/clipboard/wireFormat.js.map +1 -0
  623. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js +26 -0
  624. package/dist/interactions/actions/clone/behaviors/cloneByAltDrag.js.map +1 -0
  625. package/dist/interactions/actions/defaultCommitAdapter.js +42 -0
  626. package/dist/interactions/actions/defaultCommitAdapter.js.map +1 -0
  627. package/dist/interactions/actions/defaults/align.js +71 -0
  628. package/dist/interactions/actions/defaults/align.js.map +1 -0
  629. package/dist/interactions/actions/defaults/anchorEditing.js +235 -0
  630. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -0
  631. package/dist/interactions/actions/defaults/areaSelect.js +75 -0
  632. package/dist/interactions/actions/defaults/areaSelect.js.map +1 -0
  633. package/dist/interactions/actions/defaults/booleans.js +52 -0
  634. package/dist/interactions/actions/defaults/booleans.js.map +1 -0
  635. package/dist/interactions/actions/defaults/cancelGesture.js +24 -0
  636. package/dist/interactions/actions/defaults/cancelGesture.js.map +1 -0
  637. package/dist/interactions/actions/defaults/clearSelection.js +19 -0
  638. package/dist/interactions/actions/defaults/clearSelection.js.map +1 -0
  639. package/dist/interactions/actions/defaults/clipboard.js +78 -0
  640. package/dist/interactions/actions/defaults/clipboard.js.map +1 -0
  641. package/dist/interactions/actions/defaults/clone.js +96 -0
  642. package/dist/interactions/actions/defaults/clone.js.map +1 -0
  643. package/dist/interactions/actions/defaults/createOutlines.js +47 -0
  644. package/dist/interactions/actions/defaults/createOutlines.js.map +1 -0
  645. package/dist/interactions/actions/defaults/createPaintAction.js +85 -0
  646. package/dist/interactions/actions/defaults/createPaintAction.js.map +1 -0
  647. package/dist/interactions/actions/defaults/delete.js +61 -0
  648. package/dist/interactions/actions/defaults/delete.js.map +1 -0
  649. package/dist/interactions/actions/defaults/distribute.js +66 -0
  650. package/dist/interactions/actions/defaults/distribute.js.map +1 -0
  651. package/dist/interactions/actions/defaults/duplicate.js +83 -0
  652. package/dist/interactions/actions/defaults/duplicate.js.map +1 -0
  653. package/dist/interactions/actions/defaults/editAnchors.js +100 -0
  654. package/dist/interactions/actions/defaults/editAnchors.js.map +1 -0
  655. package/dist/interactions/actions/defaults/enterPathEdit.js +29 -0
  656. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -0
  657. package/dist/interactions/actions/defaults/enterTextEdit.js +20 -0
  658. package/dist/interactions/actions/defaults/enterTextEdit.js.map +1 -0
  659. package/dist/interactions/actions/defaults/escape.js +26 -0
  660. package/dist/interactions/actions/defaults/escape.js.map +1 -0
  661. package/dist/interactions/actions/defaults/exitPathEdit.js +22 -0
  662. package/dist/interactions/actions/defaults/exitPathEdit.js.map +1 -0
  663. package/dist/interactions/actions/defaults/flip.js +119 -0
  664. package/dist/interactions/actions/defaults/flip.js.map +1 -0
  665. package/dist/interactions/actions/defaults/freshNodeId.js +10 -0
  666. package/dist/interactions/actions/defaults/freshNodeId.js.map +1 -0
  667. package/dist/interactions/actions/defaults/group.js +131 -0
  668. package/dist/interactions/actions/defaults/group.js.map +1 -0
  669. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js +40 -0
  670. package/dist/interactions/actions/defaults/icons/actionGlyphIcons.js.map +1 -0
  671. package/dist/interactions/actions/defaults/icons/actionGlyphs.js +10 -0
  672. package/dist/interactions/actions/defaults/icons/actionGlyphs.js.map +1 -0
  673. package/dist/interactions/actions/defaults/icons/alignIcons.js +173 -0
  674. package/dist/interactions/actions/defaults/icons/alignIcons.js.map +1 -0
  675. package/dist/interactions/actions/defaults/icons/booleanIcons.js +171 -0
  676. package/dist/interactions/actions/defaults/icons/booleanIcons.js.map +1 -0
  677. package/dist/interactions/actions/defaults/icons/distributeIcons.js +63 -0
  678. package/dist/interactions/actions/defaults/icons/distributeIcons.js.map +1 -0
  679. package/dist/interactions/actions/defaults/icons/editIcons.js +280 -0
  680. package/dist/interactions/actions/defaults/icons/editIcons.js.map +1 -0
  681. package/dist/interactions/actions/defaults/icons/outlineIcons.js +53 -0
  682. package/dist/interactions/actions/defaults/icons/outlineIcons.js.map +1 -0
  683. package/dist/interactions/actions/defaults/ingest.js +58 -0
  684. package/dist/interactions/actions/defaults/ingest.js.map +1 -0
  685. package/dist/interactions/actions/defaults/insert.js +288 -0
  686. package/dist/interactions/actions/defaults/insert.js.map +1 -0
  687. package/dist/interactions/actions/defaults/insertPathAnchor.js +50 -0
  688. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -0
  689. package/dist/interactions/actions/defaults/lassoSelect.js +156 -0
  690. package/dist/interactions/actions/defaults/lassoSelect.js.map +1 -0
  691. package/dist/interactions/actions/defaults/move.js +656 -0
  692. package/dist/interactions/actions/defaults/move.js.map +1 -0
  693. package/dist/interactions/actions/defaults/nudge.js +110 -0
  694. package/dist/interactions/actions/defaults/nudge.js.map +1 -0
  695. package/dist/interactions/actions/defaults/pinchZoom.js +63 -0
  696. package/dist/interactions/actions/defaults/pinchZoom.js.map +1 -0
  697. package/dist/interactions/actions/defaults/reorder.js +143 -0
  698. package/dist/interactions/actions/defaults/reorder.js.map +1 -0
  699. package/dist/interactions/actions/defaults/requiresSelection.js +10 -0
  700. package/dist/interactions/actions/defaults/requiresSelection.js.map +1 -0
  701. package/dist/interactions/actions/defaults/resize.js +332 -0
  702. package/dist/interactions/actions/defaults/resize.js.map +1 -0
  703. package/dist/interactions/actions/defaults/rotate.js +181 -0
  704. package/dist/interactions/actions/defaults/rotate.js.map +1 -0
  705. package/dist/interactions/actions/defaults/selectAll.js +27 -0
  706. package/dist/interactions/actions/defaults/selectAll.js.map +1 -0
  707. package/dist/interactions/actions/defaults/setFill.js +27 -0
  708. package/dist/interactions/actions/defaults/setFill.js.map +1 -0
  709. package/dist/interactions/actions/defaults/setFillOpacity.js +15 -0
  710. package/dist/interactions/actions/defaults/setFillOpacity.js.map +1 -0
  711. package/dist/interactions/actions/defaults/setStroke.js +36 -0
  712. package/dist/interactions/actions/defaults/setStroke.js.map +1 -0
  713. package/dist/interactions/actions/defaults/setStrokeOpacity.js +21 -0
  714. package/dist/interactions/actions/defaults/setStrokeOpacity.js.map +1 -0
  715. package/dist/interactions/actions/defaults/slice.js +39 -0
  716. package/dist/interactions/actions/defaults/slice.js.map +1 -0
  717. package/dist/interactions/actions/defaults/sliceOps.js +60 -0
  718. package/dist/interactions/actions/defaults/sliceOps.js.map +1 -0
  719. package/dist/interactions/actions/defaults/toolActivate.js +35 -0
  720. package/dist/interactions/actions/defaults/toolActivate.js.map +1 -0
  721. package/dist/interactions/actions/defaults/toolResetToDefault.js +26 -0
  722. package/dist/interactions/actions/defaults/toolResetToDefault.js.map +1 -0
  723. package/dist/interactions/actions/defaults/undoRedo.js +51 -0
  724. package/dist/interactions/actions/defaults/undoRedo.js.map +1 -0
  725. package/dist/interactions/actions/defaults/viewportDragPan.js +88 -0
  726. package/dist/interactions/actions/defaults/viewportDragPan.js.map +1 -0
  727. package/dist/interactions/actions/defaults/viewportWheelPan.js +57 -0
  728. package/dist/interactions/actions/defaults/viewportWheelPan.js.map +1 -0
  729. package/dist/interactions/actions/defaults/viewportZoom.js +143 -0
  730. package/dist/interactions/actions/defaults/viewportZoom.js.map +1 -0
  731. package/dist/interactions/actions/distribute/distribute.js +42 -0
  732. package/dist/interactions/actions/distribute/distribute.js.map +1 -0
  733. package/dist/interactions/actions/distribute/plan.js +29 -0
  734. package/dist/interactions/actions/distribute/plan.js.map +1 -0
  735. package/dist/interactions/actions/edit-anchors/geometry.js +61 -0
  736. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -0
  737. package/dist/interactions/actions/edit-anchors/handles.js +43 -0
  738. package/dist/interactions/actions/edit-anchors/handles.js.map +1 -0
  739. package/dist/interactions/actions/flip/helpers.js +35 -0
  740. package/dist/interactions/actions/flip/helpers.js.map +1 -0
  741. package/dist/interactions/actions/geometryProjection.js +18 -0
  742. package/dist/interactions/actions/geometryProjection.js.map +1 -0
  743. package/dist/interactions/actions/gestureLifecycle.js +44 -0
  744. package/dist/interactions/actions/gestureLifecycle.js.map +1 -0
  745. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js +39 -0
  746. package/dist/interactions/actions/lasso-select/behaviors/selectFromLasso.js.map +1 -0
  747. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js +36 -0
  748. package/dist/interactions/actions/move/behaviors/snapBackOrDelete.js.map +1 -0
  749. package/dist/interactions/actions/move/behaviors/snapToContainer.js +67 -0
  750. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -0
  751. package/dist/interactions/actions/move/gestureAdapter.js +37 -0
  752. package/dist/interactions/actions/move/gestureAdapter.js.map +1 -0
  753. package/dist/interactions/actions/outlines/createOutlines.js +84 -0
  754. package/dist/interactions/actions/outlines/createOutlines.js.map +1 -0
  755. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js +9 -0
  756. package/dist/interactions/actions/outlines/useCreateOutlinesAdapter.js.map +1 -0
  757. package/dist/interactions/actions/planeInput.js +168 -0
  758. package/dist/interactions/actions/planeInput.js.map +1 -0
  759. package/dist/interactions/actions/poseDescriptorDep.js +9 -0
  760. package/dist/interactions/actions/poseDescriptorDep.js.map +1 -0
  761. package/dist/interactions/actions/poseFrame.js +38 -0
  762. package/dist/interactions/actions/poseFrame.js.map +1 -0
  763. package/dist/interactions/actions/previewOverrides.js +25 -0
  764. package/dist/interactions/actions/previewOverrides.js.map +1 -0
  765. package/dist/interactions/actions/resize/autoPoseDescriptor.js +32 -0
  766. package/dist/interactions/actions/resize/autoPoseDescriptor.js.map +1 -0
  767. package/dist/interactions/actions/resize/behaviors/clampMinSize.js +18 -0
  768. package/dist/interactions/actions/resize/behaviors/clampMinSize.js.map +1 -0
  769. package/dist/interactions/actions/resize/behaviors/index.js +8 -0
  770. package/dist/interactions/actions/resize/behaviors/index.js.map +1 -0
  771. package/dist/interactions/actions/resize/behaviors/lockAspect.js +24 -0
  772. package/dist/interactions/actions/resize/behaviors/lockAspect.js.map +1 -0
  773. package/dist/interactions/actions/resize/cornerHandles.js +72 -0
  774. package/dist/interactions/actions/resize/cornerHandles.js.map +1 -0
  775. package/dist/interactions/actions/resolveOverlays.js +60 -0
  776. package/dist/interactions/actions/resolveOverlays.js.map +1 -0
  777. package/dist/interactions/actions/resolvePreviews.js +61 -0
  778. package/dist/interactions/actions/resolvePreviews.js.map +1 -0
  779. package/dist/interactions/actions/rotate/geometry.js +46 -0
  780. package/dist/interactions/actions/rotate/geometry.js.map +1 -0
  781. package/dist/interactions/actions/rotate/handle.js +27 -0
  782. package/dist/interactions/actions/rotate/handle.js.map +1 -0
  783. package/dist/interactions/actions/spatialReference.js +42 -0
  784. package/dist/interactions/actions/spatialReference.js.map +1 -0
  785. package/dist/interactions/actions/useStandardActions.js +142 -0
  786. package/dist/interactions/actions/useStandardActions.js.map +1 -0
  787. package/dist/interactions/gestures/dragGesture/dragGesture.js +111 -0
  788. package/dist/interactions/gestures/dragGesture/dragGesture.js.map +1 -0
  789. package/dist/interactions/gestures/dragRadial/dragRadial.js +117 -0
  790. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -0
  791. package/dist/interactions/gestures/dragRect/dragRect.js +164 -0
  792. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -0
  793. package/dist/interactions/gestures/handleDrag/handleDrag.js +46 -0
  794. package/dist/interactions/gestures/handleDrag/handleDrag.js.map +1 -0
  795. package/dist/interactions/gestures/pointerDrag/pointerDrag.js +118 -0
  796. package/dist/interactions/gestures/pointerDrag/pointerDrag.js.map +1 -0
  797. package/dist/interactions/gestures/shared/originProjection.js +42 -0
  798. package/dist/interactions/gestures/shared/originProjection.js.map +1 -0
  799. package/dist/interactions/gestures/shared/screenTolerance.js +21 -0
  800. package/dist/interactions/gestures/shared/screenTolerance.js.map +1 -0
  801. package/dist/interactions/gestures/shared/snap.js +24 -0
  802. package/dist/interactions/gestures/shared/snap.js.map +1 -0
  803. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js +30 -0
  804. package/dist/interactions/gestures/thresholdDrag/thresholdDrag.js.map +1 -0
  805. package/dist/layout/arrivals.js +36 -0
  806. package/dist/layout/arrivals.js.map +1 -0
  807. package/dist/{math-MCQcf_gc.d.ts → math-CUMxmZzn.d.ts} +8 -116
  808. package/dist/math.d.ts +4 -5
  809. package/dist/math.js +6 -4
  810. package/dist/mesh.d.ts +268 -0
  811. package/dist/mesh.js +7 -0
  812. package/dist/move.d.ts +7 -48
  813. package/dist/move.js +3 -142
  814. package/dist/originProjection-BSn4xiEy.d.ts +57 -0
  815. package/dist/patterns-builtin.js +3 -3
  816. package/dist/{poseDescriptor-rZa9W5hJ.d.ts → poseDescriptor-CjSXMf8X.d.ts} +3 -3
  817. package/dist/registerProgram-ateHDGjw.d.ts +193 -0
  818. package/dist/renderer/DrawCommand.js +6 -0
  819. package/dist/renderer/DrawCommand.js.map +1 -0
  820. package/dist/renderer/WeaselRenderer.js +328 -0
  821. package/dist/renderer/WeaselRenderer.js.map +1 -0
  822. package/dist/renderer/cache/GLImageCache.js +64 -0
  823. package/dist/renderer/cache/GLImageCache.js.map +1 -0
  824. package/dist/renderer/cache/GLMeshCache.js +102 -0
  825. package/dist/renderer/cache/GLMeshCache.js.map +1 -0
  826. package/dist/renderer/cache/GLTextureCache.js +51 -0
  827. package/dist/renderer/cache/GLTextureCache.js.map +1 -0
  828. package/dist/renderer/cache/GradientRampAtlas.js +82 -0
  829. package/dist/renderer/cache/GradientRampAtlas.js.map +1 -0
  830. package/dist/renderer/cache/cache.js +13 -0
  831. package/dist/renderer/cache/cache.js.map +1 -0
  832. package/dist/renderer/cache/markerCommandCache.js +59 -0
  833. package/dist/renderer/cache/markerCommandCache.js.map +1 -0
  834. package/dist/renderer/cache/outlineMeshCache.js +15 -0
  835. package/dist/renderer/cache/outlineMeshCache.js.map +1 -0
  836. package/dist/renderer/cache/outlineStrokeMeshCache.js +31 -0
  837. package/dist/renderer/cache/outlineStrokeMeshCache.js.map +1 -0
  838. package/dist/renderer/cache/strokeMeshCache.js +44 -0
  839. package/dist/renderer/cache/strokeMeshCache.js.map +1 -0
  840. package/dist/renderer/cullDrawCommands.js +89 -0
  841. package/dist/renderer/cullDrawCommands.js.map +1 -0
  842. package/dist/renderer/draw.js +1109 -0
  843. package/dist/renderer/draw.js.map +1 -0
  844. package/dist/renderer/drawBatch.js +168 -0
  845. package/dist/renderer/drawBatch.js.map +1 -0
  846. package/dist/renderer/effects/EffectTargets.js +45 -0
  847. package/dist/renderer/effects/EffectTargets.js.map +1 -0
  848. package/dist/renderer/effects/builtins.js +31 -0
  849. package/dist/renderer/effects/builtins.js.map +1 -0
  850. package/dist/renderer/effects/composite.js +9 -0
  851. package/dist/renderer/effects/composite.js.map +1 -0
  852. package/dist/renderer/effects/effectPrelude.js +10 -0
  853. package/dist/renderer/effects/effectPrelude.js.map +1 -0
  854. package/dist/renderer/effects/types.js +10 -0
  855. package/dist/renderer/effects/types.js.map +1 -0
  856. package/dist/renderer/index.js +19 -0
  857. package/dist/renderer/math/color.js +341 -0
  858. package/dist/renderer/math/color.js.map +1 -0
  859. package/dist/renderer/math/mat3.js +71 -0
  860. package/dist/renderer/math/mat3.js.map +1 -0
  861. package/dist/renderer/math/patternSpace.js +22 -0
  862. package/dist/renderer/math/patternSpace.js.map +1 -0
  863. package/dist/renderer/math/viewToMat3.js +19 -0
  864. package/dist/renderer/math/viewToMat3.js.map +1 -0
  865. package/dist/renderer/paintResources.js +18 -0
  866. package/dist/renderer/paintResources.js.map +1 -0
  867. package/dist/renderer/paintScratch.js +37 -0
  868. package/dist/renderer/paintScratch.js.map +1 -0
  869. package/dist/renderer/shaders/ShaderProgram.js +74 -0
  870. package/dist/renderer/shaders/ShaderProgram.js.map +1 -0
  871. package/dist/renderer/shaders/batchFill.js +118 -0
  872. package/dist/renderer/shaders/batchFill.js.map +1 -0
  873. package/dist/renderer/shaders/customPrelude.js +34 -0
  874. package/dist/renderer/shaders/customPrelude.js.map +1 -0
  875. package/dist/renderer/shaders/extractUniformNames.js +184 -0
  876. package/dist/renderer/shaders/extractUniformNames.js.map +1 -0
  877. package/dist/renderer/shaders/glyphPaint.js +61 -0
  878. package/dist/renderer/shaders/glyphPaint.js.map +1 -0
  879. package/dist/renderer/shaders/gradFill.js +30 -0
  880. package/dist/renderer/shaders/gradFill.js.map +1 -0
  881. package/dist/renderer/shaders/imageFill.js +14 -0
  882. package/dist/renderer/shaders/imageFill.js.map +1 -0
  883. package/dist/renderer/shaders/pathFill.js +13 -0
  884. package/dist/renderer/shaders/pathFill.js.map +1 -0
  885. package/dist/renderer/shaders/patternFill.js +24 -0
  886. package/dist/renderer/shaders/patternFill.js.map +1 -0
  887. package/dist/renderer/shaders/registerProgram.js +18 -0
  888. package/dist/renderer/shaders/registerProgram.js.map +1 -0
  889. package/dist/renderer/spriteSheet.js +14 -0
  890. package/dist/renderer/spriteSheet.js.map +1 -0
  891. package/dist/renderer/state/GroupState.js +77 -0
  892. package/dist/renderer/state/GroupState.js.map +1 -0
  893. package/dist/renderer/syntheticItalic.js +6 -0
  894. package/dist/renderer/syntheticItalic.js.map +1 -0
  895. package/dist/renderer/textures/registerTexture.js +14 -0
  896. package/dist/renderer/textures/registerTexture.js.map +1 -0
  897. package/dist/renderer.d.ts +18 -20
  898. package/dist/renderer.js +18 -13
  899. package/dist/resize.d.ts +10 -46
  900. package/dist/resize.js +7 -5
  901. package/dist/routing.d.ts +1 -1
  902. package/dist/routing.js +2 -3
  903. package/dist/scheduling/useVisibleRaf.js +69 -0
  904. package/dist/scheduling/useVisibleRaf.js.map +1 -0
  905. package/dist/test-hook/createTestHook.js +39 -0
  906. package/dist/test-hook/createTestHook.js.map +1 -0
  907. package/dist/test-hook/install.js +12 -0
  908. package/dist/test-hook/install.js.map +1 -0
  909. package/dist/test-seams-fYf6m5pu.d.ts +356 -0
  910. package/dist/test-seams.d.ts +6 -0
  911. package/dist/test-seams.js +3 -0
  912. package/dist/tools/builtin/ellipse/useEllipseTool.js +33 -0
  913. package/dist/tools/builtin/ellipse/useEllipseTool.js.map +1 -0
  914. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +55 -0
  915. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -0
  916. package/dist/tools/builtin/hand/dragPanContribution.js +17 -0
  917. package/dist/tools/builtin/hand/dragPanContribution.js.map +1 -0
  918. package/dist/tools/builtin/hand/useHandTool.js +31 -0
  919. package/dist/tools/builtin/hand/useHandTool.js.map +1 -0
  920. package/dist/tools/builtin/image/useImageTool.js +41 -0
  921. package/dist/tools/builtin/image/useImageTool.js.map +1 -0
  922. package/dist/tools/builtin/lasso/useLassoTool.js +42 -0
  923. package/dist/tools/builtin/lasso/useLassoTool.js.map +1 -0
  924. package/dist/tools/builtin/line/useLineTool.js +33 -0
  925. package/dist/tools/builtin/line/useLineTool.js.map +1 -0
  926. package/dist/tools/builtin/pen/usePenTool.js +414 -0
  927. package/dist/tools/builtin/pen/usePenTool.js.map +1 -0
  928. package/dist/tools/builtin/pencil/usePencilTool.js +36 -0
  929. package/dist/tools/builtin/pencil/usePencilTool.js.map +1 -0
  930. package/dist/tools/builtin/pickTopMostHit.js +45 -0
  931. package/dist/tools/builtin/pickTopMostHit.js.map +1 -0
  932. package/dist/tools/builtin/polygon/usePolygonTool.js +81 -0
  933. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -0
  934. package/dist/tools/builtin/rect/useRectTool.js +32 -0
  935. package/dist/tools/builtin/rect/useRectTool.js.map +1 -0
  936. package/dist/tools/builtin/select/selectionContributions.js +109 -0
  937. package/dist/tools/builtin/select/selectionContributions.js.map +1 -0
  938. package/dist/tools/builtin/select/useSelectTool.js +162 -0
  939. package/dist/tools/builtin/select/useSelectTool.js.map +1 -0
  940. package/dist/tools/builtin/shared/insertToolOptions.js +8 -0
  941. package/dist/tools/builtin/shared/insertToolOptions.js.map +1 -0
  942. package/dist/tools/builtin/slice/useSliceTool.js +263 -0
  943. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -0
  944. package/dist/tools/builtin/star/useStarTool.js +82 -0
  945. package/dist/tools/builtin/star/useStarTool.js.map +1 -0
  946. package/dist/tools/builtin/text/useTextTool.js +177 -0
  947. package/dist/tools/builtin/text/useTextTool.js.map +1 -0
  948. package/dist/tools/overlayBinding.js +8 -0
  949. package/dist/tools/overlayBinding.js.map +1 -0
  950. package/dist/tools/prefs.js +47 -0
  951. package/dist/tools/prefs.js.map +1 -0
  952. package/dist/tools/useKeybindings.js +66 -0
  953. package/dist/tools/useKeybindings.js.map +1 -0
  954. package/dist/{types-CxC8P6W0.d.ts → types-CA54-mAZ.d.ts} +188 -17
  955. package/dist/{types-D_74YlWs.d.ts → types-DSjd6W3n.d.ts} +35 -12
  956. package/dist/util/color.js +26 -0
  957. package/dist/util/color.js.map +1 -0
  958. package/dist/util/constrainTo45.js +17 -0
  959. package/dist/util/constrainTo45.js.map +1 -0
  960. package/dist/util/paint.js +72 -0
  961. package/dist/util/paint.js.map +1 -0
  962. package/dist/version.js +6 -0
  963. package/dist/version.js.map +1 -0
  964. package/package.json +31 -18
  965. package/dist/chunk-44EWMJV2.js +0 -128
  966. package/dist/chunk-44EWMJV2.js.map +0 -1
  967. package/dist/chunk-4RJP2N2L.js +0 -143
  968. package/dist/chunk-4RJP2N2L.js.map +0 -1
  969. package/dist/chunk-BJN5ZRIJ.js +0 -167
  970. package/dist/chunk-BJN5ZRIJ.js.map +0 -1
  971. package/dist/chunk-D4AAWR64.js +0 -28
  972. package/dist/chunk-D4AAWR64.js.map +0 -1
  973. package/dist/chunk-DOBSZOPR.js +0 -29
  974. package/dist/chunk-DOBSZOPR.js.map +0 -1
  975. package/dist/chunk-H6N2JSZ3.js +0 -248
  976. package/dist/chunk-H6N2JSZ3.js.map +0 -1
  977. package/dist/chunk-HPFJUUTF.js +0 -167
  978. package/dist/chunk-HPFJUUTF.js.map +0 -1
  979. package/dist/chunk-L5YNZYEG.js +0 -648
  980. package/dist/chunk-L5YNZYEG.js.map +0 -1
  981. package/dist/chunk-MZAIDI6D.js +0 -32492
  982. package/dist/chunk-MZAIDI6D.js.map +0 -1
  983. package/dist/chunk-PNNZSYRD.js +0 -318
  984. package/dist/chunk-PNNZSYRD.js.map +0 -1
  985. package/dist/chunk-RMR4QMM6.js +0 -250
  986. package/dist/chunk-RMR4QMM6.js.map +0 -1
  987. package/dist/clipboard.js.map +0 -1
  988. package/dist/clone.js.map +0 -1
  989. package/dist/grid-BXdz8GF2.d.ts +0 -158
  990. package/dist/index.css.map +0 -1
  991. package/dist/index.js.map +0 -1
  992. package/dist/insert.d.ts +0 -37
  993. package/dist/insert.js +0 -81
  994. package/dist/insert.js.map +0 -1
  995. package/dist/math.js.map +0 -1
  996. package/dist/move.js.map +0 -1
  997. package/dist/options-CzjxFoYZ.d.ts +0 -67
  998. package/dist/path-JEV2c5If.d.ts +0 -48
  999. package/dist/patterns-builtin.js.map +0 -1
  1000. package/dist/renderer.css +0 -86
  1001. package/dist/renderer.css.map +0 -1
  1002. package/dist/renderer.js.map +0 -1
  1003. package/dist/resize.js.map +0 -1
  1004. package/dist/routing.js.map +0 -1
  1005. package/dist/types-D2tTKEU0.d.ts +0 -18
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lazyKind.js","names":[],"sources":["../../../../paint/dist/index.js","../../../src/renderer/math/color.ts","../../../src/features/meshPaint/surface.ts","../../../src/features/meshPaint/bake.ts","../../../src/features/meshPaint/bakeCache.ts","../../../src/features/meshPaint/meshShader.ts","../../../src/features/meshPaint/meshPaint.ts"],"sourcesContent":["// src/patternTransform.ts\nfunction composePatternTransform(parts) {\n const { rotation = 0, scaleX = 1, scaleY = 1, skewX = 0 } = parts;\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const shear = Math.tan(skewX) * scaleY;\n return [\n cos * scaleX,\n sin * scaleX,\n cos * shear - sin * scaleY,\n sin * shear + cos * scaleY\n ];\n}\nfunction decomposePatternTransform(t) {\n if (!t) return { rotation: 0, scaleX: 1, scaleY: 1, skewX: 0 };\n const [a, b, c, d] = t;\n const scaleX = Math.hypot(a, b);\n const rotation = scaleX === 0 ? 0 : Math.atan2(b, a);\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n const shear = c * cos + d * sin;\n const scaleY = d * cos - c * sin;\n const skewX = scaleY === 0 ? 0 : Math.atan(shear / scaleY);\n return { rotation, scaleX, scaleY, skewX };\n}\n\n// src/paint.ts\nfunction resolveScreenLength(value, scale) {\n if (typeof value === \"number\") return value;\n if (!Number.isFinite(scale) || scale === 0) return value.px;\n return value.px / scale;\n}\nfunction alignedStrokeRect(rect, align, width = 1) {\n if (align === \"center\") return rect;\n const sign = align === \"inner\" ? -1 : 1;\n const d = sign * width / 2;\n return {\n x: rect.x - d,\n y: rect.y - d,\n width: rect.width + 2 * d,\n height: rect.height + 2 * d\n };\n}\nvar STROKE_DASH_RATIOS = {\n dashed: [3, 2],\n dotted: [1, 2]\n};\nfunction dashWidth(width) {\n const w = typeof width === \"object\" ? width.px : width ?? 1;\n return Number.isFinite(w) && w > 0 ? w : 1;\n}\nfunction dashForStrokeStyle(style, width) {\n if (style !== \"dashed\" && style !== \"dotted\") return void 0;\n const w = dashWidth(width);\n return STROKE_DASH_RATIOS[style].map((r) => r * w);\n}\nfunction strokeDashStyleOf(dash, width) {\n if (dash === void 0 || dash.length === 0 || dash.every((v) => v === 0)) return \"solid\";\n const w = dashWidth(width);\n for (const style of [\"dashed\", \"dotted\"]) {\n const preset = STROKE_DASH_RATIOS[style];\n if (dash.length === preset.length && preset.every((r, i) => Math.abs(dash[i] - r * w) <= w * 1e-3)) {\n return style;\n }\n }\n return \"custom\";\n}\n\n// src/colorSpaces.ts\nvar SRGB_TO_LINEAR = (() => {\n const lut = new Float64Array(256);\n for (let i = 0; i < 256; i++) {\n const c = i / 255;\n lut[i] = c <= 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n }\n return lut;\n})();\nfunction linearToSrgbByte(c) {\n if (c <= 0) return 0;\n if (c >= 1) return 255;\n const v = c <= 31308e-7 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n return Math.round(v * 255);\n}\nvar f2u = (v) => Math.max(0, Math.min(255, Math.round(v * 255)));\nfunction srgbFloatToOklab(r, g, b) {\n return srgbU8ToOklab(f2u(r), f2u(g), f2u(b));\n}\nfunction srgbU8ToOklab(r, g, b) {\n return linearSrgbToOklab(SRGB_TO_LINEAR[r & 255], SRGB_TO_LINEAR[g & 255], SRGB_TO_LINEAR[b & 255]);\n}\nfunction linearSrgbToOklab(rl, gl, bl) {\n const l = 0.4122214708 * rl + 0.5363325363 * gl + 0.0514459929 * bl;\n const m = 0.2119034982 * rl + 0.6806995451 * gl + 0.1073969566 * bl;\n const s = 0.0883024619 * rl + 0.2817188376 * gl + 0.6299787005 * bl;\n const lp = Math.cbrt(l);\n const mp = Math.cbrt(m);\n const sp = Math.cbrt(s);\n return [\n 0.2104542553 * lp + 0.793617785 * mp - 0.0040720468 * sp,\n 1.9779984951 * lp - 2.428592205 * mp + 0.4505937099 * sp,\n 0.0259040371 * lp + 0.7827717662 * mp - 0.808675766 * sp\n ];\n}\nfunction oklabToLinearSrgb(L, A, B) {\n const lp = L + 0.3963377774 * A + 0.2158037573 * B;\n const mp = L - 0.1055613458 * A - 0.0638541728 * B;\n const sp = L - 0.0894841775 * A - 1.291485548 * B;\n const l = lp * lp * lp;\n const m = mp * mp * mp;\n const s = sp * sp * sp;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s\n ];\n}\nfunction inGamut(rl, gl, bl) {\n const eps = 1e-6;\n return rl >= -eps && rl <= 1 + eps && gl >= -eps && gl <= 1 + eps && bl >= -eps && bl <= 1 + eps;\n}\nfunction clipToGamut(L, A, B) {\n let [rl, gl, bl] = oklabToLinearSrgb(L, A, B);\n if (inGamut(rl, gl, bl)) return [rl, gl, bl];\n let lo = 0;\n let hi = 1;\n for (let i = 0; i < 5; i++) {\n const t = (lo + hi) / 2;\n [rl, gl, bl] = oklabToLinearSrgb(L, A * t, B * t);\n if (inGamut(rl, gl, bl)) lo = t;\n else hi = t;\n }\n [rl, gl, bl] = oklabToLinearSrgb(L, A * lo, B * lo);\n return [rl, gl, bl];\n}\nfunction oklabToSrgbU8(L, A, B) {\n const [rl, gl, bl] = clipToGamut(L, A, B);\n return [linearToSrgbByte(rl), linearToSrgbByte(gl), linearToSrgbByte(bl)];\n}\nfunction lerpOklab(from, to, t) {\n return [\n from[0] + (to[0] - from[0]) * t,\n from[1] + (to[1] - from[1]) * t,\n from[2] + (to[2] - from[2]) * t\n ];\n}\nfunction mixOklab(a, b, p) {\n const alpha = a[3] * p + b[3] * (1 - p);\n if (alpha === 0) return [0, 0, 0, 0];\n const la = srgbFloatToOklab(a[0], a[1], a[2]);\n const lb = srgbFloatToOklab(b[0], b[1], b[2]);\n const mix = (i) => (la[i] * a[3] * p + lb[i] * b[3] * (1 - p)) / alpha;\n const [r, g, bl] = oklabToSrgbU8(mix(0), mix(1), mix(2));\n return [r / 255, g / 255, bl / 255, alpha];\n}\nfunction oklabToOklch(L, A, B) {\n const C = Math.hypot(A, B);\n const h = Math.atan2(B, A);\n return [L, C, h];\n}\nfunction oklchToOklab(L, C, h) {\n return [L, C * Math.cos(h), C * Math.sin(h)];\n}\nfunction lerpOklch(from, to, t) {\n const [L1, C1, h1Raw] = from;\n const [L2, C2, h2Raw] = to;\n const C_EPS = 1e-4;\n const h1 = C1 < C_EPS ? h2Raw : h1Raw;\n const h2 = C2 < C_EPS ? h1Raw : h2Raw;\n const TWO_PI = Math.PI * 2;\n let dh = h2 - h1;\n while (dh > Math.PI) dh -= TWO_PI;\n while (dh < -Math.PI) dh += TWO_PI;\n return [\n L1 + (L2 - L1) * t,\n C1 + (C2 - C1) * t,\n h1 + dh * t\n ];\n}\nvar u2f = (v) => v / 255;\nfunction lerpColorArray(from, to, t, space = \"rgb\") {\n if (from.length !== to.length) {\n throw new Error(`lerpColorArray: length mismatch (from=${from.length}, to=${to.length})`);\n }\n if (from.length % 4 !== 0) {\n throw new Error(`lerpColorArray: length ${from.length} not divisible by 4`);\n }\n const out = new Array(from.length);\n const n = from.length / 4;\n if (space === \"rgb\") {\n for (let i = 0; i < from.length; i++) {\n out[i] = from[i] + (to[i] - from[i]) * t;\n }\n return out;\n }\n if (space === \"oklch\") {\n for (let i = 0; i < n; i++) {\n const k = i * 4;\n const fLab = srgbU8ToOklab(f2u(from[k]), f2u(from[k + 1]), f2u(from[k + 2]));\n const tLab = srgbU8ToOklab(f2u(to[k]), f2u(to[k + 1]), f2u(to[k + 2]));\n const fLch = oklabToOklch(fLab[0], fLab[1], fLab[2]);\n const tLch = oklabToOklch(tLab[0], tLab[1], tLab[2]);\n const midLch = lerpOklch(fLch, tLch, t);\n const midLab = oklchToOklab(midLch[0], midLch[1], midLch[2]);\n const [r, g, b] = oklabToSrgbU8(midLab[0], midLab[1], midLab[2]);\n out[k] = u2f(r);\n out[k + 1] = u2f(g);\n out[k + 2] = u2f(b);\n out[k + 3] = from[k + 3] + (to[k + 3] - from[k + 3]) * t;\n }\n return out;\n }\n for (let i = 0; i < n; i++) {\n const k = i * 4;\n const fLab = srgbU8ToOklab(f2u(from[k]), f2u(from[k + 1]), f2u(from[k + 2]));\n const tLab = srgbU8ToOklab(f2u(to[k]), f2u(to[k + 1]), f2u(to[k + 2]));\n const mid = lerpOklab(fLab, tLab, t);\n const [r, g, b] = oklabToSrgbU8(mid[0], mid[1], mid[2]);\n out[k] = u2f(r);\n out[k + 1] = u2f(g);\n out[k + 2] = u2f(b);\n out[k + 3] = from[k + 3] + (to[k + 3] - from[k + 3]) * t;\n }\n return out;\n}\nvar hex2 = (v) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, \"0\");\nfunction oklchDegToHex(L, C, hueDeg) {\n const [l, a, b] = oklchToOklab(L, C, hueDeg * Math.PI / 180);\n const [r, g, bl] = oklabToSrgbU8(l, a, b);\n return `#${hex2(r)}${hex2(g)}${hex2(bl)}`;\n}\nfunction hexToOklchDeg(hex) {\n const n = Number.parseInt(hex.slice(1), 16);\n const [L, A, B] = srgbU8ToOklab(n >> 16 & 255, n >> 8 & 255, n & 255);\n const [l, c, h] = oklabToOklch(L, A, B);\n return { L: l, C: c, H: (h * 180 / Math.PI % 360 + 360) % 360 };\n}\nfunction srgbToLinear(c) {\n const a = Math.abs(c);\n const v = a <= 0.04045 ? a / 12.92 : Math.pow((a + 0.055) / 1.055, 2.4);\n return c < 0 ? -v : v;\n}\nfunction linearToSrgb(c) {\n const a = Math.abs(c);\n const v = a <= 31308e-7 ? a * 12.92 : 1.055 * Math.pow(a, 1 / 2.4) - 0.055;\n return c < 0 ? -v : v;\n}\nfunction hslToSrgb(h, s, l) {\n if (s === 0) return [l, l, l];\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n const hk = h / 360;\n return [hueToChannel(p, q, hk + 1 / 3), hueToChannel(p, q, hk), hueToChannel(p, q, hk - 1 / 3)];\n}\nfunction hueToChannel(p, q, t) {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n}\nfunction srgbToHsl(r, g, b) {\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n const d = max - min;\n if (d === 0) return [0, 0, l];\n const s = d / (1 - Math.abs(2 * l - 1));\n let h;\n if (max === r) h = (g - b) / d % 6;\n else if (max === g) h = (b - r) / d + 2;\n else h = (r - g) / d + 4;\n return [(h * 60 % 360 + 360) % 360, s, l];\n}\nvar ACHROMATIC_EPS = 1e-4;\nfunction lerpHueDeg(h1, h2, t, method) {\n let dh = ((h2 - h1) % 360 + 360) % 360;\n if (method === \"shorter\") {\n if (dh > 180) dh -= 360;\n } else if (dh > 0 && dh < 180) {\n dh -= 360;\n }\n return ((h1 + dh * t) % 360 + 360) % 360;\n}\nfunction lerpPolar(a, b, t, method) {\n const h1 = a[0] < ACHROMATIC_EPS ? b[1] : a[1];\n const h2 = b[0] < ACHROMATIC_EPS ? a[1] : b[1];\n return [a[0] + (b[0] - a[0]) * t, lerpHueDeg(h1, h2, t, method), a[2] + (b[2] - a[2]) * t];\n}\nvar lerp3 = (a, b, t) => [\n a[0] + (b[0] - a[0]) * t,\n a[1] + (b[1] - a[1]) * t,\n a[2] + (b[2] - a[2]) * t\n];\nvar clamp01 = (v) => v < 0 ? 0 : v > 1 ? 1 : v;\nvar srgbToOklabFloat = (c) => linearSrgbToOklab(srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2]));\nfunction oklabToSrgbClipped(L, A, B) {\n const [rl, gl, bl] = clipToGamut(L, A, B);\n return [clamp01(linearToSrgb(rl)), clamp01(linearToSrgb(gl)), clamp01(linearToSrgb(bl))];\n}\nfunction interpolateSrgb(from, to, t, space = \"oklch\", hue = \"shorter\") {\n switch (space) {\n case \"srgb\":\n return lerp3(from, to, t);\n case \"srgb-linear\": {\n const lin = (c) => [srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2])];\n const [r, g, b] = lerp3(lin(from), lin(to), t);\n return [linearToSrgb(r), linearToSrgb(g), linearToSrgb(b)];\n }\n case \"oklab\": {\n const [L, A, B] = lerp3(srgbToOklabFloat(from), srgbToOklabFloat(to), t);\n return oklabToSrgbClipped(L, A, B);\n }\n case \"oklch\": {\n const polar = (c) => {\n const [L2, C2, h] = oklabToOklch(...srgbToOklabFloat(c));\n return [C2, (h * 180 / Math.PI % 360 + 360) % 360, L2];\n };\n const [C, H, L] = lerpPolar(polar(from), polar(to), t, hue);\n const [l, a, b] = oklchToOklab(L, C, H * Math.PI / 180);\n return oklabToSrgbClipped(l, a, b);\n }\n case \"hsl\": {\n const polar = (c) => {\n const [h2, s2, l2] = srgbToHsl(c[0], c[1], c[2]);\n return [s2, h2, l2];\n };\n const [s, h, l] = lerpPolar(polar(from), polar(to), t, hue);\n return hslToSrgb(h, s, l);\n }\n }\n}\n\n// src/contrast.ts\nvar hex22 = (v) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, \"0\");\nfunction readHex(color) {\n const m = /^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$/i.exec(color.trim());\n if (!m) return null;\n let h = m[1];\n if (h.length === 3) h = h.replace(/./g, (c) => c + c);\n const n = Number.parseInt(h.slice(0, 6), 16);\n return [n >> 16 & 255, n >> 8 & 255, n & 255];\n}\nfunction contrastLineColor(background, strength) {\n const rgb = readHex(background);\n if (!rgb) return `rgba(0, 0, 0, ${strength})`;\n const [L, A, B] = srgbU8ToOklab(rgb[0], rgb[1], rgb[2]);\n const next = L > 0.5 ? Math.max(0, L - strength) : Math.min(1, L + strength);\n const [r, g, b] = oklabToSrgbU8(next, A, B);\n return `#${hex22(r)}${hex22(g)}${hex22(b)}`;\n}\n\n// src/palette.ts\nfunction nth(items, n) {\n if (!Number.isInteger(n) || n < 0) return void 0;\n let i = 0;\n for (const item of items) if (i++ === n) return item;\n return void 0;\n}\nvar refKey = (name, index) => `${index}:${name}`;\nfunction resolver(palette, external) {\n const byName = /* @__PURE__ */ new Map();\n for (const e of palette.entries) if (!byName.has(e.name)) byName.set(e.name, e);\n const ctx = (visiting) => ({ resolve: (s) => visit(s, visiting) });\n const visit = (s, visiting) => {\n if (s == null) return null;\n if (typeof s === \"function\") return visit(s(ctx(visiting)), visiting);\n if (\"space\" in s) return s;\n const index = s.index ?? 0;\n const key = refKey(s.ref, index);\n if (visiting.has(key)) return null;\n const next = new Set(visiting).add(key);\n const entry = byName.get(s.ref);\n if (!entry) return visit(external?.(s), next);\n if (\"color\" in entry) return index === 0 ? visit(entry.color, next) : null;\n return visit(nth(entry.colors(ctx(next)), index), next);\n };\n return { byName, ctx, visit };\n}\nfunction resolvePaletteColor(palette, source, external) {\n return resolver(palette, external).visit(source, /* @__PURE__ */ new Set());\n}\nfunction* resolvePaletteColors(palette, name, external) {\n const { byName, ctx, visit } = resolver(palette, external);\n const entry = byName.get(name);\n if (!entry) return;\n if (\"color\" in entry) {\n yield visit(entry.color, /* @__PURE__ */ new Set([refKey(name, 0)]));\n return;\n }\n let i = 0;\n for (const item of entry.colors(ctx(/* @__PURE__ */ new Set()))) {\n yield visit(item, /* @__PURE__ */ new Set([refKey(name, i++)]));\n }\n}\nvar hex23 = (v) => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, \"0\");\nfunction colorLiteralToHex(color) {\n const [x, y, z] = color.coords;\n if (z === void 0) return null;\n let rgb;\n switch (color.space) {\n case \"srgb\":\n rgb = [x * 255, y * 255, z * 255];\n break;\n case \"oklab\":\n rgb = oklabToSrgbU8(x, y, z);\n break;\n case \"oklch\":\n rgb = oklabToSrgbU8(...oklchToOklab(x, y, z * Math.PI / 180));\n break;\n default:\n return null;\n }\n const a = color.alpha ?? 1;\n return `#${rgb.map(hex23).join(\"\")}${a < 1 ? hex23(a * 255) : \"\"}`;\n}\nfunction hexToColorLiteral(hex) {\n if (!/^#(?:[0-9a-f]{6}|[0-9a-f]{8})$/i.test(hex)) return null;\n const byte = (i) => Number.parseInt(hex.slice(i, i + 2), 16) / 255;\n const coords = [byte(1), byte(3), byte(5)];\n return hex.length === 9 ? { space: \"srgb\", coords, alpha: byte(7) } : { space: \"srgb\", coords };\n}\n\nexport { STROKE_DASH_RATIOS, alignedStrokeRect, colorLiteralToHex, composePatternTransform, contrastLineColor, dashForStrokeStyle, decomposePatternTransform, hexToColorLiteral, hexToOklchDeg, hslToSrgb, interpolateSrgb, lerpColorArray, lerpOklab, lerpOklch, linearSrgbToOklab, linearToSrgb, mixOklab, oklabToLinearSrgb, oklabToOklch, oklabToSrgbU8, oklchDegToHex, oklchToOklab, resolvePaletteColor, resolvePaletteColors, resolveScreenLength, srgbFloatToOklab, srgbToHsl, srgbToLinear, srgbU8ToOklab, strokeDashStyleOf };\n//# sourceMappingURL=index.js.map\n//# sourceMappingURL=index.js.map","import { hslToSrgb } from '@weasel-js/paint';\n\n/**\n * Parse a CSS color string into [r, g, b, a] with 0..1 components.\n *\n * Supported forms:\n * - Hex: `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa` (any case)\n * - `rgb()` / `rgba()` with integer, float, or percent R/G/B; number or\n * percent alpha; commas or modern space-separated `R G B / A` syntax\n * - `hsl()` / `hsla()` with hue as a unitless number (deg) or with `deg`,\n * `rad`, `grad`, `turn` units; saturation/lightness as percent (or\n * unitless in the modern syntax); same alpha rules and separator rules\n * as `rgb()`\n * - The 148 CSS named colors plus `transparent`\n *\n * Not supported: `oklch()`, `lab()`, `color()`, `currentColor`, system\n * colors. Throws on anything unrecognized.\n *\n * Results are cached by input-string identity. Callers MUST treat the\n * returned tuple as read-only — mutation would corrupt the cache.\n */\nexport function parseColor(input: string): [number, number, number, number] {\n const cached = CACHE.get(input);\n if (cached !== undefined) return cached;\n const result = parseColorUncached(input);\n if (CACHE.size >= CACHE_MAX) CACHE.clear();\n CACHE.set(input, result);\n return result;\n}\n\nconst CACHE = new Map<string, [number, number, number, number]>();\nconst CACHE_MAX = 1024;\n\nfunction parseColorUncached(input: string): [number, number, number, number] {\n const s = input.trim();\n if (s.startsWith('#')) return parseHex(s);\n\n const lower = s.toLowerCase();\n\n // Named colors and `transparent` are checked before fn() forms because the\n // fn() regexes won't match them anyway and the lookup is cheaper than a\n // failed regex match.\n const named = NAMED_COLORS[lower];\n if (named !== undefined) return named;\n\n if (lower.startsWith('rgb')) {\n const parsed = parseRgbFunction(lower);\n if (parsed) return parsed;\n }\n if (lower.startsWith('hsl')) {\n const parsed = parseHslFunction(lower);\n if (parsed) return parsed;\n }\n\n throw new Error(`parseColor: unrecognized color \"${input}\"`);\n}\n\nconst RESOLVE_COLOR_CACHE_CAP = 1024;\nconst resolveColorCache = new Map<string, readonly [number, number, number, number]>();\n\n/** Cached `parseColor`. Use this from renderer hot paths (per-frame draw\n * callbacks, gradient ramp builds) so repeated color strings — which are\n * common when many objects share a fill — don't re-tokenize each frame.\n *\n * Cache is keyed by input-string identity, capped at ~1024 entries, and\n * cleared wholesale on overflow (no LRU tracking — simple is fine since\n * the working set in any one app is typically much smaller than the cap). */\nexport function resolveColor(input: string): readonly [number, number, number, number] {\n const hit = resolveColorCache.get(input);\n if (hit) return hit;\n if (resolveColorCache.size >= RESOLVE_COLOR_CACHE_CAP) {\n resolveColorCache.clear();\n }\n const parsed = parseColor(input);\n const frozen = parsed as readonly [number, number, number, number];\n resolveColorCache.set(input, frozen);\n return frozen;\n}\n\n/** @internal Test-only: drops the resolveColor memoization cache so tests\n * can assert behavior in isolation. Never call from production code. */\nexport function __resetResolveColorCache(): void {\n resolveColorCache.clear();\n}\n\n/** Same as `parseColor` but returns integer 0..255 components. */\nexport function parseColorToRgba255(input: string): [number, number, number, number] {\n const [r, g, b, a] = parseColor(input);\n return [\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n Math.round(a * 255),\n ];\n}\n\n/**\n * Canonicalize a hex color string to lowercase `#rrggbb` or `#rrggbbaa`.\n *\n * Accepts: `#rgb`, `#rgba`, `#rrggbb`, `#rrggbbaa`, with or without the\n * leading `#`, any case. Throws on other inputs.\n */\nexport function normalizeHex(input: string): string {\n const trimmed = input.trim();\n const body = (trimmed.startsWith('#') ? trimmed.slice(1) : trimmed).toLowerCase();\n if (!/^[0-9a-f]+$/.test(body)) {\n throw new Error(`normalizeHex: invalid hex \"${input}\"`);\n }\n if (body.length === 3) {\n return `#${body[0]}${body[0]}${body[1]}${body[1]}${body[2]}${body[2]}`;\n }\n if (body.length === 4) {\n return `#${body[0]}${body[0]}${body[1]}${body[1]}${body[2]}${body[2]}${body[3]}${body[3]}`;\n }\n if (body.length === 6 || body.length === 8) {\n return `#${body}`;\n }\n throw new Error(`normalizeHex: invalid hex \"${input}\"`);\n}\n\n/**\n * Parse a hex color into [r, g, b, a] with 0..1 components. Accepts the same\n * forms as `normalizeHex`, including a missing leading `#`.\n */\nexport function hexToRgba(input: string): [number, number, number, number] {\n return parseHex(normalizeHex(input));\n}\n\n/**\n * Format [r, g, b, a] (0..1 components) as a hex string. Emits `#rrggbb` when\n * alpha is exactly 1 (or omitted), otherwise `#rrggbbaa`.\n */\nexport function rgbaToHex(rgba: readonly [number, number, number, number] | readonly [number, number, number]): string {\n const [r, g, b] = rgba;\n const a = rgba.length === 4 ? rgba[3] : 1;\n const f = (n: number) => Math.max(0, Math.min(255, Math.round(n * 255))).toString(16).padStart(2, '0');\n const base = `#${f(r)}${f(g)}${f(b)}`;\n return a >= 1 ? base : `${base}${f(a)}`;\n}\n\nfunction parseHex(s: string): [number, number, number, number] {\n const hex = s.slice(1);\n if (hex.length === 3) {\n return [\n parseInt(hex[0] + hex[0], 16) / 255,\n parseInt(hex[1] + hex[1], 16) / 255,\n parseInt(hex[2] + hex[2], 16) / 255,\n 1,\n ];\n }\n if (hex.length === 4) {\n return [\n parseInt(hex[0] + hex[0], 16) / 255,\n parseInt(hex[1] + hex[1], 16) / 255,\n parseInt(hex[2] + hex[2], 16) / 255,\n parseInt(hex[3] + hex[3], 16) / 255,\n ];\n }\n if (hex.length === 6) {\n return [\n parseInt(hex.slice(0, 2), 16) / 255,\n parseInt(hex.slice(2, 4), 16) / 255,\n parseInt(hex.slice(4, 6), 16) / 255,\n 1,\n ];\n }\n if (hex.length === 8) {\n return [\n parseInt(hex.slice(0, 2), 16) / 255,\n parseInt(hex.slice(2, 4), 16) / 255,\n parseInt(hex.slice(4, 6), 16) / 255,\n parseInt(hex.slice(6, 8), 16) / 255,\n ];\n }\n throw new Error(`parseColor: invalid hex \"${s}\"`);\n}\n\n/** Match `name( body )` and return the trimmed body, or null. */\nfunction unwrapFn(s: string, name: string): string | null {\n if (!s.startsWith(name + '(') || !s.endsWith(')')) return null;\n return s.slice(name.length + 1, -1).trim();\n}\n\n/**\n * Split a function body into the value tokens (3 channels + optional alpha).\n * Supports both legacy `r, g, b[, a]` and modern `r g b[ / a]` separators.\n * Returns null if the token count is wrong.\n */\nfunction splitChannels(body: string): { rgb: [string, string, string]; alpha: string | null } | null {\n if (body.includes(',')) {\n const parts = body.split(',').map((p) => p.trim());\n if (parts.length !== 3 && parts.length !== 4) return null;\n return {\n rgb: [parts[0], parts[1], parts[2]],\n alpha: parts.length === 4 ? parts[3] : null,\n };\n }\n // Modern syntax: whitespace-separated, with optional `/ alpha` tail.\n const slash = body.indexOf('/');\n const head = (slash === -1 ? body : body.slice(0, slash)).trim();\n const alpha = slash === -1 ? null : body.slice(slash + 1).trim();\n const parts = head.split(/\\s+/);\n if (parts.length !== 3) return null;\n if (alpha !== null && alpha === '') return null;\n return { rgb: [parts[0], parts[1], parts[2]], alpha };\n}\n\n/** Parse a channel value: integer, float, or percent. Returns 0..1 (with `max` as the integer scale). */\nfunction parseChannel(tok: string, max: number): number | null {\n if (tok.endsWith('%')) {\n const n = Number(tok.slice(0, -1));\n if (!Number.isFinite(n)) return null;\n return clamp01(n / 100);\n }\n const n = Number(tok);\n if (!Number.isFinite(n)) return null;\n return clamp01(n / max);\n}\n\n/** Alpha may be a number 0..1 or a percent. */\nfunction parseAlpha(tok: string | null): number {\n if (tok === null) return 1;\n if (tok.endsWith('%')) {\n const n = Number(tok.slice(0, -1));\n return Number.isFinite(n) ? clamp01(n / 100) : 1;\n }\n const n = Number(tok);\n return Number.isFinite(n) ? clamp01(n) : 1;\n}\n\nfunction parseRgbFunction(s: string): [number, number, number, number] | null {\n const body = unwrapFn(s, 'rgba') ?? unwrapFn(s, 'rgb');\n if (body === null) return null;\n const channels = splitChannels(body);\n if (!channels) return null;\n const r = parseChannel(channels.rgb[0], 255);\n const g = parseChannel(channels.rgb[1], 255);\n const b = parseChannel(channels.rgb[2], 255);\n if (r === null || g === null || b === null) return null;\n return [r, g, b, parseAlpha(channels.alpha)];\n}\n\nfunction parseHslFunction(s: string): [number, number, number, number] | null {\n const body = unwrapFn(s, 'hsla') ?? unwrapFn(s, 'hsl');\n if (body === null) return null;\n const channels = splitChannels(body);\n if (!channels) return null;\n const h = parseHue(channels.rgb[0]);\n const sat = parsePercentOrNumber(channels.rgb[1]);\n const lit = parsePercentOrNumber(channels.rgb[2]);\n if (h === null || sat === null || lit === null) return null;\n const [r, g, b] = hslToRgb(h, sat, lit);\n return [r, g, b, parseAlpha(channels.alpha)];\n}\n\n/** Parse a hue token: `<number>`, `<number>deg`, `<number>rad`, `<number>grad`, `<number>turn`. Returns degrees 0..360 (modulo). */\nfunction parseHue(tok: string): number | null {\n let n: number;\n if (tok.endsWith('deg')) n = Number(tok.slice(0, -3));\n else if (tok.endsWith('grad')) n = Number(tok.slice(0, -4)) * 0.9; // 400grad = 360deg\n else if (tok.endsWith('rad')) n = Number(tok.slice(0, -3)) * (180 / Math.PI);\n else if (tok.endsWith('turn')) n = Number(tok.slice(0, -4)) * 360;\n else n = Number(tok);\n if (!Number.isFinite(n)) return null;\n return ((n % 360) + 360) % 360;\n}\n\n/** Saturation/lightness may be percent (CSS Color 3) or unitless number 0..1 (modern). */\nfunction parsePercentOrNumber(tok: string): number | null {\n if (tok.endsWith('%')) {\n const n = Number(tok.slice(0, -1));\n return Number.isFinite(n) ? clamp01(n / 100) : null;\n }\n const n = Number(tok);\n return Number.isFinite(n) ? clamp01(n) : null;\n}\n\n/**\n * HSL → RGB, all components 0..1 except hue in degrees (0..360). paint's\n * `hslToSrgb` under the name this file's callers use.\n *\n * @internal Not part of the public API; not re-exported from the barrel.\n */\nexport const hslToRgb = hslToSrgb;\n\nfunction clamp01(n: number): number {\n return n < 0 ? 0 : n > 1 ? 1 : n;\n}\n\n// CSS Color Module Level 4 named colors. Stored as already-resolved tuples so\n// lookup is O(1) and avoids a second parse hop.\nconst NAMED_COLORS: Record<string, [number, number, number, number]> = (() => {\n const hex: Record<string, number> = {\n aliceblue: 0xf0f8ff, antiquewhite: 0xfaebd7, aqua: 0x00ffff, aquamarine: 0x7fffd4,\n azure: 0xf0ffff, beige: 0xf5f5dc, bisque: 0xffe4c4, black: 0x000000,\n blanchedalmond: 0xffebcd, blue: 0x0000ff, blueviolet: 0x8a2be2, brown: 0xa52a2a,\n burlywood: 0xdeb887, cadetblue: 0x5f9ea0, chartreuse: 0x7fff00, chocolate: 0xd2691e,\n coral: 0xff7f50, cornflowerblue: 0x6495ed, cornsilk: 0xfff8dc, crimson: 0xdc143c,\n cyan: 0x00ffff, darkblue: 0x00008b, darkcyan: 0x008b8b, darkgoldenrod: 0xb8860b,\n darkgray: 0xa9a9a9, darkgreen: 0x006400, darkgrey: 0xa9a9a9, darkkhaki: 0xbdb76b,\n darkmagenta: 0x8b008b, darkolivegreen: 0x556b2f, darkorange: 0xff8c00, darkorchid: 0x9932cc,\n darkred: 0x8b0000, darksalmon: 0xe9967a, darkseagreen: 0x8fbc8f, darkslateblue: 0x483d8b,\n darkslategray: 0x2f4f4f, darkslategrey: 0x2f4f4f, darkturquoise: 0x00ced1, darkviolet: 0x9400d3,\n deeppink: 0xff1493, deepskyblue: 0x00bfff, dimgray: 0x696969, dimgrey: 0x696969,\n dodgerblue: 0x1e90ff, firebrick: 0xb22222, floralwhite: 0xfffaf0, forestgreen: 0x228b22,\n fuchsia: 0xff00ff, gainsboro: 0xdcdcdc, ghostwhite: 0xf8f8ff, gold: 0xffd700,\n goldenrod: 0xdaa520, gray: 0x808080, green: 0x008000, greenyellow: 0xadff2f,\n grey: 0x808080, honeydew: 0xf0fff0, hotpink: 0xff69b4, indianred: 0xcd5c5c,\n indigo: 0x4b0082, ivory: 0xfffff0, khaki: 0xf0e68c, lavender: 0xe6e6fa,\n lavenderblush: 0xfff0f5, lawngreen: 0x7cfc00, lemonchiffon: 0xfffacd, lightblue: 0xadd8e6,\n lightcoral: 0xf08080, lightcyan: 0xe0ffff, lightgoldenrodyellow: 0xfafad2, lightgray: 0xd3d3d3,\n lightgreen: 0x90ee90, lightgrey: 0xd3d3d3, lightpink: 0xffb6c1, lightsalmon: 0xffa07a,\n lightseagreen: 0x20b2aa, lightskyblue: 0x87cefa, lightslategray: 0x778899, lightslategrey: 0x778899,\n lightsteelblue: 0xb0c4de, lightyellow: 0xffffe0, lime: 0x00ff00, limegreen: 0x32cd32,\n linen: 0xfaf0e6, magenta: 0xff00ff, maroon: 0x800000, mediumaquamarine: 0x66cdaa,\n mediumblue: 0x0000cd, mediumorchid: 0xba55d3, mediumpurple: 0x9370db, mediumseagreen: 0x3cb371,\n mediumslateblue: 0x7b68ee, mediumspringgreen: 0x00fa9a, mediumturquoise: 0x48d1cc, mediumvioletred: 0xc71585,\n midnightblue: 0x191970, mintcream: 0xf5fffa, mistyrose: 0xffe4e1, moccasin: 0xffe4b5,\n navajowhite: 0xffdead, navy: 0x000080, oldlace: 0xfdf5e6, olive: 0x808000,\n olivedrab: 0x6b8e23, orange: 0xffa500, orangered: 0xff4500, orchid: 0xda70d6,\n palegoldenrod: 0xeee8aa, palegreen: 0x98fb98, paleturquoise: 0xafeeee, palevioletred: 0xdb7093,\n papayawhip: 0xffefd5, peachpuff: 0xffdab9, peru: 0xcd853f, pink: 0xffc0cb,\n plum: 0xdda0dd, powderblue: 0xb0e0e6, purple: 0x800080, rebeccapurple: 0x663399,\n red: 0xff0000, rosybrown: 0xbc8f8f, royalblue: 0x4169e1, saddlebrown: 0x8b4513,\n salmon: 0xfa8072, sandybrown: 0xf4a460, seagreen: 0x2e8b57, seashell: 0xfff5ee,\n sienna: 0xa0522d, silver: 0xc0c0c0, skyblue: 0x87ceeb, slateblue: 0x6a5acd,\n slategray: 0x708090, slategrey: 0x708090, snow: 0xfffafa, springgreen: 0x00ff7f,\n steelblue: 0x4682b4, tan: 0xd2b48c, teal: 0x008080, thistle: 0xd8bfd8,\n tomato: 0xff6347, turquoise: 0x40e0d0, violet: 0xee82ee, wheat: 0xf5deb3,\n white: 0xffffff, whitesmoke: 0xf5f5f5, yellow: 0xffff00, yellowgreen: 0x9acd32,\n };\n const out: Record<string, [number, number, number, number]> = {\n transparent: [0, 0, 0, 0],\n };\n for (const name in hex) {\n const n = hex[name];\n out[name] = [((n >> 16) & 0xff) / 255, ((n >> 8) & 0xff) / 255, (n & 0xff) / 255, 1];\n }\n return out;\n})();\n","/**\n * Coons and tensor-product patch surfaces — PDF's shading types 6 and 7, as\n * pure geometry.\n *\n * A patch is a curved quadrilateral: four cubic Bézier edges and a color at\n * each corner. The interior is what the edges imply — a Coons patch reads it\n * off the boundary alone; a tensor patch adds four interior control points\n * that pull it around. Both evaluate at a `(u, v)` in the unit square, which\n * is what lets the renderer subdivide a patch into as many triangles as it\n * wants without the patch knowing.\n *\n * Nothing here touches GL, a color string, or a scene. `evalPatch` is the\n * whole contract.\n */\n\n/** A point in the patch's own space. */\nexport interface MeshPoint {\n x: number;\n y: number;\n}\n\n/**\n * One patch.\n *\n * `points` walks the boundary: corner 0, the two control points of the edge\n * leaving it, corner 1, its two, and so on — twelve points, ending with the\n * two controls that return to corner 0. A tensor patch appends its four\n * interior points, in the order `(1,1)`, `(1,2)`, `(2,2)`, `(2,1)` of the\n * bicubic control net, which is PDF's own order.\n *\n * Twelve points is a Coons patch and sixteen is a tensor patch; there is no\n * flag, because the count already says which it is.\n *\n * `colors` are the corner colors in the same walk order, as whatever color\n * form the caller resolves — the renderer hands premultiplied RGBA in, the\n * serializer hands CSS strings.\n */\nexport interface MeshPatch<TColor = string> {\n points: readonly MeshPoint[];\n colors: readonly [TColor, TColor, TColor, TColor];\n}\n\n/** Corner `i` of the boundary walk. */\nexport function patchCorner(patch: MeshPatch<unknown>, i: number): MeshPoint {\n return patch.points[(i & 3) * 3];\n}\n\n/** `true` when the patch carries the four interior points a tensor patch adds. */\nexport function isTensorPatch(patch: MeshPatch<unknown>): boolean {\n return patch.points.length >= 16;\n}\n\n/** A patch is twelve boundary points, or sixteen with the interior. Anything\n * else cannot be evaluated, and saying so here beats painting nonsense. */\nexport function isValidPatch(patch: MeshPatch<unknown>): boolean {\n return patch.points.length === 12 || patch.points.length === 16;\n}\n\nfunction bezier(p0: MeshPoint, p1: MeshPoint, p2: MeshPoint, p3: MeshPoint, t: number): MeshPoint {\n const s = 1 - t;\n const a = s * s * s;\n const b = 3 * s * s * t;\n const c = 3 * s * t * t;\n const d = t * t * t;\n return {\n x: a * p0.x + b * p1.x + c * p2.x + d * p3.x,\n y: a * p0.y + b * p1.y + c * p2.y + d * p3.y,\n };\n}\n\n/** The edge leaving corner `i`, as its four control points. */\nfunction edge(patch: MeshPatch<unknown>, i: number): [MeshPoint, MeshPoint, MeshPoint, MeshPoint] {\n const p = patch.points;\n const a = (i & 3) * 3;\n return [p[a], p[a + 1], p[a + 2], p[((i + 1) & 3) * 3]];\n}\n\n/**\n * The patch surface at `(u, v)`, both in `0..1`.\n *\n * `u` runs along the edge leaving corner 0 and `v` along the edge leaving\n * corner 1, so `(0,0)` is corner 0, `(1,0)` corner 1, `(1,1)` corner 2 and\n * `(0,1)` corner 3 — the same walk `colors` is in.\n */\nexport function evalPatch(patch: MeshPatch<unknown>, u: number, v: number): MeshPoint {\n return isTensorPatch(patch) ? evalTensor(patch, u, v) : evalCoons(patch, u, v);\n}\n\nfunction evalCoons(patch: MeshPatch<unknown>, u: number, v: number): MeshPoint {\n const [b0, b1, b2, b3] = edge(patch, 0); // corner 0 → 1, along u at v=0\n const [r0, r1, r2, r3] = edge(patch, 1); // corner 1 → 2, along v at u=1\n const [t0, t1, t2, t3] = edge(patch, 2); // corner 2 → 3, along u at v=1\n const [l0, l1, l2, l3] = edge(patch, 3); // corner 3 → 0, along v at u=0\n\n const bottom = bezier(b0, b1, b2, b3, u);\n const top = bezier(t0, t1, t2, t3, 1 - u); // walks 2 → 3, so reverse it\n const right = bezier(r0, r1, r2, r3, v);\n const left = bezier(l0, l1, l2, l3, 1 - v); // walks 3 → 0, so reverse it\n\n const c0 = patchCorner(patch, 0);\n const c1 = patchCorner(patch, 1);\n const c2 = patchCorner(patch, 2);\n const c3 = patchCorner(patch, 3);\n\n // The Coons construction: the two ruled surfaces between opposite edges,\n // minus the bilinear surface through the corners they both already carry.\n const ruledU = (a: number, b: number): number => (1 - v) * a + v * b;\n const ruledV = (a: number, b: number): number => (1 - u) * a + u * b;\n const corner = (k0: number, k1: number, k2: number, k3: number): number =>\n (1 - u) * (1 - v) * k0 + u * (1 - v) * k1 + u * v * k2 + (1 - u) * v * k3;\n\n return {\n x: ruledU(bottom.x, top.x) + ruledV(left.x, right.x)\n - corner(c0.x, c1.x, c2.x, c3.x),\n y: ruledU(bottom.y, top.y) + ruledV(left.y, right.y)\n - corner(c0.y, c1.y, c2.y, c3.y),\n };\n}\n\n/** The bicubic control net a tensor patch's sixteen points make, as\n * `net[i][j]` with `i` along `u` and `j` along `v`. */\nfunction tensorNet(patch: MeshPatch<unknown>): MeshPoint[][] {\n const p = patch.points;\n // Boundary, read off the same walk; interior from the four trailing points.\n return [\n [p[0], p[11], p[10], p[9]],\n [p[1], p[12], p[13], p[8]],\n [p[2], p[15], p[14], p[7]],\n [p[3], p[4], p[5], p[6]],\n ];\n}\n\nconst BERNSTEIN = (t: number): [number, number, number, number] => {\n const s = 1 - t;\n return [s * s * s, 3 * s * s * t, 3 * s * t * t, t * t * t];\n};\n\nfunction evalTensor(patch: MeshPatch<unknown>, u: number, v: number): MeshPoint {\n const net = tensorNet(patch);\n const bu = BERNSTEIN(u);\n const bv = BERNSTEIN(v);\n let x = 0;\n let y = 0;\n for (let i = 0; i < 4; i++) {\n for (let j = 0; j < 4; j++) {\n const w = bu[i] * bv[j];\n x += w * net[i][j].x;\n y += w * net[i][j].y;\n }\n }\n return { x, y };\n}\n\n/**\n * The four corner weights at `(u, v)` — bilinear, in the corner walk order.\n *\n * Color is separate from position on purpose: it interpolates in whatever\n * space the caller chose, which is not a thing the surface can do for it.\n */\nexport function cornerWeights(u: number, v: number): [number, number, number, number] {\n return [(1 - u) * (1 - v), u * (1 - v), u * v, (1 - u) * v];\n}\n\n/** Axis-aligned bounds of a patch, sampled on a grid. Control points alone\n * bound a Bézier but not tightly, and a mesh paint is baked into a texture\n * sized from this — a loose box wastes texels on every side. */\nexport function patchBounds(\n patch: MeshPatch<unknown>, steps = 8,\n): { x: number; y: number; width: number; height: number } {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (let i = 0; i <= steps; i++) {\n for (let j = 0; j <= steps; j++) {\n const p = evalPatch(patch, i / steps, j / steps);\n if (p.x < minX) minX = p.x;\n if (p.y < minY) minY = p.y;\n if (p.x > maxX) maxX = p.x;\n if (p.y > maxY) maxY = p.y;\n }\n }\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n","/**\n * A mesh paint baked into one RGBA bitmap.\n *\n * A patch is a surface over `(u, v)`, but a paint has to answer \"what color is\n * this fragment\", which is the inverse question — and inverting a bicubic is\n * Newton iteration per fragment. Every renderer that draws these instead\n * subdivides the patch into small quads and rasterizes them forward, which is\n * what this does, once per paint, into a texture the shader then samples. The\n * cost is a texture and a resolution; the gain is that the paint composes with\n * every fill the renderer already knows how to draw, clipping included.\n *\n * The bitmap is straight (non-premultiplied) RGBA, matching the ramp atlas;\n * the fragment shader premultiplies.\n */\n\nimport { resolveColor } from '../../renderer/math/color';\nimport { lerpColorArray, type ColorSpace } from '@weasel-js/paint';\nimport { evalPatch, isValidPatch, patchBounds, type MeshPatch } from './surface';\n\n/** Texels on a side of a bake when the caller names no size. The renderer\n * sizes each bake from how large the paint draws — see `meshBakeSize`. */\nexport const MESH_BAKE_SIZE = 256;\n\n/** Texels a rasterized cell spans at most. The rasterizer interpolates color\n * linearly inside a cell and draws a curved edge as its chord, so this is\n * what keeps a perceptual blend perceptual and an edge curved at any size. */\nconst TEXELS_PER_CELL = 10;\n\n/** Quads per patch on a side, never fewer than 24. */\nfunction gridFor(size: number): number {\n return Math.max(24, Math.ceil(size / TEXELS_PER_CELL));\n}\n\n/** The box a bake covers, in the paint's own space. */\nexport interface MeshBox {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\n/** The bitmap `bakeMesh` produces, and the paint-space box it covers. */\nexport interface BakedMesh {\n /** `size` × `size` texels, straight RGBA. */\n pixels: Uint8ClampedArray;\n /** Texels on a side; `MESH_BAKE_SIZE` unless the caller asked otherwise. */\n size: number;\n /** Where the bitmap sits in paint space, which is what the shader maps a\n * fragment through. */\n box: MeshBox;\n}\n\n/** The union of every patch's bounds, or `null` when nothing is drawable. */\nexport function meshBounds(patches: readonly MeshPatch[]): MeshBox | null {\n let minX = Infinity;\n let minY = Infinity;\n let maxX = -Infinity;\n let maxY = -Infinity;\n for (const patch of patches) {\n if (!isValidPatch(patch)) continue;\n const b = patchBounds(patch);\n minX = Math.min(minX, b.x);\n minY = Math.min(minY, b.y);\n maxX = Math.max(maxX, b.x + b.width);\n maxY = Math.max(maxY, b.y + b.height);\n }\n if (!Number.isFinite(minX) || maxX <= minX || maxY <= minY) return null;\n return { x: minX, y: minY, width: maxX - minX, height: maxY - minY };\n}\n\ntype Rgba = readonly [number, number, number, number];\n\n/**\n * Corner colors blended at `(u, v)` in `space`.\n *\n * Bilinear as three lerps rather than four weights, because a perceptual space\n * has a midpoint between two colors and no meaningful four-way mix — OKLCh's\n * hue in particular is an arc, which only two endpoints define.\n */\nfunction colorAt(corners: Rgba[], u: number, v: number, space: ColorSpace): number[] {\n const bottom = lerpColorArray(corners[0], corners[1], u, space);\n const top = lerpColorArray(corners[3], corners[2], u, space);\n return lerpColorArray(bottom, top, v, space);\n}\n\n/**\n * Rasterize `patches` into a square bitmap covering their union.\n *\n * Returns `null` when no patch is drawable, which is the caller's cue to paint\n * nothing rather than a blank square.\n */\nexport function bakeMesh(\n patches: readonly MeshPatch[],\n space: ColorSpace = 'rgb',\n size: number = MESH_BAKE_SIZE,\n): BakedMesh | null {\n const box = meshBounds(patches);\n if (!box) return null;\n\n const pixels = new Uint8ClampedArray(size * size * 4);\n const grid = gridFor(size);\n // The box maps onto texel *centers*, not texel edges: a corner of the mesh\n // lands at the center of the corner texel, so the outermost row and column\n // are covered rather than half-missed by a rasterizer testing centers.\n const toTexel = (p: { x: number; y: number }): { x: number; y: number } => ({\n x: ((p.x - box.x) / box.width) * (size - 1) + 0.5,\n y: ((p.y - box.y) / box.height) * (size - 1) + 0.5,\n });\n\n for (const patch of patches) {\n if (!isValidPatch(patch)) continue;\n const corners = patch.colors.map((c) => resolveColor(c)) as Rgba[];\n\n for (let i = 0; i < grid; i++) {\n for (let j = 0; j < grid; j++) {\n const u0 = i / grid;\n const u1 = (i + 1) / grid;\n const v0 = j / grid;\n const v1 = (j + 1) / grid;\n const quad = [\n { at: toTexel(evalPatch(patch, u0, v0)), color: colorAt(corners, u0, v0, space) },\n { at: toTexel(evalPatch(patch, u1, v0)), color: colorAt(corners, u1, v0, space) },\n { at: toTexel(evalPatch(patch, u1, v1)), color: colorAt(corners, u1, v1, space) },\n { at: toTexel(evalPatch(patch, u0, v1)), color: colorAt(corners, u0, v1, space) },\n ];\n fillTriangle(pixels, size, quad[0], quad[1], quad[2]);\n fillTriangle(pixels, size, quad[0], quad[2], quad[3]);\n }\n }\n }\n\n return { pixels, size, box };\n}\n\ninterface Vertex {\n at: { x: number; y: number };\n color: number[];\n}\n\nconst EDGE_EPS = 1e-6;\n\n/**\n * One triangle, barycentric, colors interpolated across it.\n *\n * Neighboring cells share an edge, so a pixel exactly on one is claimed by\n * both — harmless here because both carry the same color there, and cheaper\n * than a fill rule.\n */\nfunction fillTriangle(\n pixels: Uint8ClampedArray, size: number, a: Vertex, b: Vertex, c: Vertex,\n): void {\n const minX = Math.max(0, Math.floor(Math.min(a.at.x, b.at.x, c.at.x)));\n const maxX = Math.min(size - 1, Math.ceil(Math.max(a.at.x, b.at.x, c.at.x)));\n const minY = Math.max(0, Math.floor(Math.min(a.at.y, b.at.y, c.at.y)));\n const maxY = Math.min(size - 1, Math.ceil(Math.max(a.at.y, b.at.y, c.at.y)));\n if (maxX < minX || maxY < minY) return;\n\n const area = (b.at.x - a.at.x) * (c.at.y - a.at.y) - (c.at.x - a.at.x) * (b.at.y - a.at.y);\n // A degenerate cell — a patch collapsed to a line — covers nothing.\n if (Math.abs(area) < 1e-9) return;\n\n for (let y = minY; y <= maxY; y++) {\n for (let x = minX; x <= maxX; x++) {\n const px = x + 0.5;\n const py = y + 0.5;\n const w0 = ((b.at.x - px) * (c.at.y - py) - (c.at.x - px) * (b.at.y - py)) / area;\n const w1 = ((c.at.x - px) * (a.at.y - py) - (a.at.x - px) * (c.at.y - py)) / area;\n const w2 = 1 - w0 - w1;\n // An edge texel's center sits exactly on the boundary, where rounding\n // can put it a hair outside; the epsilon is what keeps the border row\n // from dropping out.\n if (w0 < -EDGE_EPS || w1 < -EDGE_EPS || w2 < -EDGE_EPS) continue;\n const k = (y * size + x) * 4;\n for (let ch = 0; ch < 4; ch++) {\n pixels[k + ch] = (w0 * a.color[ch] + w1 * b.color[ch] + w2 * c.color[ch]) * 255;\n }\n }\n }\n}\n","/**\n * How large a mesh bake is, and the bounded cache the bakes live in.\n *\n * A gradient's ramp is one-dimensional, so 256 texels cover it at any size. A\n * mesh's bake is two-dimensional and is stretched over whatever the paint\n * covers, so a fixed size shows its texels once the paint draws large. The\n * bake is sized from the device pixels it covers instead, in power-of-two\n * buckets so a zoom inside one bucket reuses the bake it already has.\n */\n\nimport { MESH_BAKE_SIZE } from './bake';\n\n/** The smallest bake: below this a texture costs more in bookkeeping than in\n * bytes. */\nexport const MESH_BAKE_MIN = 32;\n\n/** The largest bake, whatever the context allows: 16 MiB of RGBA, and a bake\n * that already takes a noticeable moment on the CPU. */\nexport const MESH_BAKE_MAX = 2048;\n\n/** Bytes of baked texture one renderer keeps before evicting the least\n * recently drawn. */\nexport const MESH_BAKE_CACHE_BYTES = 64 * 1024 * 1024;\n\n/** Bakes one renderer keeps, however small, so a scene of many tiny meshes\n * cannot hold thousands of GL textures. */\nexport const MESH_BAKE_CACHE_ENTRIES = 256;\n\n/**\n * The bake side for a paint drawn `devicePx` device pixels across, on a\n * context accepting `maxTextureSize`: the next power of two at or above it,\n * clamped to `[MESH_BAKE_MIN, MESH_BAKE_MAX]` and to the context. A size that\n * cannot be measured gets `MESH_BAKE_SIZE`.\n */\nexport function meshBakeSize(devicePx: number, maxTextureSize: number): number {\n const ceiling = Math.min(MESH_BAKE_MAX, floorPow2(maxTextureSize));\n if (Number.isNaN(devicePx)) return Math.min(MESH_BAKE_SIZE, ceiling);\n if (devicePx <= MESH_BAKE_MIN) return Math.min(MESH_BAKE_MIN, ceiling);\n if (devicePx >= ceiling) return ceiling;\n return Math.min(ceiling, 2 ** Math.ceil(Math.log2(devicePx)));\n}\n\nfunction floorPow2(n: number): number {\n if (!(n >= 1)) return MESH_BAKE_MIN;\n if (!Number.isFinite(n)) return MESH_BAKE_MAX;\n return 2 ** Math.floor(Math.log2(n));\n}\n\ninterface Entry<T> {\n value: T;\n size: number;\n /** The paint's own bucket map, which is what eviction removes it from. */\n bySize: Map<number, Entry<T>>;\n}\n\n/**\n * Bakes keyed by paint and bake size, least recently used first out.\n *\n * The paint is held weakly, so a paint nobody draws any more does not pin its\n * key; its texture stays until eviction reaches it, which the bounds keep\n * finite. `free` runs for every value that leaves, by eviction, replacement or\n * `clear`.\n */\nexport class MeshBakeCache<T> {\n private readonly byPaint = new WeakMap<object, Map<number, Entry<T>>>();\n /** Insertion order is recency: a hit is deleted and re-added. */\n private readonly order = new Set<Entry<T>>();\n private held = 0;\n\n constructor(\n private readonly free: (value: T) => void,\n private readonly budgetBytes: number = MESH_BAKE_CACHE_BYTES,\n private readonly maxEntries: number = MESH_BAKE_CACHE_ENTRIES,\n ) {}\n\n /** Bytes the held bakes occupy, as RGBA8. */\n get bytes(): number { return this.held; }\n\n /** Bakes held. */\n get size(): number { return this.order.size; }\n\n get(paint: object, size: number): T | undefined {\n const entry = this.byPaint.get(paint)?.get(size);\n if (!entry) return undefined;\n this.order.delete(entry);\n this.order.add(entry);\n return entry.value;\n }\n\n set(paint: object, size: number, value: T): void {\n let bySize = this.byPaint.get(paint);\n if (!bySize) {\n bySize = new Map();\n this.byPaint.set(paint, bySize);\n }\n const old = bySize.get(size);\n if (old) this.drop(old);\n const entry: Entry<T> = { value, size, bySize };\n bySize.set(size, entry);\n this.order.add(entry);\n this.held += size * size * 4;\n this.evict(entry);\n }\n\n /** Free every bake. The cache stays usable. */\n clear(): void {\n for (const entry of [...this.order]) this.drop(entry);\n }\n\n /** Oldest first until both bounds hold, never evicting `keep` — the bake\n * the caller is about to draw. */\n private evict(keep: Entry<T>): void {\n for (const entry of this.order) {\n if (this.held <= this.budgetBytes && this.order.size <= this.maxEntries) return;\n if (entry !== keep) this.drop(entry);\n }\n }\n\n private drop(entry: Entry<T>): void {\n if (!this.order.delete(entry)) return;\n entry.bySize.delete(entry.size);\n this.held -= entry.size * entry.size * 4;\n this.free(entry.value);\n }\n}\n","/**\n * GLSL ES 3.0 sources for the mesh-gradient paint.\n *\n * The vertex stage is the pattern/gradient one: a path fill mesh carries\n * `a_position` only, so paint-space coordinates come back per fragment from\n * the screen position through `u_worldInv`. The fragment stage is a clamped\n * texture read of the baked mesh, with everything outside the bake's box\n * transparent — a mesh covers the area its patches cover, not the whole shape\n * it is filling, and a clamped read would otherwise smear its border colors\n * across the rest.\n *\n * `u_meshOrigin` / `u_meshSize` are the bake's box in paint space, and the\n * bake maps that box onto texel *centers*, which is the half-texel the uv\n * rescale accounts for.\n *\n * Output convention §2: PREMULTIPLIED alpha.\n */\n\n/** The id this program is registered under. */\nexport const MESH_PROGRAM_ID = 'kit:mesh-gradient';\n\nexport const MESH_VERT_SRC = /* glsl */ `#version 300 es\nin vec2 a_position;\nuniform mat3 u_proj;\nuniform mat3 u_model;\nuniform mat3 u_worldInv;\nout vec2 v_world;\nvoid main() {\n vec3 screen = u_model * vec3(a_position, 1.0);\n vec3 clip = u_proj * vec3(screen.xy, 1.0);\n gl_Position = vec4(clip.xy, 0.0, 1.0);\n vec3 world = u_worldInv * vec3(screen.xy, 1.0);\n v_world = world.xy;\n}\n`;\n\nexport const MESH_FRAG_SRC = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 v_world;\nuniform sampler2D u_sampler;\nuniform vec2 u_meshOrigin;\nuniform vec2 u_meshSize;\nuniform float u_opacity;\nuniform float u_alpha;\nout vec4 outColor;\nvoid main() {\n vec2 t =(v_world - u_meshOrigin) / max(u_meshSize, vec2(0.0001));\n if (t.x < 0.0 || t.x > 1.0 || t.y < 0.0 || t.y > 1.0) {\n outColor = vec4(0.0);\n return;\n }\n vec2 texels = vec2(textureSize(u_sampler, 0));\n vec2 uv = (t * (texels - 1.0) + 0.5) / texels;\n vec4 texel = texture(u_sampler, uv);\n float a = texel.a * u_opacity * u_alpha;\n outColor = vec4(texel.rgb * a, a);\n}\n`;\n\nexport const MESH_UNIFORMS = [\n 'u_proj', 'u_model', 'u_worldInv', 'u_sampler',\n 'u_meshOrigin', 'u_meshSize', 'u_opacity', 'u_alpha',\n] as const;\n\nexport const MESH_ATTRIBUTES = ['a_position'] as const;\n","/**\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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"}
@@ -0,0 +1,236 @@
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";
7
+ //#region src/features/meshPaint/meshPaint.ts
8
+ var m = "mesh-gradient";
9
+ function h(e) {
10
+ return e != null && e.fill === m;
11
+ }
12
+ function g(e) {
13
+ return e;
14
+ }
15
+ function _(e) {
16
+ return e;
17
+ }
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);
20
+ return t([
21
+ S / 255,
22
+ C / 255,
23
+ w / 255,
24
+ l
25
+ ]);
26
+ }
27
+ function y(e) {
28
+ let t = [
29
+ {
30
+ x: 0,
31
+ y: 0
32
+ },
33
+ {
34
+ x: 1,
35
+ y: 0
36
+ },
37
+ {
38
+ x: 1,
39
+ y: 1
40
+ },
41
+ {
42
+ x: 0,
43
+ y: 1
44
+ }
45
+ ], n = [];
46
+ for (let e = 0; e < 4; e++) {
47
+ let r = t[e], i = t[(e + 1) % 4], a = (i.y - r.y) * .125, o = -(i.x - r.x) * .125;
48
+ n.push(r, {
49
+ x: r.x + (i.x - r.x) / 3 + a,
50
+ y: r.y + (i.y - r.y) / 3 + o
51
+ }, {
52
+ x: r.x + 2 * (i.x - r.x) / 3 + a,
53
+ y: r.y + 2 * (i.y - r.y) / 3 + o
54
+ });
55
+ }
56
+ return {
57
+ fill: m,
58
+ patches: [{
59
+ points: n,
60
+ colors: [
61
+ e,
62
+ v(e, .14, .85, 0),
63
+ v(e, -.06, 1.1, 38),
64
+ v(e, -.16, 1, -22)
65
+ ]
66
+ }],
67
+ units: "bounds"
68
+ };
69
+ }
70
+ function b(e, t, n, r) {
71
+ let i = [
72
+ {
73
+ x: e,
74
+ y: 0
75
+ },
76
+ {
77
+ x: t,
78
+ y: 0
79
+ },
80
+ {
81
+ x: t,
82
+ y: 1
83
+ },
84
+ {
85
+ x: e,
86
+ y: 1
87
+ }
88
+ ], a = [];
89
+ for (let e = 0; e < 4; e++) {
90
+ let t = i[e], n = i[(e + 1) % 4];
91
+ a.push(t, {
92
+ x: t.x + (n.x - t.x) / 3,
93
+ y: t.y + (n.y - t.y) / 3
94
+ }, {
95
+ x: t.x + 2 * (n.x - t.x) / 3,
96
+ y: t.y + 2 * (n.y - t.y) / 3
97
+ });
98
+ }
99
+ return {
100
+ points: a,
101
+ colors: [
102
+ n,
103
+ r,
104
+ r,
105
+ n
106
+ ]
107
+ };
108
+ }
109
+ function x(e) {
110
+ let t = [...e].sort((e, t) => e.offset - t.offset);
111
+ if (t.length === 1 && t.push({
112
+ offset: 1,
113
+ color: t[0].color
114
+ }), t.length === 0) return y("#000000ff");
115
+ let n = [];
116
+ for (let e = 0; e < t.length - 1; e++) {
117
+ 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
+ }
120
+ return {
121
+ fill: m,
122
+ patches: n,
123
+ units: "bounds"
124
+ };
125
+ }
126
+ function S(e) {
127
+ let t = e.patches.filter(n);
128
+ 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
+ for (let e of t) for (let [t, n] of [[e.points[0], e.colors[0]], [e.points[3], e.colors[1]]]) {
131
+ let e = o(t.x);
132
+ s.some((t) => t.offset === e && t.color === n) || s.push({
133
+ offset: e,
134
+ color: n
135
+ });
136
+ }
137
+ return s.sort((e, t) => e.offset - t.offset);
138
+ }
139
+ function C(e, t) {
140
+ return e.patches.map((e) => ({
141
+ ...e,
142
+ points: e.points.map(t)
143
+ }));
144
+ }
145
+ var w = /* @__PURE__ */ new WeakMap();
146
+ function T(e) {
147
+ let t = w.get(e.resources);
148
+ if (!t) {
149
+ let n = e.gl, r = new a((e) => n.deleteTexture(e.texture));
150
+ e.resources.onRelease(() => {
151
+ r.clear(), w.delete(e.resources);
152
+ }), w.set(e.resources, r), t = r;
153
+ }
154
+ return t;
155
+ }
156
+ function E(e, t, n) {
157
+ let r = e.spaceToDevice(t.units);
158
+ return r ? Math.max(n.width * Math.hypot(r[0], r[1]), n.height * Math.hypot(r[3], r[4])) : NaN;
159
+ }
160
+ function D(e, t) {
161
+ let n = i(t.patches);
162
+ 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
173
+ };
174
+ return s.set(t, a, f), f;
175
+ }
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);
182
+ if (!a) return null;
183
+ let o = D(e, r);
184
+ 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;
189
+ }
190
+ var k = {
191
+ id: m,
192
+ programs: { [c]: {
193
+ vert: l,
194
+ frag: s
195
+ } },
196
+ label: "Mesh",
197
+ 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,
203
+ inPoseFrame: (e, t) => {
204
+ let n = g(e);
205
+ return n.units === "bounds" ? _({
206
+ ...n,
207
+ patches: C(n, (e) => ({
208
+ x: t.x + e.x * t.width,
209
+ y: t.y + e.y * t.height
210
+ })),
211
+ units: "local"
212
+ }) : e;
213
+ },
214
+ toBoundsFrame: (e, t) => {
215
+ let n = g(e);
216
+ return n.units === "bounds" || t.width === 0 || t.height === 0 ? e : _({
217
+ ...n,
218
+ patches: C(n, (e) => ({
219
+ x: (e.x - t.x) / t.width,
220
+ y: (e.y - t.y) / t.height
221
+ })),
222
+ units: "bounds"
223
+ });
224
+ },
225
+ toSvg: (e, t) => A(e, g(t))
226
+ };
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>`;
229
+ }
230
+ function j(e) {
231
+ return String(Number.isInteger(e) ? e : Number(e.toFixed(4)));
232
+ }
233
+ //#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 };
235
+
236
+ //# sourceMappingURL=meshPaint.js.map
@@ -0,0 +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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"}
@@ -0,0 +1,6 @@
1
+ //#region src/features/meshPaint/meshShader.ts
2
+ var e = "kit:mesh-gradient", t = "#version 300 es\nin vec2 a_position;\nuniform mat3 u_proj;\nuniform mat3 u_model;\nuniform mat3 u_worldInv;\nout vec2 v_world;\nvoid main() {\n vec3 screen = u_model * vec3(a_position, 1.0);\n vec3 clip = u_proj * vec3(screen.xy, 1.0);\n gl_Position = vec4(clip.xy, 0.0, 1.0);\n vec3 world = u_worldInv * vec3(screen.xy, 1.0);\n v_world = world.xy;\n}\n", n = "#version 300 es\nprecision highp float;\nin vec2 v_world;\nuniform sampler2D u_sampler;\nuniform vec2 u_meshOrigin;\nuniform vec2 u_meshSize;\nuniform float u_opacity;\nuniform float u_alpha;\nout vec4 outColor;\nvoid main() {\n vec2 t =(v_world - u_meshOrigin) / max(u_meshSize, vec2(0.0001));\n if (t.x < 0.0 || t.x > 1.0 || t.y < 0.0 || t.y > 1.0) {\n outColor = vec4(0.0);\n return;\n }\n vec2 texels = vec2(textureSize(u_sampler, 0));\n vec2 uv = (t * (texels - 1.0) + 0.5) / texels;\n vec4 texel = texture(u_sampler, uv);\n float a = texel.a * u_opacity * u_alpha;\n outColor = vec4(texel.rgb * a, a);\n}\n";
3
+ //#endregion
4
+ export { n as MESH_FRAG_SRC, e as MESH_PROGRAM_ID, t as MESH_VERT_SRC };
5
+
6
+ //# sourceMappingURL=meshShader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meshShader.js","names":["MESH_PROGRAM_ID","MESH_VERT_SRC","MESH_FRAG_SRC"],"sources":["../../../src/features/meshPaint/meshShader.ts"],"sourcesContent":["/**\n * GLSL ES 3.0 sources for the mesh-gradient paint.\n *\n * The vertex stage is the pattern/gradient one: a path fill mesh carries\n * `a_position` only, so paint-space coordinates come back per fragment from\n * the screen position through `u_worldInv`. The fragment stage is a clamped\n * texture read of the baked mesh, with everything outside the bake's box\n * transparent — a mesh covers the area its patches cover, not the whole shape\n * it is filling, and a clamped read would otherwise smear its border colors\n * across the rest.\n *\n * `u_meshOrigin` / `u_meshSize` are the bake's box in paint space, and the\n * bake maps that box onto texel *centers*, which is the half-texel the uv\n * rescale accounts for.\n *\n * Output convention §2: PREMULTIPLIED alpha.\n */\n\n/** The id this program is registered under. */\nexport const MESH_PROGRAM_ID = 'kit:mesh-gradient';\n\nexport const MESH_VERT_SRC = /* glsl */ `#version 300 es\nin vec2 a_position;\nuniform mat3 u_proj;\nuniform mat3 u_model;\nuniform mat3 u_worldInv;\nout vec2 v_world;\nvoid main() {\n vec3 screen = u_model * vec3(a_position, 1.0);\n vec3 clip = u_proj * vec3(screen.xy, 1.0);\n gl_Position = vec4(clip.xy, 0.0, 1.0);\n vec3 world = u_worldInv * vec3(screen.xy, 1.0);\n v_world = world.xy;\n}\n`;\n\nexport const MESH_FRAG_SRC = /* glsl */ `#version 300 es\nprecision highp float;\nin vec2 v_world;\nuniform sampler2D u_sampler;\nuniform vec2 u_meshOrigin;\nuniform vec2 u_meshSize;\nuniform float u_opacity;\nuniform float u_alpha;\nout vec4 outColor;\nvoid main() {\n vec2 t =(v_world - u_meshOrigin) / max(u_meshSize, vec2(0.0001));\n if (t.x < 0.0 || t.x > 1.0 || t.y < 0.0 || t.y > 1.0) {\n outColor = vec4(0.0);\n return;\n }\n vec2 texels = vec2(textureSize(u_sampler, 0));\n vec2 uv = (t * (texels - 1.0) + 0.5) / texels;\n vec4 texel = texture(u_sampler, uv);\n float a = texel.a * u_opacity * u_alpha;\n outColor = vec4(texel.rgb * a, a);\n}\n`;\n\nexport const MESH_UNIFORMS = [\n 'u_proj', 'u_model', 'u_worldInv', 'u_sampler',\n 'u_meshOrigin', 'u_meshSize', 'u_opacity', 'u_alpha',\n] as const;\n\nexport const MESH_ATTRIBUTES = ['a_position'] as const;\n"],"mappings":";AAmBA,IAAaA,IAAkB,qBAElBC,IAA2B,6WAe3BC,IAA2B"}
@@ -0,0 +1,7 @@
1
+ import { registerPaintKind as e } from "../../core/paintKinds.js";
2
+ import { meshGradientKind as t } from "./meshPaint.js";
3
+ //#region src/features/meshPaint/register.ts
4
+ e(t);
5
+ //#endregion
6
+
7
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","names":["registerPaintKind","meshGradientKind"],"sources":["../../../src/features/meshPaint/register.ts"],"sourcesContent":["/** Registers the mesh-gradient kind at import; `@weasel-js/core/mesh` imports it for effect. */\nimport { registerPaintKind } from '../../core/paintKinds';\nimport { meshGradientKind } from './meshPaint';\n\nregisterPaintKind(meshGradientKind);\n"],"mappings":";;;AAIAA,EAAkBC,CAAgB"}