@weasel-js/core 1.13.0 → 1.14.0

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 (741) hide show
  1. package/CHANGELOG.md +300 -0
  2. package/README.md +8 -12
  3. package/dist/affordances/hitAffordanceRegions.js +1 -1
  4. package/dist/affordances/hitAffordanceRegions.js.map +1 -1
  5. package/dist/affordances/pathAnchors.js.map +1 -1
  6. package/dist/animation/clipTargets.js +1 -1
  7. package/dist/animation/clipTargets.js.map +1 -1
  8. package/dist/animation/poseTarget.js +5 -32
  9. package/dist/animation/poseTarget.js.map +1 -1
  10. package/dist/{autoPoseDescriptor-CZ1eXbzY.d.ts → autoPoseDescriptor-C25QVb0W.d.ts} +1 -1
  11. package/dist/barrel/canvas.js +8 -8
  12. package/dist/barrel/chrome.js +9 -9
  13. package/dist/barrel/input.js +1 -1
  14. package/dist/barrel/interactions.js +3 -3
  15. package/dist/barrel/paint.js +2 -2
  16. package/dist/barrel/paths.js +19 -17
  17. package/dist/barrel/renderer.js +11 -7
  18. package/dist/barrel/routing.js +4 -1
  19. package/dist/barrel/scene.js +16 -12
  20. package/dist/barrel/text.js +5 -5
  21. package/dist/barrel/viewport.js +8 -8
  22. package/dist/canvas/Canvas.js +2 -2
  23. package/dist/canvas/Canvas.js.map +1 -1
  24. package/dist/canvas/CanvasView.js +20 -14
  25. package/dist/canvas/CanvasView.js.map +1 -1
  26. package/dist/canvas/GestureReason.js +64 -0
  27. package/dist/canvas/GestureReason.js.map +1 -0
  28. package/dist/canvas/GestureReason.module.js +7 -0
  29. package/dist/canvas/GestureReason.module.js.map +1 -0
  30. package/dist/canvas/LeanSceneCanvas.js +3 -1
  31. package/dist/canvas/LeanSceneCanvas.js.map +1 -1
  32. package/dist/canvas/NodeShape.js +2 -0
  33. package/dist/canvas/NodeShape.js.map +1 -1
  34. package/dist/canvas/PickHud.js +7 -3
  35. package/dist/canvas/PickHud.js.map +1 -1
  36. package/dist/canvas/SceneCanvas/CanvasKitProviders.js +1 -1
  37. package/dist/canvas/SceneCanvas/CanvasKitProviders.js.map +1 -1
  38. package/dist/canvas/SceneCanvas/DevHuds.js +2 -2
  39. package/dist/canvas/SceneCanvas/DevHuds.js.map +1 -1
  40. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js +4 -2
  41. package/dist/canvas/SceneCanvas/PointerProviderIfRoot.js.map +1 -1
  42. package/dist/canvas/SceneCanvas/SceneCanvasInput.js +3 -1
  43. package/dist/canvas/SceneCanvas/SceneCanvasInput.js.map +1 -1
  44. package/dist/canvas/SceneCanvas/brushOverlay.js.map +1 -1
  45. package/dist/canvas/SceneCanvas/builtinToolSets.js +17 -9
  46. package/dist/canvas/SceneCanvas/builtinToolSets.js.map +1 -1
  47. package/dist/canvas/SceneCanvas/canvasPassThrough.js +2 -1
  48. package/dist/canvas/SceneCanvas/canvasPassThrough.js.map +1 -1
  49. package/dist/canvas/SceneCanvas/defaultNodeProperties.js +75 -19
  50. package/dist/canvas/SceneCanvas/defaultNodeProperties.js.map +1 -1
  51. package/dist/canvas/SceneCanvas/defaultNodeRouting.js +7 -1
  52. package/dist/canvas/SceneCanvas/defaultNodeRouting.js.map +1 -1
  53. package/dist/canvas/SceneCanvas/defaultTextEditor.js +108 -0
  54. package/dist/canvas/SceneCanvas/defaultTextEditor.js.map +1 -0
  55. package/dist/canvas/SceneCanvas/describePresets.js +47 -0
  56. package/dist/canvas/SceneCanvas/describePresets.js.map +1 -0
  57. package/dist/canvas/SceneCanvas/features.js +57 -16
  58. package/dist/canvas/SceneCanvas/features.js.map +1 -1
  59. package/dist/canvas/SceneCanvas/mergeLayers.js +10 -1
  60. package/dist/canvas/SceneCanvas/mergeLayers.js.map +1 -1
  61. package/dist/canvas/SceneCanvas/namedPresets.js +52 -24
  62. package/dist/canvas/SceneCanvas/namedPresets.js.map +1 -1
  63. package/dist/canvas/SceneCanvas/presets/arrange.js +35 -10
  64. package/dist/canvas/SceneCanvas/presets/arrange.js.map +1 -1
  65. package/dist/canvas/SceneCanvas/presets/baseline.js +9 -0
  66. package/dist/canvas/SceneCanvas/presets/baseline.js.map +1 -0
  67. package/dist/canvas/SceneCanvas/presets/chrome.js.map +1 -1
  68. package/dist/canvas/SceneCanvas/presets/composites.js +43 -0
  69. package/dist/canvas/SceneCanvas/presets/composites.js.map +1 -0
  70. package/dist/canvas/SceneCanvas/presets/edit.js +79 -26
  71. package/dist/canvas/SceneCanvas/presets/edit.js.map +1 -1
  72. package/dist/canvas/SceneCanvas/presets/ingest.js +1 -0
  73. package/dist/canvas/SceneCanvas/presets/ingest.js.map +1 -1
  74. package/dist/canvas/SceneCanvas/presets/paths.js +58 -16
  75. package/dist/canvas/SceneCanvas/presets/paths.js.map +1 -1
  76. package/dist/canvas/SceneCanvas/presets/select.js +4 -2
  77. package/dist/canvas/SceneCanvas/presets/select.js.map +1 -1
  78. package/dist/canvas/SceneCanvas/presets/tools.js +24 -0
  79. package/dist/canvas/SceneCanvas/presets/tools.js.map +1 -0
  80. package/dist/canvas/SceneCanvas/presets/transform.js +4 -0
  81. package/dist/canvas/SceneCanvas/presets/transform.js.map +1 -1
  82. package/dist/canvas/SceneCanvas/presets/view.js +3 -1
  83. package/dist/canvas/SceneCanvas/presets/view.js.map +1 -1
  84. package/dist/canvas/SceneCanvas/props.js.map +1 -1
  85. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js +1 -1
  86. package/dist/canvas/SceneCanvas/shapeGeneratorProperties.js.map +1 -1
  87. package/dist/canvas/SceneCanvas/toolRegistry.js +5 -4
  88. package/dist/canvas/SceneCanvas/toolRegistry.js.map +1 -1
  89. package/dist/canvas/SceneCanvas/useCanvasTools.js +26 -10
  90. package/dist/canvas/SceneCanvas/useCanvasTools.js.map +1 -1
  91. package/dist/canvas/SceneCanvas/useContributionRoles.js +15 -2
  92. package/dist/canvas/SceneCanvas/useContributionRoles.js.map +1 -1
  93. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js +5 -4
  94. package/dist/canvas/SceneCanvas/useDepartureGhostLayer.js.map +1 -1
  95. package/dist/canvas/SceneCanvas/useDispatcherOverlayLayer.js +1 -1
  96. package/dist/canvas/SceneCanvas/useNodeAtPoint.js.map +1 -1
  97. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js +9 -8
  98. package/dist/canvas/SceneCanvas/useSceneCanvasLayers.js.map +1 -1
  99. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js +2 -2
  100. package/dist/canvas/SceneCanvas/useSceneCanvasPathEdit.js.map +1 -1
  101. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js +4 -1
  102. package/dist/canvas/SceneCanvas/useSceneCanvasTools.js.map +1 -1
  103. package/dist/canvas/SceneCanvas/useSceneChrome.js +7 -4
  104. package/dist/canvas/SceneCanvas/useSceneChrome.js.map +1 -1
  105. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js +9 -9
  106. package/dist/canvas/SceneCanvas/useSceneGestureDispatcher.js.map +1 -1
  107. package/dist/canvas/SceneCanvas/useScenePicking.js +4 -7
  108. package/dist/canvas/SceneCanvas/useScenePicking.js.map +1 -1
  109. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js +2 -1
  110. package/dist/canvas/SceneCanvas/useSceneRedrawSources.js.map +1 -1
  111. package/dist/canvas/SceneCanvas/useSceneSelectTool.js +6 -6
  112. package/dist/canvas/SceneCanvas/useSceneSelectTool.js.map +1 -1
  113. package/dist/canvas/SceneCanvas/useSceneStandardActions.js +2 -2
  114. package/dist/canvas/SceneCanvas/useSceneStandardActions.js.map +1 -1
  115. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js +1 -1
  116. package/dist/canvas/SceneCanvas/useSelectionOverlayLayer.js.map +1 -1
  117. package/dist/canvas/SceneCanvas/useSurfaceViewInputs.js.map +1 -1
  118. package/dist/canvas/SceneCanvas/useToolKeybindings.js +2 -2
  119. package/dist/canvas/SceneCanvas/useToolKeybindings.js.map +1 -1
  120. package/dist/canvas/SceneCanvas/useViewportActions.js +5 -2
  121. package/dist/canvas/SceneCanvas/useViewportActions.js.map +1 -1
  122. package/dist/canvas/SceneCanvas/worldPointAt.js.map +1 -1
  123. package/dist/canvas/SceneCanvas.js +22 -11
  124. package/dist/canvas/SceneCanvas.js.map +1 -1
  125. package/dist/canvas/SceneViewCanvas.js +1 -0
  126. package/dist/canvas/SceneViewCanvas.js.map +1 -1
  127. package/dist/canvas/ViewMarker.js.map +1 -1
  128. package/dist/canvas/accentColor.js +14 -1
  129. package/dist/canvas/accentColor.js.map +1 -1
  130. package/dist/canvas/affordanceAt.js +2 -2
  131. package/dist/canvas/affordanceAt.js.map +1 -1
  132. package/dist/canvas/buildSceneTree.js +5 -3
  133. package/dist/canvas/buildSceneTree.js.map +1 -1
  134. package/dist/canvas/deps/editAnchors.js +4 -4
  135. package/dist/canvas/deps/editAnchors.js.map +1 -1
  136. package/dist/canvas/deps/enteredGroup.js +14 -5
  137. package/dist/canvas/deps/enteredGroup.js.map +1 -1
  138. package/dist/canvas/deps/ingestion.js +5 -1
  139. package/dist/canvas/deps/ingestion.js.map +1 -1
  140. package/dist/canvas/deps/insert.js.map +1 -1
  141. package/dist/canvas/deps/insertSite.js +5 -3
  142. package/dist/canvas/deps/insertSite.js.map +1 -1
  143. package/dist/canvas/deps/nodeAtPoint.js +1 -12
  144. package/dist/canvas/deps/nodeAtPoint.js.map +1 -1
  145. package/dist/canvas/deps/pathEditCommits.js +3 -3
  146. package/dist/canvas/deps/pathEditCommits.js.map +1 -1
  147. package/dist/canvas/deps/slice.js +16 -2
  148. package/dist/canvas/deps/slice.js.map +1 -1
  149. package/dist/canvas/deps/snap.js +5 -5
  150. package/dist/canvas/deps/snap.js.map +1 -1
  151. package/dist/canvas/deps/textEdit.js +5 -6
  152. package/dist/canvas/deps/textEdit.js.map +1 -1
  153. package/dist/canvas/derivedPath.js +8 -3
  154. package/dist/canvas/derivedPath.js.map +1 -1
  155. package/dist/canvas/getNodeAtPoint.js +2 -2
  156. package/dist/canvas/getNodeAtPoint.js.map +1 -1
  157. package/dist/canvas/insertPreviewExtent.js.map +1 -1
  158. package/dist/canvas/layerSlots.js.map +1 -1
  159. package/dist/canvas/nodeShapes/measurePainter.js +1 -1
  160. package/dist/canvas/nodeShapes/measurePainter.js.map +1 -1
  161. package/dist/canvas/nodeShapes/strokedBounds.js +5 -3
  162. package/dist/canvas/nodeShapes/strokedBounds.js.map +1 -1
  163. package/dist/canvas/overlayRoleStrokes.js +6 -0
  164. package/dist/canvas/overlayRoleStrokes.js.map +1 -1
  165. package/dist/canvas/pickIndex/scenePickIndex.js +10 -12
  166. package/dist/canvas/pickIndex/scenePickIndex.js.map +1 -1
  167. package/dist/canvas/sceneAdapter.js +10 -19
  168. package/dist/canvas/sceneAdapter.js.map +1 -1
  169. package/dist/canvas/sceneClipboard.js +17 -4
  170. package/dist/canvas/sceneClipboard.js.map +1 -1
  171. package/dist/canvas/sceneViewRender.js +3 -2
  172. package/dist/canvas/sceneViewRender.js.map +1 -1
  173. package/dist/canvas/surfaceContribution.js.map +1 -1
  174. package/dist/canvas/useCanvasPaint.js +10 -4
  175. package/dist/canvas/useCanvasPaint.js.map +1 -1
  176. package/dist/canvas/useHitObserver.js +1 -1
  177. package/dist/canvas/useHitObserver.js.map +1 -1
  178. package/dist/canvas/useViewAim.js +1 -1
  179. package/dist/canvas/useViewAim.js.map +1 -1
  180. package/dist/canvas/useViewHelpers.js +8 -5
  181. package/dist/canvas/useViewHelpers.js.map +1 -1
  182. package/dist/canvas/useViewNesting.js +39 -12
  183. package/dist/canvas/useViewNesting.js.map +1 -1
  184. package/dist/canvas/viewInputs.js.map +1 -1
  185. package/dist/canvas/viewMarkers.js +2 -2
  186. package/dist/canvas/viewMarkers.js.map +1 -1
  187. package/dist/canvas/viewRegistry.js +2 -2
  188. package/dist/canvas/viewRegistry.js.map +1 -1
  189. package/dist/canvas/viewSnap.js +67 -0
  190. package/dist/canvas/viewSnap.js.map +1 -0
  191. package/dist/clipboard.d.ts +6 -12
  192. package/dist/{clone-qb2e1F5p.d.ts → clone-Bz4iqGfE.d.ts} +10 -5
  193. package/dist/clone.d.ts +5 -5
  194. package/dist/core/geometry/booleanOfPaths.js +23 -0
  195. package/dist/core/geometry/booleanOfPaths.js.map +1 -0
  196. package/dist/core/geometry/pathPoseDescriptor.js +12 -9
  197. package/dist/core/geometry/pathPoseDescriptor.js.map +1 -1
  198. package/dist/core/geometry/poseDescriptor.js +12 -3
  199. package/dist/core/geometry/poseDescriptor.js.map +1 -1
  200. package/dist/core/geometry/targetFrame.js +2 -13
  201. package/dist/core/geometry/targetFrame.js.map +1 -1
  202. package/dist/core/layers/render.js +2 -1
  203. package/dist/core/layers/render.js.map +1 -1
  204. package/dist/core/layers/retain.js +5 -3
  205. package/dist/core/layers/retain.js.map +1 -1
  206. package/dist/core/ops/setPath.js +3 -0
  207. package/dist/core/ops/setPath.js.map +1 -1
  208. package/dist/core/paint/meshKindLazy.js.map +1 -1
  209. package/dist/core/paint/paintKindEntry.js.map +1 -1
  210. package/dist/core/paint/paintKinds.js +8 -1
  211. package/dist/core/paint/paintKinds.js.map +1 -1
  212. package/dist/core/scene/NodeProperties.js.map +1 -1
  213. package/dist/core/scene/NodeRouting.js.map +1 -1
  214. package/dist/core/scene/booleanGroup.js +33 -0
  215. package/dist/core/scene/booleanGroup.js.map +1 -0
  216. package/dist/core/scene/booleanOfChildren.js +53 -0
  217. package/dist/core/scene/booleanOfChildren.js.map +1 -0
  218. package/dist/core/scene/carryDescendants.js +18 -6
  219. package/dist/core/scene/carryDescendants.js.map +1 -1
  220. package/dist/core/scene/composeFrame.js +42 -5
  221. package/dist/core/scene/composeFrame.js.map +1 -1
  222. package/dist/core/scene/composePose.js +35 -16
  223. package/dist/core/scene/composePose.js.map +1 -1
  224. package/dist/core/scene/depMemo.js +36 -18
  225. package/dist/core/scene/depMemo.js.map +1 -1
  226. package/dist/core/scene/derivedParts.js +2 -23
  227. package/dist/core/scene/derivedParts.js.map +1 -1
  228. package/dist/core/scene/effectivePose.js +10 -0
  229. package/dist/core/scene/effectivePose.js.map +1 -1
  230. package/dist/core/scene/historyForm.js +5 -4
  231. package/dist/core/scene/historyForm.js.map +1 -1
  232. package/dist/core/scene/kitOps.js +5 -71
  233. package/dist/core/scene/kitOps.js.map +1 -1
  234. package/dist/core/scene/kitRegistry.js +5 -0
  235. package/dist/core/scene/kitRegistry.js.map +1 -1
  236. package/dist/core/scene/layerOps.js +82 -0
  237. package/dist/core/scene/layerOps.js.map +1 -0
  238. package/dist/core/scene/layoutPass.js +14 -12
  239. package/dist/core/scene/layoutPass.js.map +1 -1
  240. package/dist/core/scene/lockGuard.js +9 -3
  241. package/dist/core/scene/lockGuard.js.map +1 -1
  242. package/dist/core/scene/nestedHit.js +5 -5
  243. package/dist/core/scene/nestedHit.js.map +1 -1
  244. package/dist/core/scene/nodeFlags.js +8 -2
  245. package/dist/core/scene/nodeFlags.js.map +1 -1
  246. package/dist/core/scene/nodeGates.js +31 -2
  247. package/dist/core/scene/nodeGates.js.map +1 -1
  248. package/dist/core/scene/pathEffects/effects.js +22 -3
  249. package/dist/core/scene/pathEffects/effects.js.map +1 -1
  250. package/dist/core/scene/pathEffects/textAlong.js +16 -3
  251. package/dist/core/scene/pathEffects/textAlong.js.map +1 -1
  252. package/dist/core/scene/pathEffects/textAlongBands.js +65 -0
  253. package/dist/core/scene/pathEffects/textAlongBands.js.map +1 -0
  254. package/dist/core/scene/reconcileSpecs.js +1 -1
  255. package/dist/core/scene/reconcileSpecs.js.map +1 -1
  256. package/dist/core/scene/scene.js +11 -5
  257. package/dist/core/scene/scene.js.map +1 -1
  258. package/dist/core/scene/sceneEdits.js +5 -2
  259. package/dist/core/scene/sceneEdits.js.map +1 -1
  260. package/dist/core/scene/scenePoseAdapter.js +10 -1
  261. package/dist/core/scene/scenePoseAdapter.js.map +1 -1
  262. package/dist/core/scene/scrollOffsets.js +93 -0
  263. package/dist/core/scene/scrollOffsets.js.map +1 -0
  264. package/dist/core/scene/serialization.js +15 -5
  265. package/dist/core/scene/serialization.js.map +1 -1
  266. package/dist/core/scene/statedFields.js +2 -1
  267. package/dist/core/scene/statedFields.js.map +1 -1
  268. package/dist/core/scene/strategyView.js +35 -0
  269. package/dist/core/scene/strategyView.js.map +1 -0
  270. package/dist/core/scene/types.js.map +1 -1
  271. package/dist/core/scene/useScene.js +2 -0
  272. package/dist/core/scene/useScene.js.map +1 -1
  273. package/dist/core/scene/worldSave.js +87 -0
  274. package/dist/core/scene/worldSave.js.map +1 -0
  275. package/dist/core/selection/selectionTarget.js +1 -1
  276. package/dist/core/selection/selectionTarget.js.map +1 -1
  277. package/dist/{cornerHandles-CNCb7aTY.d.ts → cornerHandles-DpmQM_z5.d.ts} +1 -1
  278. package/dist/{depSchema-CpIQzKWQ.d.ts → depSchema-C3BwxitB.d.ts} +119 -99
  279. package/dist/devtools-protocol.d.ts +2 -2
  280. package/dist/devtools.d.ts +2 -2
  281. package/dist/{features → domains}/chrome-caps/buildChromeCtx.js +1 -1
  282. package/dist/domains/chrome-caps/buildChromeCtx.js.map +1 -0
  283. package/dist/{features → domains}/chrome-caps/conditions.js +1 -1
  284. package/dist/domains/chrome-caps/conditions.js.map +1 -0
  285. package/dist/{features → domains}/chrome-caps/defaults.js +1 -1
  286. package/dist/domains/chrome-caps/defaults.js.map +1 -0
  287. package/dist/{features → domains}/chrome-caps/resolve.js +1 -1
  288. package/dist/domains/chrome-caps/resolve.js.map +1 -0
  289. package/dist/{features → domains}/chrome-caps/useChromeCaps.js +1 -1
  290. package/dist/domains/chrome-caps/useChromeCaps.js.map +1 -0
  291. package/dist/{features → domains}/chrome-caps/useHoverTracking.js +1 -1
  292. package/dist/domains/chrome-caps/useHoverTracking.js.map +1 -0
  293. package/dist/{features → domains}/ingestion/contentHandlers.js +20 -3
  294. package/dist/domains/ingestion/contentHandlers.js.map +1 -0
  295. package/dist/domains/ingestion/ghost.js +56 -0
  296. package/dist/domains/ingestion/ghost.js.map +1 -0
  297. package/dist/{features → domains}/ingestion/imageHandler.js +1 -1
  298. package/dist/domains/ingestion/imageHandler.js.map +1 -0
  299. package/dist/domains/ingestion/kitHandlers.js +22 -0
  300. package/dist/domains/ingestion/kitHandlers.js.map +1 -0
  301. package/dist/{features → domains}/ingestion/openFilePicker.js +1 -1
  302. package/dist/domains/ingestion/openFilePicker.js.map +1 -0
  303. package/dist/{features → domains}/ingestion/placement.js +1 -1
  304. package/dist/domains/ingestion/placement.js.map +1 -0
  305. package/dist/{features → domains}/ingestion/svgHandler.js +1 -1
  306. package/dist/domains/ingestion/svgHandler.js.map +1 -0
  307. package/dist/{features → domains}/ingestion/textHandler.js +9 -7
  308. package/dist/domains/ingestion/textHandler.js.map +1 -0
  309. package/dist/{features → domains}/ingestion/useCanvasIngestion.js +13 -15
  310. package/dist/domains/ingestion/useCanvasIngestion.js.map +1 -0
  311. package/dist/{features → domains}/ingestion/weaselJsonHandler.js +1 -1
  312. package/dist/domains/ingestion/weaselJsonHandler.js.map +1 -0
  313. package/dist/{features → domains}/longPress/longPressFeedback.js +1 -1
  314. package/dist/domains/longPress/longPressFeedback.js.map +1 -0
  315. package/dist/{features → domains}/measure/actionIds.js +1 -1
  316. package/dist/domains/measure/actionIds.js.map +1 -0
  317. package/dist/{features → domains}/measure/measureCommands.js +1 -1
  318. package/dist/domains/measure/measureCommands.js.map +1 -0
  319. package/dist/{features → domains}/measure/measureContribution.js +1 -1
  320. package/dist/domains/measure/measureContribution.js.map +1 -0
  321. package/dist/{features → domains}/measure/measureEdits.js +1 -1
  322. package/dist/domains/measure/measureEdits.js.map +1 -0
  323. package/dist/{features → domains}/measure/measureGestures.js +4 -7
  324. package/dist/domains/measure/measureGestures.js.map +1 -0
  325. package/dist/{features → domains}/measure/measureHit.js +1 -1
  326. package/dist/domains/measure/measureHit.js.map +1 -0
  327. package/dist/{features → domains}/measure/measureLayer.js +1 -1
  328. package/dist/domains/measure/measureLayer.js.map +1 -0
  329. package/dist/{features → domains}/measure/measurement.js +1 -1
  330. package/dist/domains/measure/measurement.js.map +1 -0
  331. package/dist/{features → domains}/measure/measurements.js +2 -2
  332. package/dist/domains/measure/measurements.js.map +1 -0
  333. package/dist/{features → domains}/modes/modeLayers.js +1 -1
  334. package/dist/domains/modes/modeLayers.js.map +1 -0
  335. package/dist/{features → domains}/modes/modeTriggers.js +3 -6
  336. package/dist/domains/modes/modeTriggers.js.map +1 -0
  337. package/dist/{features → domains}/pathEffects/effectSources.js +1 -1
  338. package/dist/domains/pathEffects/effectSources.js.map +1 -0
  339. package/dist/{features → domains}/pathEffects/index.js +1 -1
  340. package/dist/domains/pathEffects/index.js.map +1 -0
  341. package/dist/{features → domains}/pathEffects/readSource.js +1 -1
  342. package/dist/domains/pathEffects/readSource.js.map +1 -0
  343. package/dist/{features → domains}/pathEffects/textItems.js +11 -2
  344. package/dist/domains/pathEffects/textItems.js.map +1 -0
  345. package/dist/{features → domains}/pathEffects/useEffectSourcesLayer.js +1 -1
  346. package/dist/domains/pathEffects/useEffectSourcesLayer.js.map +1 -0
  347. package/dist/{features → domains}/paths/anchorData.js +1 -1
  348. package/dist/domains/paths/anchorData.js.map +1 -0
  349. package/dist/{features → domains}/paths/anchorMarkers.js +9 -7
  350. package/dist/domains/paths/anchorMarkers.js.map +1 -0
  351. package/dist/{features → domains}/paths/editablePath.js +1 -1
  352. package/dist/domains/paths/editablePath.js.map +1 -0
  353. package/dist/{features → domains}/paths/index.js +3 -3
  354. package/dist/{features → domains}/paths/originProjection.js +1 -1
  355. package/dist/domains/paths/originProjection.js.map +1 -0
  356. package/dist/{features → domains}/paths/pathEditExtension.js +1 -1
  357. package/dist/domains/paths/pathEditExtension.js.map +1 -0
  358. package/dist/{features → domains}/paths/pathEditState.js +1 -1
  359. package/dist/domains/paths/pathEditState.js.map +1 -0
  360. package/dist/{features → domains}/paths/pathEditingOverlayLayer.js +1 -1
  361. package/dist/domains/paths/pathEditingOverlayLayer.js.map +1 -0
  362. package/dist/{features → domains}/paths/pathLayer.js +1 -1
  363. package/dist/domains/paths/pathLayer.js.map +1 -0
  364. package/dist/{features → domains}/paths/pathRepresentation.js +1 -1
  365. package/dist/domains/paths/pathRepresentation.js.map +1 -0
  366. package/dist/{features → domains}/paths/pathSnap/glyphs.js +1 -1
  367. package/dist/domains/paths/pathSnap/glyphs.js.map +1 -0
  368. package/dist/{features → domains}/paths/pathSnap/pathSnapSource.js +1 -1
  369. package/dist/domains/paths/pathSnap/pathSnapSource.js.map +1 -0
  370. package/dist/{features → domains}/paths/pathSnap/sceneIndex.js +1 -1
  371. package/dist/domains/paths/pathSnap/sceneIndex.js.map +1 -0
  372. package/dist/{features → domains}/paths/pathSnap/snapGeometry.js +3 -2
  373. package/dist/domains/paths/pathSnap/snapGeometry.js.map +1 -0
  374. package/dist/{features → domains}/paths/penPreviewLayer.js +1 -1
  375. package/dist/domains/paths/penPreviewLayer.js.map +1 -0
  376. package/dist/{features → domains}/paths/shapeGenerator.js +6 -4
  377. package/dist/domains/paths/shapeGenerator.js.map +1 -0
  378. package/dist/{features → domains}/paths/strokeOutline.js +1 -1
  379. package/dist/domains/paths/strokeOutline.js.map +1 -0
  380. package/dist/{features → domains}/paths/useAnchorFields.js +1 -1
  381. package/dist/domains/paths/useAnchorFields.js.map +1 -0
  382. package/dist/{features → domains}/paths/usePathEdit.js +1 -1
  383. package/dist/domains/paths/usePathEdit.js.map +1 -0
  384. package/dist/{features → domains}/poseRun/usePoseRun.js +1 -1
  385. package/dist/domains/poseRun/usePoseRun.js.map +1 -0
  386. package/dist/{features → domains}/selection/enteredGroupFrame.js +49 -10
  387. package/dist/domains/selection/enteredGroupFrame.js.map +1 -0
  388. package/dist/{features → domains}/selection/enteredGroupScope.js +1 -1
  389. package/dist/domains/selection/enteredGroupScope.js.map +1 -0
  390. package/dist/domains/selection/enteredOperands.js +29 -0
  391. package/dist/domains/selection/enteredOperands.js.map +1 -0
  392. package/dist/{features → domains}/selection/handleCommands.js +1 -1
  393. package/dist/domains/selection/handleCommands.js.map +1 -0
  394. package/dist/{features → domains}/selection/overlay.js +1 -1
  395. package/dist/domains/selection/overlay.js.map +1 -0
  396. package/dist/{features → domains}/selection/selectionPose.js +1 -1
  397. package/dist/domains/selection/selectionPose.js.map +1 -0
  398. package/dist/{features → domains}/snap/angle2d.js +1 -1
  399. package/dist/domains/snap/angle2d.js.map +1 -0
  400. package/dist/{features → domains}/snap/debugCandidates.js +1 -1
  401. package/dist/domains/snap/debugCandidates.js.map +1 -0
  402. package/dist/{features → domains}/snap/gather.js +1 -1
  403. package/dist/domains/snap/gather.js.map +1 -0
  404. package/dist/{features → domains}/snap/inputSubspace.js +1 -1
  405. package/dist/domains/snap/inputSubspace.js.map +1 -0
  406. package/dist/{features → domains}/snap/lazySession.js +1 -1
  407. package/dist/domains/snap/lazySession.js.map +1 -0
  408. package/dist/{features → domains}/snap/marks.js +1 -1
  409. package/dist/domains/snap/marks.js.map +1 -0
  410. package/dist/{features → domains}/snap/outcomeStore.js +1 -1
  411. package/dist/domains/snap/outcomeStore.js.map +1 -0
  412. package/dist/{features → domains}/snap/pointSnap.js +1 -1
  413. package/dist/domains/snap/pointSnap.js.map +1 -0
  414. package/dist/{features → domains}/snap/probes2d.js +1 -1
  415. package/dist/domains/snap/probes2d.js.map +1 -0
  416. package/dist/{features → domains}/snap/readoutDraw.js +1 -1
  417. package/dist/domains/snap/readoutDraw.js.map +1 -0
  418. package/dist/{features → domains}/snap/readoutLayer.js +1 -1
  419. package/dist/domains/snap/readoutLayer.js.map +1 -0
  420. package/dist/{features → domains}/snap/registry.js +1 -1
  421. package/dist/domains/snap/registry.js.map +1 -0
  422. package/dist/{features → domains}/snap/resizeBox.js +1 -1
  423. package/dist/domains/snap/resizeBox.js.map +1 -0
  424. package/dist/{features → domains}/snap/roles.js +1 -1
  425. package/dist/domains/snap/roles.js.map +1 -0
  426. package/dist/{features → domains}/snap/rotationSource.js +1 -1
  427. package/dist/domains/snap/rotationSource.js.map +1 -0
  428. package/dist/{features → domains}/snap/sceneReads.js +24 -3
  429. package/dist/domains/snap/sceneReads.js.map +1 -0
  430. package/dist/{features → domains}/snap/sceneSession2d.js +3 -2
  431. package/dist/domains/snap/sceneSession2d.js.map +1 -0
  432. package/dist/{features → domains}/snap/screen.js +1 -1
  433. package/dist/domains/snap/screen.js.map +1 -0
  434. package/dist/{features → domains}/snap/session2d.js +3 -2
  435. package/dist/domains/snap/session2d.js.map +1 -0
  436. package/dist/{features → domains}/snap/spanSnap.js +1 -1
  437. package/dist/domains/snap/spanSnap.js.map +1 -0
  438. package/dist/{features → domains}/snap/stepAngles.js +1 -1
  439. package/dist/domains/snap/stepAngles.js.map +1 -0
  440. package/dist/{features → domains}/text/editingDrawOne.js +4 -4
  441. package/dist/domains/text/editingDrawOne.js.map +1 -0
  442. package/dist/domains/text/hostTextEditors.js +24 -0
  443. package/dist/domains/text/hostTextEditors.js.map +1 -0
  444. package/dist/{features → domains}/text/index.js +1 -1
  445. package/dist/{features → domains}/text/sceneTextDrafts.js +1 -1
  446. package/dist/domains/text/sceneTextDrafts.js.map +1 -0
  447. package/dist/{features → domains}/text/textHitAt.js +18 -2
  448. package/dist/domains/text/textHitAt.js.map +1 -0
  449. package/dist/{features → domains}/text/textLayer.js +1 -1
  450. package/dist/domains/text/textLayer.js.map +1 -0
  451. package/dist/{features → domains}/text/useSceneTextEdit.js +11 -3
  452. package/dist/domains/text/useSceneTextEdit.js.map +1 -0
  453. package/dist/{features → domains}/viewports/aim.js +1 -1
  454. package/dist/domains/viewports/aim.js.map +1 -0
  455. package/dist/{features → domains}/viewports/viewMarker.js +23 -5
  456. package/dist/domains/viewports/viewMarker.js.map +1 -0
  457. package/dist/{features → domains}/viewports/viewMarkerDrag.js +3 -3
  458. package/dist/domains/viewports/viewMarkerDrag.js.map +1 -0
  459. package/dist/{features → domains}/viewports/viewResolver.js +1 -1
  460. package/dist/domains/viewports/viewResolver.js.map +1 -0
  461. package/dist/{features → domains}/viewports/viewportLayer.js +1 -1
  462. package/dist/domains/viewports/viewportLayer.js.map +1 -0
  463. package/dist/icons.table.js +1 -1
  464. package/dist/icons.table.js.map +1 -1
  465. package/dist/icons.table.json +106 -6
  466. package/dist/index.d.ts +1441 -1050
  467. package/dist/index.js +90 -77
  468. package/dist/interactions/actions/admitsChild.js +6 -2
  469. package/dist/interactions/actions/admitsChild.js.map +1 -1
  470. package/dist/interactions/actions/align/align.js +1 -4
  471. package/dist/interactions/actions/align/align.js.map +1 -1
  472. package/dist/interactions/actions/booleans/booleanGroupAction.js +66 -0
  473. package/dist/interactions/actions/booleans/booleanGroupAction.js.map +1 -0
  474. package/dist/interactions/actions/booleans/keymap.js +52 -0
  475. package/dist/interactions/actions/booleans/keymap.js.map +1 -0
  476. package/dist/interactions/actions/booleans/operands.js +1 -1
  477. package/dist/interactions/actions/booleans/pieces.js +4 -11
  478. package/dist/interactions/actions/booleans/pieces.js.map +1 -1
  479. package/dist/interactions/actions/clipboard/action.js +3 -7
  480. package/dist/interactions/actions/clipboard/action.js.map +1 -1
  481. package/dist/interactions/actions/clipboard/clipboardOps.js +1 -1
  482. package/dist/interactions/actions/clipboard/clipboardOps.js.map +1 -1
  483. package/dist/interactions/actions/clipboard/materializePaste.js.map +1 -1
  484. package/dist/interactions/actions/defaults/anchorEditing.js +6 -6
  485. package/dist/interactions/actions/defaults/anchorEditing.js.map +1 -1
  486. package/dist/interactions/actions/defaults/bendSegment.js +1 -1
  487. package/dist/interactions/actions/defaults/bendSegment.js.map +1 -1
  488. package/dist/interactions/actions/defaults/containerScroll.js +170 -0
  489. package/dist/interactions/actions/defaults/containerScroll.js.map +1 -0
  490. package/dist/interactions/actions/defaults/contextMenu.js +2 -5
  491. package/dist/interactions/actions/defaults/contextMenu.js.map +1 -1
  492. package/dist/interactions/actions/defaults/delete.js +1 -1
  493. package/dist/interactions/actions/defaults/delete.js.map +1 -1
  494. package/dist/interactions/actions/defaults/duplicate.js +1 -3
  495. package/dist/interactions/actions/defaults/duplicate.js.map +1 -1
  496. package/dist/interactions/actions/defaults/enterGroup.js +7 -12
  497. package/dist/interactions/actions/defaults/enterGroup.js.map +1 -1
  498. package/dist/interactions/actions/defaults/enterPathEdit.js +4 -8
  499. package/dist/interactions/actions/defaults/enterPathEdit.js.map +1 -1
  500. package/dist/interactions/actions/defaults/group.js +12 -24
  501. package/dist/interactions/actions/defaults/group.js.map +1 -1
  502. package/dist/interactions/actions/defaults/ingest.js +18 -10
  503. package/dist/interactions/actions/defaults/ingest.js.map +1 -1
  504. package/dist/interactions/actions/defaults/insertPathAnchor.js +3 -3
  505. package/dist/interactions/actions/defaults/insertPathAnchor.js.map +1 -1
  506. package/dist/interactions/actions/defaults/nudgeSteps.js +3 -21
  507. package/dist/interactions/actions/defaults/nudgeSteps.js.map +1 -1
  508. package/dist/interactions/actions/defaults/pathEditMarks.js.map +1 -1
  509. package/dist/interactions/actions/defaults/selectDeep.js +2 -2
  510. package/dist/interactions/actions/defaults/selectDeep.js.map +1 -1
  511. package/dist/interactions/actions/distribute/distribute.js.map +1 -1
  512. package/dist/interactions/actions/dropVerdict.js +9 -0
  513. package/dist/interactions/actions/dropVerdict.js.map +1 -0
  514. package/dist/interactions/actions/edit-anchors/action.js +2 -2
  515. package/dist/interactions/actions/edit-anchors/action.js.map +1 -1
  516. package/dist/interactions/actions/edit-anchors/extensionDrags.js.map +1 -1
  517. package/dist/interactions/actions/edit-anchors/geometry.js +8 -6
  518. package/dist/interactions/actions/edit-anchors/geometry.js.map +1 -1
  519. package/dist/interactions/actions/edit-anchors/handleDrag.js.map +1 -1
  520. package/dist/interactions/actions/edit-anchors/preview.js +1 -1
  521. package/dist/interactions/actions/edit-anchors/preview.js.map +1 -1
  522. package/dist/interactions/actions/flip/action.js +3 -2
  523. package/dist/interactions/actions/flip/action.js.map +1 -1
  524. package/dist/interactions/actions/geometryProjection.js +8 -3
  525. package/dist/interactions/actions/geometryProjection.js.map +1 -1
  526. package/dist/interactions/actions/gestureFrames.js +1 -0
  527. package/dist/interactions/actions/gestureFrames.js.map +1 -1
  528. package/dist/interactions/actions/insert/action.js +6 -2
  529. package/dist/interactions/actions/insert/action.js.map +1 -1
  530. package/dist/interactions/actions/insert/frame.js +1 -1
  531. package/dist/interactions/actions/insert/frame.js.map +1 -1
  532. package/dist/interactions/actions/insert/placeAction.js +6 -8
  533. package/dist/interactions/actions/insert/placeAction.js.map +1 -1
  534. package/dist/interactions/actions/insert/session.js +2 -2
  535. package/dist/interactions/actions/insert/session.js.map +1 -1
  536. package/dist/interactions/actions/move/action.js +6 -15
  537. package/dist/interactions/actions/move/action.js.map +1 -1
  538. package/dist/interactions/actions/move/behaviors/layoutDrop.js +12 -2
  539. package/dist/interactions/actions/move/behaviors/layoutDrop.js.map +1 -1
  540. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js +29 -10
  541. package/dist/interactions/actions/move/behaviors/reparentOnDrop.js.map +1 -1
  542. package/dist/interactions/actions/move/behaviors/snapToContainer.js +42 -6
  543. package/dist/interactions/actions/move/behaviors/snapToContainer.js.map +1 -1
  544. package/dist/interactions/actions/move/capture.js +4 -8
  545. package/dist/interactions/actions/move/capture.js.map +1 -1
  546. package/dist/interactions/actions/move/commit/index.js.map +1 -1
  547. package/dist/interactions/actions/move/commit/layoutDrop.js +4 -3
  548. package/dist/interactions/actions/move/commit/layoutDrop.js.map +1 -1
  549. package/dist/interactions/actions/move/commit/layoutRelease.js +15 -9
  550. package/dist/interactions/actions/move/commit/layoutRelease.js.map +1 -1
  551. package/dist/interactions/actions/move/commit/reparent.js +19 -13
  552. package/dist/interactions/actions/move/commit/reparent.js.map +1 -1
  553. package/dist/interactions/actions/move/delta.js +51 -5
  554. package/dist/interactions/actions/move/delta.js.map +1 -1
  555. package/dist/interactions/actions/move/frame.js +8 -4
  556. package/dist/interactions/actions/move/frame.js.map +1 -1
  557. package/dist/interactions/actions/move/layout/container.js +19 -9
  558. package/dist/interactions/actions/move/layout/container.js.map +1 -1
  559. package/dist/interactions/actions/move/layout/dragged.js +2 -2
  560. package/dist/interactions/actions/move/layout/dragged.js.map +1 -1
  561. package/dist/interactions/actions/move/layout/dropPass.js +36 -18
  562. package/dist/interactions/actions/move/layout/dropPass.js.map +1 -1
  563. package/dist/interactions/actions/move/layout/exits.js +2 -2
  564. package/dist/interactions/actions/move/layout/exits.js.map +1 -1
  565. package/dist/interactions/actions/move/layout/glide.js +5 -5
  566. package/dist/interactions/actions/move/layout/glide.js.map +1 -1
  567. package/dist/interactions/actions/move/layout/view.js +55 -0
  568. package/dist/interactions/actions/move/layout/view.js.map +1 -0
  569. package/dist/interactions/actions/move/refusal.js +52 -0
  570. package/dist/interactions/actions/move/refusal.js.map +1 -0
  571. package/dist/interactions/actions/move/session.js +9 -8
  572. package/dist/interactions/actions/move/session.js.map +1 -1
  573. package/dist/interactions/actions/move/translate.js +10 -4
  574. package/dist/interactions/actions/move/translate.js.map +1 -1
  575. package/dist/interactions/actions/moveNodes.js +21 -5
  576. package/dist/interactions/actions/moveNodes.js.map +1 -1
  577. package/dist/interactions/actions/pathCommands/pathNodes.js +3 -3
  578. package/dist/interactions/actions/pathCommands/pathNodes.js.map +1 -1
  579. package/dist/interactions/actions/planeInput.js +14 -13
  580. package/dist/interactions/actions/planeInput.js.map +1 -1
  581. package/dist/interactions/actions/poseFrame.js +21 -8
  582. package/dist/interactions/actions/poseFrame.js.map +1 -1
  583. package/dist/interactions/actions/resize/action.js +1 -1
  584. package/dist/interactions/actions/resize/action.js.map +1 -1
  585. package/dist/interactions/actions/resize/aspect.js +1 -1
  586. package/dist/interactions/actions/resize/aspect.js.map +1 -1
  587. package/dist/interactions/actions/resize/commit.js +10 -1
  588. package/dist/interactions/actions/resize/commit.js.map +1 -1
  589. package/dist/interactions/actions/resize/frame.js +3 -2
  590. package/dist/interactions/actions/resize/frame.js.map +1 -1
  591. package/dist/interactions/actions/resize/held.js +44 -0
  592. package/dist/interactions/actions/resize/held.js.map +1 -0
  593. package/dist/interactions/actions/resize/session.js +3 -1
  594. package/dist/interactions/actions/resize/session.js.map +1 -1
  595. package/dist/interactions/actions/resolveOverlays.js +9 -0
  596. package/dist/interactions/actions/resolveOverlays.js.map +1 -1
  597. package/dist/interactions/actions/resolvePreviews.js +23 -7
  598. package/dist/interactions/actions/resolvePreviews.js.map +1 -1
  599. package/dist/interactions/actions/rotate/action.js +1 -1
  600. package/dist/interactions/actions/rotate/action.js.map +1 -1
  601. package/dist/interactions/actions/rotate/frame.js +1 -1
  602. package/dist/interactions/actions/rotate/frame.js.map +1 -1
  603. package/dist/interactions/actions/rotate/session.js +2 -2
  604. package/dist/interactions/actions/rotate/session.js.map +1 -1
  605. package/dist/interactions/actions/selectionSubtree.js +2 -4
  606. package/dist/interactions/actions/selectionSubtree.js.map +1 -1
  607. package/dist/interactions/actions/spatialReference.js +4 -9
  608. package/dist/interactions/actions/spatialReference.js.map +1 -1
  609. package/dist/interactions/gestures/dragRadial/dragRadial.js.map +1 -1
  610. package/dist/interactions/gestures/dragRect/dragRect.js.map +1 -1
  611. package/dist/kitSettingsSchema.js +2 -2
  612. package/dist/kitSettingsSchema.js.map +1 -1
  613. package/dist/{math-C_elShP_.d.ts → math-B_unOnF4.d.ts} +2 -2
  614. package/dist/math.d.ts +3 -3
  615. package/dist/move.d.ts +6 -6
  616. package/dist/{options-ClEm3SEl.d.ts → options-DAjkhbcs.d.ts} +5 -5
  617. package/dist/{poseDescriptor-DN2yfnq_.d.ts → poseDescriptor-CvSxVhCd.d.ts} +17 -4
  618. package/dist/resize.d.ts +6 -6
  619. package/dist/style.css +14 -0
  620. package/dist/test-seams.d.ts +11 -15
  621. package/dist/test-seams.js +1 -1
  622. package/dist/tools/builtin/eyedropper/useEyedropperTool.js +3 -6
  623. package/dist/tools/builtin/eyedropper/useEyedropperTool.js.map +1 -1
  624. package/dist/tools/builtin/line/useLineTool.js.map +1 -1
  625. package/dist/tools/builtin/measure/useMeasureTool.js +2 -2
  626. package/dist/tools/builtin/measure/useMeasureTool.js.map +1 -1
  627. package/dist/tools/builtin/pen/penHandle.js +2 -2
  628. package/dist/tools/builtin/pen/penHandle.js.map +1 -1
  629. package/dist/tools/builtin/pen/usePenTool.js +13 -19
  630. package/dist/tools/builtin/pen/usePenTool.js.map +1 -1
  631. package/dist/tools/builtin/polygon/usePolygonTool.js +1 -1
  632. package/dist/tools/builtin/polygon/usePolygonTool.js.map +1 -1
  633. package/dist/tools/builtin/select/groupEntry.js +1 -1
  634. package/dist/tools/builtin/select/groupEntry.js.map +1 -1
  635. package/dist/tools/builtin/select/selectionContributions.js +1 -1
  636. package/dist/tools/builtin/select/selectionContributions.js.map +1 -1
  637. package/dist/tools/builtin/select/useSelectTool.js +7 -7
  638. package/dist/tools/builtin/select/useSelectTool.js.map +1 -1
  639. package/dist/tools/builtin/slice/useSliceTool.js +5 -8
  640. package/dist/tools/builtin/slice/useSliceTool.js.map +1 -1
  641. package/dist/tools/builtin/star/useStarTool.js +1 -1
  642. package/dist/tools/builtin/star/useStarTool.js.map +1 -1
  643. package/dist/tools/index.js +2 -1
  644. package/dist/{types-49uYJN3j.d.ts → types-A_sNJYRd.d.ts} +8 -0
  645. package/dist/{types-BEdRIhNc.d.ts → types-DW14eu9B.d.ts} +131 -36
  646. package/dist/{types-p2alu-R1.d.ts → types-VCtfchp-.d.ts} +4 -6
  647. package/dist/util/color.js +12 -14
  648. package/dist/util/color.js.map +1 -1
  649. package/dist/version.js +1 -1
  650. package/package.json +25 -24
  651. package/dist/canvas/poseCascade.js +0 -65
  652. package/dist/canvas/poseCascade.js.map +0 -1
  653. package/dist/features/chrome-caps/buildChromeCtx.js.map +0 -1
  654. package/dist/features/chrome-caps/conditions.js.map +0 -1
  655. package/dist/features/chrome-caps/defaults.js.map +0 -1
  656. package/dist/features/chrome-caps/resolve.js.map +0 -1
  657. package/dist/features/chrome-caps/useChromeCaps.js.map +0 -1
  658. package/dist/features/chrome-caps/useHoverTracking.js.map +0 -1
  659. package/dist/features/ingestion/contentHandlers.js.map +0 -1
  660. package/dist/features/ingestion/imageHandler.js.map +0 -1
  661. package/dist/features/ingestion/openFilePicker.js.map +0 -1
  662. package/dist/features/ingestion/placement.js.map +0 -1
  663. package/dist/features/ingestion/registerKitHandlers.js +0 -43
  664. package/dist/features/ingestion/registerKitHandlers.js.map +0 -1
  665. package/dist/features/ingestion/svgHandler.js.map +0 -1
  666. package/dist/features/ingestion/textHandler.js.map +0 -1
  667. package/dist/features/ingestion/useCanvasIngestion.js.map +0 -1
  668. package/dist/features/ingestion/weaselJsonHandler.js.map +0 -1
  669. package/dist/features/longPress/longPressFeedback.js.map +0 -1
  670. package/dist/features/measure/actionIds.js.map +0 -1
  671. package/dist/features/measure/measureCommands.js.map +0 -1
  672. package/dist/features/measure/measureContribution.js.map +0 -1
  673. package/dist/features/measure/measureEdits.js.map +0 -1
  674. package/dist/features/measure/measureGestures.js.map +0 -1
  675. package/dist/features/measure/measureHit.js.map +0 -1
  676. package/dist/features/measure/measureLayer.js.map +0 -1
  677. package/dist/features/measure/measurement.js.map +0 -1
  678. package/dist/features/measure/measurements.js.map +0 -1
  679. package/dist/features/modes/modeLayers.js.map +0 -1
  680. package/dist/features/modes/modeTriggers.js.map +0 -1
  681. package/dist/features/pathEffects/effectSources.js.map +0 -1
  682. package/dist/features/pathEffects/index.js.map +0 -1
  683. package/dist/features/pathEffects/readSource.js.map +0 -1
  684. package/dist/features/pathEffects/textItems.js.map +0 -1
  685. package/dist/features/pathEffects/useEffectSourcesLayer.js.map +0 -1
  686. package/dist/features/paths/anchorData.js.map +0 -1
  687. package/dist/features/paths/anchorMarkers.js.map +0 -1
  688. package/dist/features/paths/editablePath.js.map +0 -1
  689. package/dist/features/paths/originProjection.js.map +0 -1
  690. package/dist/features/paths/pathEditExtension.js.map +0 -1
  691. package/dist/features/paths/pathEditState.js.map +0 -1
  692. package/dist/features/paths/pathEditingOverlayLayer.js.map +0 -1
  693. package/dist/features/paths/pathLayer.js.map +0 -1
  694. package/dist/features/paths/pathRepresentation.js.map +0 -1
  695. package/dist/features/paths/pathSnap/glyphs.js.map +0 -1
  696. package/dist/features/paths/pathSnap/pathSnapSource.js.map +0 -1
  697. package/dist/features/paths/pathSnap/sceneIndex.js.map +0 -1
  698. package/dist/features/paths/pathSnap/snapGeometry.js.map +0 -1
  699. package/dist/features/paths/penPreviewLayer.js.map +0 -1
  700. package/dist/features/paths/shapeGenerator.js.map +0 -1
  701. package/dist/features/paths/strokeOutline.js.map +0 -1
  702. package/dist/features/paths/useAnchorFields.js.map +0 -1
  703. package/dist/features/paths/usePathEdit.js.map +0 -1
  704. package/dist/features/poseRun/usePoseRun.js.map +0 -1
  705. package/dist/features/selection/enteredGroupFrame.js.map +0 -1
  706. package/dist/features/selection/enteredGroupScope.js.map +0 -1
  707. package/dist/features/selection/handleCommands.js.map +0 -1
  708. package/dist/features/selection/overlay.js.map +0 -1
  709. package/dist/features/selection/selectionPose.js.map +0 -1
  710. package/dist/features/snap/angle2d.js.map +0 -1
  711. package/dist/features/snap/debugCandidates.js.map +0 -1
  712. package/dist/features/snap/gather.js.map +0 -1
  713. package/dist/features/snap/inputSubspace.js.map +0 -1
  714. package/dist/features/snap/lazySession.js.map +0 -1
  715. package/dist/features/snap/marks.js.map +0 -1
  716. package/dist/features/snap/outcomeStore.js.map +0 -1
  717. package/dist/features/snap/pointSnap.js.map +0 -1
  718. package/dist/features/snap/probes2d.js.map +0 -1
  719. package/dist/features/snap/readoutDraw.js.map +0 -1
  720. package/dist/features/snap/readoutLayer.js.map +0 -1
  721. package/dist/features/snap/registry.js.map +0 -1
  722. package/dist/features/snap/resizeBox.js.map +0 -1
  723. package/dist/features/snap/roles.js.map +0 -1
  724. package/dist/features/snap/rotationSource.js.map +0 -1
  725. package/dist/features/snap/sceneReads.js.map +0 -1
  726. package/dist/features/snap/sceneSession2d.js.map +0 -1
  727. package/dist/features/snap/screen.js.map +0 -1
  728. package/dist/features/snap/session2d.js.map +0 -1
  729. package/dist/features/snap/spanSnap.js.map +0 -1
  730. package/dist/features/snap/stepAngles.js.map +0 -1
  731. package/dist/features/text/editingDrawOne.js.map +0 -1
  732. package/dist/features/text/sceneTextDrafts.js.map +0 -1
  733. package/dist/features/text/textHitAt.js.map +0 -1
  734. package/dist/features/text/textLayer.js.map +0 -1
  735. package/dist/features/text/useSceneTextEdit.js.map +0 -1
  736. package/dist/features/viewports/aim.js.map +0 -1
  737. package/dist/features/viewports/viewMarker.js.map +0 -1
  738. package/dist/features/viewports/viewMarkerDrag.js.map +0 -1
  739. package/dist/features/viewports/viewResolver.js.map +0 -1
  740. package/dist/features/viewports/viewportLayer.js.map +0 -1
  741. /package/dist/{features → domains}/chrome-caps/index.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"meshKindLazy.js","names":["invert","invertAffine","asMesh","asFill"],"sources":["../../../../paint/src/hex.ts","../../../../paint/src/colorSpaces.ts","../../../../paint/src/color.ts","../../../../geom/src/scalar.ts","../../../../geom/src/affine.ts","../../../../geom/src/glMat3.ts","../../../../renderer/src/meshPaint/surface.ts","../../../../renderer/src/meshPaint/bake.ts","../../../../renderer/src/meshPaint/bakeCache.ts","../../../../renderer/src/meshPaint/meshShader.ts","../../../../renderer/src/meshPaint/meshPaint.ts","../../../src/core/paint/meshKind.ts"],"sourcesContent":["const HEX = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/**\n * The kit's one hex color reader: `#rgb`, `#rgba`, `#rrggbb`, or `#rrggbbaa`,\n * in any case, as four 0..255 channels with alpha last (255 when the color\n * names none). `null` for anything else, a missing `#` included.\n */\nexport function parseHexBytes(input: string): [number, number, number, number] | null {\n if (!HEX.test(input)) return null;\n const digits = input.slice(1);\n const long = digits.length <= 4 ? digits.replace(/./g, '$&$&') : digits;\n const byte = (i: number): number => Number.parseInt(long.slice(i, i + 2), 16);\n return [byte(0), byte(2), byte(4), long.length === 8 ? byte(6) : 255];\n}\n\n/** A hex color's red, green, and blue as 0..255, its alpha dropped. Throws on anything {@link parseHexBytes} does not read. */\nexport function hexToRgbBytes(input: string): [number, number, number] {\n const bytes = parseHexBytes(input);\n if (!bytes) throw new Error(`not a hex color: \"${input}\"`);\n return [bytes[0], bytes[1], bytes[2]];\n}\n","// sRGB ↔ OKLab conversion. Reference: https://bottosson.github.io/posts/oklab/\n\nimport { hexToRgbBytes } from './hex';\n\nconst SRGB_TO_LINEAR: Float64Array = (() => {\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})();\n\nfunction linearToSrgbByte(c: number): number {\n if (c <= 0) return 0;\n if (c >= 1) return 255;\n const v = c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n return Math.round(v * 255);\n}\n\n/** 0..1 float channel to the 8-bit index the LUTs are cut for. Rounds and\n * clamps; `& 0xff` would truncate, and wrap anything out of range. */\nconst f2u = (v: number): number => Math.max(0, Math.min(255, Math.round(v * 255)));\n\n/**\n * Convert a 0..1 float sRGB triple to OKLab — the renderer's own color space,\n * and what a caller holding a `resolveColor` result has. Rounds into the u8\n * grid the way every other float→u8 crossing in this file does, rather than\n * leaving each caller to pick a convention.\n */\nexport function srgbFloatToOklab(r: number, g: number, b: number): [number, number, number] {\n return srgbU8ToOklab(f2u(r), f2u(g), f2u(b));\n}\n\n/** Convert an 8-bit sRGB triple to OKLab. Channels are indices into a 256-entry\n * LUT: pass integers, or `srgbFloatToOklab` for 0..1 floats. */\nexport function srgbU8ToOklab(r: number, g: number, b: number): [number, number, number] {\n return linearSrgbToOklab(SRGB_TO_LINEAR[r & 0xff], SRGB_TO_LINEAR[g & 0xff], SRGB_TO_LINEAR[b & 0xff]);\n}\n\n/** Linear-light sRGB (0..1 floats, unclamped) to OKLab. */\nexport function linearSrgbToOklab(rl: number, gl: number, bl: number): [number, number, number] {\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.7936177850 * mp - 0.0040720468 * sp,\n 1.9779984951 * lp - 2.4285922050 * mp + 0.4505937099 * sp,\n 0.0259040371 * lp + 0.7827717662 * mp - 0.8086757660 * sp,\n ];\n}\n\n/** OKLab to linear-light sRGB. Not gamut-clipped: out-of-gamut colors come\n * back with channels outside 0..1. */\nexport function oklabToLinearSrgb(L: number, A: number, B: number): [number, number, number] {\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.2914855480 * 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.7076147010 * s,\n ];\n}\n\nfunction inGamut(rl: number, gl: number, bl: number): boolean {\n // Small epsilon absorbs float-roundtrip noise on pure-primary colors.\n const eps = 1e-6;\n return (\n rl >= -eps && rl <= 1 + eps &&\n gl >= -eps && gl <= 1 + eps &&\n bl >= -eps && bl <= 1 + eps\n );\n}\n\nfunction clipToGamut(L: number, A: number, B: number): [number, number, number] {\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 // 5 iterations → ~3% chroma precision; sufficient for u8 output.\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; else hi = t;\n }\n [rl, gl, bl] = oklabToLinearSrgb(L, A * lo, B * lo);\n return [rl, gl, bl];\n}\n\n/** Convert OKLab back to an 8-bit sRGB triple, clamped into gamut. */\nexport function oklabToSrgbU8(L: number, A: number, B: number): [number, number, number] {\n const [rl, gl, bl] = clipToGamut(L, A, B);\n return [linearToSrgbByte(rl), linearToSrgbByte(gl), linearToSrgbByte(bl)];\n}\n\n/** Blend two 8-bit sRGB colors through OKLab. Perceptually even, and it does\n * not pass through the muddy midpoints an sRGB blend produces between\n * complementary hues. */\nexport function lerpOklab(\n from: readonly [number, number, number],\n to: readonly [number, number, number],\n t: number,\n): [number, number, number] {\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}\n\n/**\n * `color-mix(in oklab, a p%, b)` for two 0..1 sRGBA colors, `p` as 0..1: the\n * channels mix premultiplied by alpha, as CSS does, so a transparent side\n * lends the result its opacity and none of its color.\n */\nexport function mixOklab(\n a: readonly [number, number, number, number],\n b: readonly [number, number, number, number],\n p: number,\n): [number, number, number, number] {\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: number) => (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}\n\n/** Convert OKLab (L, a, b) to OKLCh (L, C, h). h is in radians, range [-π, π]. */\nexport function oklabToOklch(L: number, A: number, B: number): [number, number, number] {\n const C = Math.hypot(A, B);\n const h = Math.atan2(B, A);\n return [L, C, h];\n}\n\n/** Convert OKLCh (L, C, h) to OKLab (L, a, b). h is in radians. */\nexport function oklchToOklab(L: number, C: number, h: number): [number, number, number] {\n return [L, C * Math.cos(h), C * Math.sin(h)];\n}\n\n/** Lerp OKLCh values with shortest-arc hue interpolation. Lightness and\n * chroma lerp linearly. When chroma is near zero on either endpoint, hue\n * is taken from the other endpoint (avoids hue snap-from-undefined).\n * h inputs are in radians. */\nexport function lerpOklch(\n from: readonly [number, number, number],\n to: readonly [number, number, number],\n t: number,\n): [number, number, number] {\n const [L1, C1, h1Raw] = from;\n const [L2, C2, h2Raw] = to;\n const C_EPS = 1e-4;\n // When one endpoint is near-achromatic, take hue from the other endpoint\n // to avoid spurious arc rotation through undefined hue space.\n const h1 = C1 < C_EPS ? h2Raw : h1Raw;\n const h2 = C2 < C_EPS ? h1Raw : h2Raw;\n const TWO_PI = Math.PI * 2;\n // Shortest-arc delta in [-π, π].\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}\n\n/** Which space a color blend is computed in. `'rgb'` is cheapest; `'oklab'`\n * is perceptually even; `'oklch'` additionally travels around the hue wheel\n * rather than through it. */\nexport type ColorSpace = 'rgb' | 'oklab' | 'oklch';\n\nconst u2f = (v: number): number => v / 255;\n\n/** Lerp a flat RGBA color array `from` toward `to`. Inputs are 0..1\n * floats (the renderer's color space); outputs are 0..1 floats too.\n * Alpha is always linearly lerped; RGB channels are lerped in the\n * requested color space. OKLab / OKLCh paths bounce through u8 because\n * the gamma-correction LUT and gamut-clip routines are byte-keyed —\n * the round-trip is lossy at <1% per channel, well under the visible\n * threshold for these animations. */\nexport function lerpColorArray(\n from: readonly number[],\n to: readonly number[],\n t: number,\n space: ColorSpace = 'rgb',\n): number[] {\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<number>(from.length);\n const n = from.length / 4;\n if (space === 'rgb') {\n // Pure float lerp — no rounding (which previously discretized 0..1\n // inputs to 0/1, giving the cycle its 'choppy 8-corner' look).\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}\n\n// ---------------------------------------------------------------------------\n// OKLCh in degrees\n// ---------------------------------------------------------------------------\n\n/**\n * OKLCh with the hue in **degrees**, and `#rrggbb` on the other side.\n *\n * The helpers above take radians, because that is what the math wants. Every\n * consumer that authors colors — a theme ramp, a palette generator — wants\n * degrees and a hex string, and two packages independently built the same\n * wrapper before this existed.\n */\nexport interface OklchDeg {\n readonly L: number;\n readonly C: number;\n /** 0..360. */\n readonly H: number;\n}\n\nconst hex2 = (v: number): string => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0');\n\n/**\n * OKLCh (hue in degrees) to `#rrggbb`. Over-saturated requests come back at\n * the gamut boundary: `oklabToSrgbU8` clips chroma at constant lightness, which\n * is what lets a caller find a hue's ceiling by asking for far more than exists.\n */\nexport function oklchDegToHex(L: number, C: number, hueDeg: number): string {\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}\n\n/** A hex color (`#rgb`, `#rgba`, `#rrggbb`, or `#rrggbbaa`, alpha ignored) to\n * OKLCh with the hue wrapped into 0..360. Throws on anything else. */\nexport function hexToOklchDeg(hex: string): OklchDeg {\n const [L, A, B] = srgbU8ToOklab(...hexToRgbBytes(hex));\n const [l, c, h] = oklabToOklch(L, A, B);\n return { L: l, C: c, H: ((((h * 180) / Math.PI) % 360) + 360) % 360 };\n}\n\n// ---------------------------------------------------------------------------\n// Float sRGB transfer, HSL, and interpolation across spaces\n// ---------------------------------------------------------------------------\n\n/** sRGB-encoded channel (0..1) to linear light. Unclamped; odd-symmetric\n * below zero, as CSS `srgb-linear` extends it. */\nexport function srgbToLinear(c: number): number {\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}\n\n/** Linear-light channel to sRGB encoding (0..1). Unclamped. */\nexport function linearToSrgb(c: number): number {\n const a = Math.abs(c);\n const v = a <= 0.0031308 ? a * 12.92 : 1.055 * Math.pow(a, 1 / 2.4) - 0.055;\n return c < 0 ? -v : v;\n}\n\n/** HSL to sRGB. Hue in degrees, saturation, lightness and output all 0..1. */\nexport function hslToSrgb(h: number, s: number, l: number): [number, number, number] {\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}\n\nfunction hueToChannel(p: number, q: number, t: number): number {\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}\n\n/** sRGB (0..1) to HSL: `[hue°, saturation, lightness]`, hue in 0..360. An\n * achromatic color reports hue 0 and saturation 0. */\nexport function srgbToHsl(r: number, g: number, b: number): [number, number, number] {\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: number;\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}\n\n/**\n * The space a color interpolation runs in, spelled as CSS `color-mix()` spells\n * them. `'srgb'` and `'srgb-linear'` blend gamma-encoded and linear-light\n * channels; `'oklab'` blends perceptual coordinates; `'oklch'` and `'hsl'` are\n * polar, so their hue travels around the wheel rather than through it.\n *\n * Distinct from {@link ColorSpace}, the gradient and animation vocabulary,\n * which keeps its `'rgb'` spelling and its byte-precision paths.\n */\nexport type ColorInterpolationSpace = 'oklch' | 'oklab' | 'hsl' | 'srgb' | 'srgb-linear';\n\n/** Which way a polar space's hue goes between two endpoints, as CSS\n * `hue-interpolation-method`: the arc of at most 180°, or the other one. */\nexport type HueInterpolation = 'shorter' | 'longer';\n\n/** An endpoint with less chroma (OKLCH) or saturation (HSL) than this has no\n * hue of its own. */\nconst ACHROMATIC_EPS = 1e-4;\n\nfunction lerpHueDeg(h1: number, h2: number, t: number, method: HueInterpolation): number {\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}\n\ntype Polar = readonly [radius: number, hueDeg: number, axis: number];\n\nfunction lerpPolar(a: Polar, b: Polar, t: number, method: HueInterpolation): [number, number, number] {\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}\n\ntype Rgb = readonly [number, number, number];\n\nconst lerp3 = (a: Rgb, b: Rgb, t: number): [number, number, number] => [\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];\n\nconst clamp01 = (v: number): number => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst srgbToOklabFloat = (c: Rgb): [number, number, number] =>\n linearSrgbToOklab(srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2]));\n\nfunction oklabToSrgbClipped(L: number, A: number, B: number): [number, number, number] {\n const [rl, gl, bl] = clipToGamut(L, A, B);\n return [clamp01(linearToSrgb(rl)), clamp01(linearToSrgb(gl)), clamp01(linearToSrgb(bl))];\n}\n\n/**\n * Interpolate between two sRGB colors (0..1 floats) in `space`, at `t` in 0..1.\n * Float precision throughout, with no byte round-trip. The result is sRGB;\n * only OKLab and OKLCH blends can leave gamut, and those come back\n * chroma-clipped at constant OKLab lightness.\n *\n * `hue` applies to the polar spaces only. An endpoint with no chroma (OKLCH)\n * or no saturation (HSL) borrows the other endpoint's hue, so a ramp to white\n * or black holds its hue instead of sweeping from red.\n */\nexport function interpolateSrgb(\n from: readonly [number, number, number],\n to: readonly [number, number, number],\n t: number,\n space: ColorInterpolationSpace = 'oklch',\n hue: HueInterpolation = 'shorter',\n): [number, number, number] {\n switch (space) {\n case 'srgb':\n return lerp3(from, to, t);\n case 'srgb-linear': {\n const lin = (c: Rgb): Rgb => [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: Rgb): Polar => {\n const [L, C, h] = oklabToOklch(...srgbToOklabFloat(c));\n return [C, (((h * 180) / Math.PI) % 360 + 360) % 360, L];\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: Rgb): Polar => {\n const [h, s, l] = srgbToHsl(c[0], c[1], c[2]);\n return [s, h, l];\n };\n const [s, h, l] = lerpPolar(polar(from), polar(to), t, hue);\n return hslToSrgb(h, s, l);\n }\n }\n}\n","import { hslToSrgb, linearToSrgb, oklabToLinearSrgb, oklchToOklab } from './colorSpaces';\nimport { parseHexBytes } from './hex';\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 * - `color(srgb …)` and `color(srgb-linear …)`; `oklab()` and `oklch()`, clamped into sRGB\n *\n * Not supported: `lab()`, `lch()`, other `color()` spaces, `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 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 if (lower.startsWith('color(')) {\n const parsed = parseColorFunction(lower);\n if (parsed) return parsed;\n }\n if (lower.startsWith('ok')) {\n const parsed = parseOkFunction(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). The cache is capped at ~1024 entries and\n * cleared wholesale on overflow. */\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 hashed = trimmed.startsWith('#') ? trimmed : `#${trimmed}`;\n const bytes = parseHexBytes(hashed);\n if (!bytes) throw new Error(`normalizeHex: invalid hex \"${input}\"`);\n const digits = bytes.map((n) => n.toString(16).padStart(2, '0')).join('');\n const namesAlpha = hashed.length === 5 || hashed.length === 9;\n return `#${namesAlpha ? digits : digits.slice(0, 6)}`;\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 bytes = parseHexBytes(s);\n if (!bytes) throw new Error(`parseColor: invalid hex \"${s}\"`);\n return [bytes[0] / 255, bytes[1] / 255, bytes[2] / 255, bytes[3] / 255];\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] = hslToSrgb(h, sat, lit);\n return [r, g, b, parseAlpha(channels.alpha)];\n}\n\n/** `color(srgb …)` or `color(srgb-linear …)`, channels as numbers 0..1 or percents. */\nfunction parseColorFunction(s: string): [number, number, number, number] | null {\n const body = unwrapFn(s, 'color');\n const space = body?.match(/^(srgb-linear|srgb)\\s+/);\n if (!body || !space || body.includes(',')) return null;\n const channels = splitChannels(body.slice(space[0].length));\n if (!channels) return null;\n const rgb = channels.rgb.map((tok) => parseChannel(tok, 1));\n if (rgb.some((c) => c === null)) return null;\n const [r, g, b] = (space[1] === 'srgb' ? rgb : rgb.map((c) => linearToSrgb(c as number))) as number[];\n return [clamp01(r as number), clamp01(g as number), clamp01(b as number), parseAlpha(channels.alpha)];\n}\n\n/** `oklab(L a b)` or `oklch(L C h)`, clamped into sRGB. L is 0..1 or a percent; a, b and C are numbers. */\nfunction parseOkFunction(s: string): [number, number, number, number] | null {\n const lch = unwrapFn(s, 'oklch');\n const body = lch ?? unwrapFn(s, 'oklab');\n if (body === null || body.includes(',')) return null;\n const channels = splitChannels(body);\n if (!channels) return null;\n const L = parsePercentOrNumber(channels.rgb[0]);\n const second = Number(channels.rgb[1]);\n if (L === null || !Number.isFinite(second)) return null;\n let A = second;\n let B = Number(channels.rgb[2]);\n if (lch !== null) {\n const h = parseHue(channels.rgb[2]);\n if (h === null) return null;\n [, A, B] = oklchToOklab(L, second, h * (Math.PI / 180));\n } else if (!Number.isFinite(B)) return null;\n const [r, g, b] = oklabToLinearSrgb(L, A, B).map((c) => clamp01(linearToSrgb(c)));\n return [r as number, g as number, b as number, 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\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 * Scalar / 2-vector primitives and the kernel-wide epsilon policy.\n *\n * Points are scalar pairs (px, py); there is no point struct. All math is\n * f64 (JS-native). Epsilons are f32-SCALE and magnitude-relative, because\n * stored coords are quantized to Float32 (~7 significant digits).\n */\n\n/** Base relative epsilon, sized for Float32 storage (~1 part in 1e-6). */\nexport const EPS = 1e-6;\n\n/** A determinant at or below this fraction of its matrix's own scale counts as\n * singular. Dimensionless, so a uniformly tiny matrix still inverts while a\n * large one whose determinant is only rounding does not. */\nexport const SINGULAR_RATIO = 1e-12;\n\n/** `v` held to `lo`..`hi`. `lo` wins when the bounds cross; `NaN` passes through. */\nexport function clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n\n/** 2D cross (wedge) product of vectors (ax,ay) and (bx,by). */\nexport function cross(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n\n/** 2D dot product. */\nexport function dot(ax: number, ay: number, bx: number, by: number): number {\n return ax * bx + ay * by;\n}\n\n/** Component difference (ax-bx, ay-by) as a tuple. Cold-path use only. */\nexport function sub(ax: number, ay: number, bx: number, by: number): [number, number] {\n return [ax - bx, ay - by];\n}\n\n/** Squared length of (x,y). Avoids the sqrt; compare against squared thresholds. */\nexport function len2(x: number, y: number): number {\n return x * x + y * y;\n}\n\n/** Three-valued sign. */\nexport function sign(n: number): -1 | 0 | 1 {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\n\n/**\n * Magnitude-scaled approximate equality. Two values are equal when their\n * absolute difference is within EPS scaled by the larger magnitude. Every\n * comparison of two *computed coordinates* goes through this — never `===`,\n * never an f64-tight literal.\n *\n * The exception is a guard against an exact algebraic value that a formula\n * produces bit-for-bit: a homogeneous `w === 1`, a ray's `d === 0`. Those are\n * testing a branch, not comparing coordinates. Widening one to `approxEq`\n * would change which branch runs, not how precisely it runs.\n */\nexport function approxEq(a: number, b: number, eps: number = EPS): boolean {\n if (a === b) return true; // also the only way two infinities compare equal\n const diff = Math.abs(a - b);\n // Infinity/Infinity is 1, so an unguarded relative test calls every finite\n // number equal to an infinity.\n if (!Number.isFinite(diff)) return false;\n const scale = Math.max(1, Math.abs(a), Math.abs(b));\n return diff <= eps * scale;\n}\n","/**\n * 2D affine transforms in canvas/DOMMatrix order: [a, b, c, d, e, f].\n * x' = a·x + c·y + e\n * y' = b·x + d·y + f\n * Represented as a readonly 6-tuple (f64). The affine tier of the kernel.\n *\n * `glMat3.ts` beside this file holds the renderer's matrix: a 9-element\n * column-major array (a full 3×3) laid out for `uniformMatrix3fv`. Its\n * *logical element order* is identical to ours.\n */\nimport { SINGULAR_RATIO } from './scalar';\n\n/** `[a, b, c, d, e, f]`: `x' = a·x + c·y + e`, `y' = b·x + d·y + f`. */\nexport type Affine = readonly [number, number, number, number, number, number];\n\n/** The transform that leaves a point where it is. */\nexport function identity(): Affine {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/** A pure translation by `(tx, ty)`. */\nexport function translate(tx: number, ty: number): Affine {\n return [1, 0, 0, 1, tx, ty];\n}\n\n/** A pure scale about the origin. Scale about another point by composing\n * translate → scale → inverse translate with `multiply`. */\nexport function scale(sx: number, sy: number): Affine {\n return [sx, 0, 0, sy, 0, 0];\n}\n\n/** A pure rotation about the origin, in radians, clockwise in canvas\n * coordinates (y down). */\nexport function rotate(rad: number): Affine {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n return [c, s, -s, c, 0, 0];\n}\n\n/** Compose: result applies `n` first, then `m` (m·n). */\nexport function multiply(m: Affine, n: Affine): Affine {\n return [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n ];\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Affine): Affine | null {\n const det = m[0] * m[3] - m[1] * m[2];\n // The determinant is an area, so it is judged against the squared column norms.\n const norm2 = Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3]);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * norm2)) return null;\n const id = 1 / det;\n const a = m[3] * id;\n const b = -m[1] * id;\n const c = -m[2] * id;\n const d = m[0] * id;\n return [a, b, c, d, -(m[4] * a + m[5] * c), -(m[4] * b + m[5] * d)];\n}\n\n/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */\nexport function applyToPoint(m: Affine, x: number, y: number): [number, number] {\n return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n}\n\n/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */\nexport function boxToBox(\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number,\n): Affine {\n const kx = sw === 0 ? 1 : dw / sw;\n const ky = sh === 0 ? 1 : dh / sh;\n // translate(dx,dy) · scale(kx,ky) · translate(-sx,-sy)\n return [kx, 0, 0, ky, dx - sx * kx, dy - sy * ky];\n}\n\n/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */\nexport function rotateAboutPoint(cx: number, cy: number, rad: number): Affine {\n return multiply(translate(cx, cy), multiply(rotate(rad), translate(-cx, -cy)));\n}\n\n/**\n * Apply an affine to an interleaved coord stream, returning a fresh f64\n * buffer. Command codes are unaffected — for a Bezier the transformed control\n * points define the transformed curve exactly (affine invariance), so callers\n * pass `path.coords` straight through and keep `path.commands` as-is.\n */\nexport function transformCoords(coords: ArrayLike<number>, m: Affine): Float64Array {\n const out = new Float64Array(coords.length);\n const a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n out[i] = a * x + c * y + e;\n out[i + 1] = b * x + d * y + f;\n }\n return out;\n}\n","/**\n * 2D affine matrix utilities. Column-major 9 elements, matching\n * `WebGL2RenderingContext.uniformMatrix3fv` element order so an upload needs\n * no transpose flag.\n *\n * Layout (column-major):\n * [m00, m10, 0,\n * m01, m11, 0,\n * tx, ty, 1]\n */\n\nimport { invert as invertAffine, type Affine } from './affine';\n\n/**\n * A 2D affine transform as a column-major 9-element array, laid out as above.\n *\n * Every matrix the kit builds is a `Float64Array`: a view translation far\n * from the origin at high zoom needs more than a float32's 24 bits to hold a\n * fraction of a pixel. A `Float32Array` is accepted wherever one is read.\n * `mat3.toUniform` makes the float32 copy a GL uniform upload wants.\n */\nexport type GlMat3 = Float32Array | Float64Array;\n\nfunction create(a: number, b: number, c: number, d: number, tx: number, ty: number): GlMat3 {\n // Column-major:\n // col 0: (a, b, 0)\n // col 1: (c, d, 0)\n // col 2: (tx, ty, 1)\n return new Float64Array([a, b, 0, c, d, 0, tx, ty, 1]);\n}\n\nfunction identity(): GlMat3 {\n return create(1, 0, 0, 1, 0, 0);\n}\n\nfunction multiply(out: GlMat3, m: GlMat3): GlMat3 {\n // out := out · m (right-multiply by m).\n const a = out[0], b = out[1];\n const c = out[3], d = out[4];\n const tx = out[6], ty = out[7];\n const ma = m[0], mb = m[1];\n const mc = m[3], md = m[4];\n const mtx = m[6], mty = m[7];\n\n return create(\n a * ma + c * mb, // new a\n b * ma + d * mb, // new b\n a * mc + c * md, // new c\n b * mc + d * md, // new d\n a * mtx + c * mty + tx, // new tx\n b * mtx + d * mty + ty, // new ty\n );\n}\n\n/** `m · T(tx, ty)`: composes onto `m`, where `@weasel-js/geom`'s `translate`\n * constructs a fresh matrix. */\nfunction translated(m: GlMat3, tx: number, ty: number): GlMat3 {\n const t = create(1, 0, 0, 1, tx, ty);\n return multiply(m, t);\n}\n\n/** `m · S(sx, sy)`: composes onto `m`, where geom's `scale` constructs one. */\nfunction scaled(m: GlMat3, sx: number, sy: number): GlMat3 {\n const s = create(sx, 0, 0, sy, 0, 0);\n return multiply(m, s);\n}\n\n/** This layout read as the kernel's 6-element affine. The two carry the same\n * logical order, so the conversion is a repack and nothing else. */\nfunction toAffine(m: GlMat3): Affine {\n return [m[0], m[1], m[3], m[4], m[6], m[7]];\n}\n\n/** The kernel's affine in this layout. The inverse of {@link toAffine}. */\nfunction fromAffine(a: Affine): GlMat3 {\n return create(a[0], a[1], a[2], a[3], a[4], a[5]);\n}\n\n/** Inverse of an affine matrix, or `null` when `@weasel-js/geom`'s `invert`\n * finds it singular — the same rule, read through this layout. */\nfunction invert(m: GlMat3): GlMat3 | null {\n const inv = invertAffine(toAffine(m));\n return inv && fromAffine(inv);\n}\n\n/** A float32 copy of `m`, for `uniformMatrix3fv` or a shader uniform value. */\nfunction toUniform(m: GlMat3): Float32Array {\n return Float32Array.from(m);\n}\n\nfunction apply(m: GlMat3, x: number, y: number): [number, number] {\n const a = m[0], b = m[1];\n const c = m[3], d = m[4];\n const tx = m[6], ty = m[7];\n return [a * x + c * y + tx, b * x + d * y + ty];\n}\n\n/**\n * Map screen pixel coords (0..width on X, 0..height on Y, top-left origin)\n * into clip space (-1..1 on X, 1..-1 on Y — note Y flip so screen-down\n * matches clip-down).\n */\nfunction screenToClip(width: number, height: number): GlMat3 {\n return create(\n 2 / width, // a\n 0, // b\n 0, // c\n -2 / height, // d\n -1, // tx\n 1, // ty\n );\n}\n\n/**\n * Uniform-equivalent scale factor: the square root of the absolute\n * determinant of the linear part, i.e. the geometric mean of the two axis\n * scales. Rotation-invariant. Under non-uniform scale it is between the two\n * axes and exact on neither — the same compromise `meanScale` documents.\n */\nfunction meanScaleOf(m: GlMat3): number {\n return Math.sqrt(Math.abs(m[0] * m[4] - m[1] * m[3]));\n}\n\n/** The least any direction is scaled by the linear part — its smaller singular\n * value. What a screen length is worth in world units, at most. */\nfunction minScaleOf(m: GlMat3): number {\n const sum = m[0] * m[0] + m[1] * m[1] + m[3] * m[3] + m[4] * m[4];\n const det = m[0] * m[4] - m[1] * m[3];\n return Math.sqrt(Math.max(0, (sum - Math.sqrt(Math.max(0, sum * sum - 4 * det * det))) / 2));\n}\n\n/** The renderer's 3x3 matrix operations, as one namespace. These work on the\n * 9-element form the GL uniform upload wants — distinct from the 6-element\n * `Affine`, though the logical element order is the same. */\nexport const mat3 = {\n identity,\n toAffine,\n fromAffine,\n multiply,\n translated,\n scaled,\n invert,\n toUniform,\n apply,\n screenToClip,\n meanScaleOf,\n minScaleOf,\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. A Coons patch reads its interior off the boundary alone; a\n * tensor patch adds four interior control points that pull it around.\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. Twelve points is a Coons\n * patch and sixteen is a tensor patch.\n *\n * `colors` are the corner colors in the same walk order.\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 */\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. */\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: each patch is subdivided into small\n * quads and rasterized forward, once per paint, into a texture the shader then\n * samples. Inverting a bicubic per fragment would be Newton iteration.\n *\n * The bitmap is straight (non-premultiplied) RGBA; the fragment shader\n * premultiplies.\n */\n\nimport { resolveColor } from '@weasel-js/paint';\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`. Three lerps rather than four\n * weights, because a perceptual space has no meaningful four-way mix — OKLCh's\n * hue 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, or `null`\n * when no patch is drawable.\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. A pixel exactly on\n * an edge two cells share is claimed by both — harmless, because both carry\n * the same color there.\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 * Everything outside the bake's box is transparent: a mesh covers the area its\n * patches cover, not the whole shape it is filling, and a clamped read would\n * otherwise smear its border colors 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. Output is 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: a set of curved quadrilateral patches, each with a color at every\n * corner.\n *\n * It uses only the slots `registerPaintKind` gives a consumer, so whatever it\n * can do, a consumer's own kind can do too.\n */\n\nimport type { GradStop } from '@weasel-js/paint';\nimport type { PaintBindContext, PaintDrawKind, PaintProgram, PaintResources } from '../paintKinds';\nimport { resolveColor, rgbaToHex } from '@weasel-js/paint';\nimport { mat3 } from '@weasel-js/geom';\nimport { oklabToOklch, oklabToSrgbU8, oklchToOklab, srgbFloatToOklab } from '@weasel-js/paint';\nimport type { ColorSpace, Paint, PaintUnits } from '@weasel-js/paint';\nimport type { FillPoseBox } from '../fillInPoseFrame';\nimport { bakeMesh, meshBounds, type MeshBox } from './bake';\nimport { MeshBakeCache, meshBakeSize } from './bakeCache';\nimport { isValidPatch, type MeshPatch, type MeshPoint } from './surface';\nimport { MESH_FRAG_SRC, MESH_PROGRAM_ID, MESH_VERT_SRC } from './meshShader';\n\nexport type { MeshPatch, MeshPoint } from './surface';\n\n/**\n * A mesh gradient paint.\n *\n * `patches` are in the space `units` names, the same way a gradient's\n * geometry is — under `'bounds'` every point is a fraction of the painted\n * node's box, which is what lets the paint survive a resize.\n *\n * `interpolate` is the space corner colors blend through, matching the three\n * gradients.\n */\nexport interface MeshGradientPaint {\n kind: 'mesh-gradient';\n patches: MeshPatch[];\n units?: PaintUnits;\n interpolate?: ColorSpace;\n opacity?: number;\n}\n\n/** The kind's id, as `Paint['fill']` carries it. */\nexport const MESH_GRADIENT_KIND = 'mesh-gradient';\n\n/** A mesh paint, narrowed. */\nexport function isMeshGradientPaint(fill: Paint | null | undefined): fill is Paint & MeshGradientPaint {\n // `Paint`'s discriminant stays closed over the built-in kinds — see\n // `asPaint` — so a registered kind reads it widened.\n return fill != null && (fill.kind as string | undefined) === MESH_GRADIENT_KIND;\n}\n\nfunction asMesh(fill: Paint): MeshGradientPaint {\n return fill as unknown as MeshGradientPaint;\n}\n\n// `asPaint`'s cast, kept local: this module must import nothing from the\n// registry, whose state the lazy kind's self-contained copy would duplicate.\nfunction asFill(mesh: MeshGradientPaint): Paint {\n return mesh as unknown as Paint;\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): MeshGradientPaint {\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 kind: 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[]): MeshGradientPaint {\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 { kind: 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: MeshGradientPaint): 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: MeshGradientPaint, move: (p: MeshPoint) => MeshPoint): MeshPatch[] {\n return mesh.patches.map((patch) => ({ ...patch, points: patch.points.map(move) }));\n}\n\n// ─── The bake cache ─────────────────────────────────────────────────────────\n//\n// A kind owns its own GPU state; the registry hands it a `gl` and a resource\n// lifetime. One cache per lifetime, so two renderers — or one renderer past a\n// context restore — never trade textures, and the lifetime's end frees them.\n\ninterface CachedBake {\n texture: WebGLTexture;\n /** Where the mesh being bound sits in paint space. The texels are shared by\n * every pose-frame copy of one paint; the box is each copy's own. */\n box: MeshBox;\n}\n\n/** The paint a pose-frame copy was made from. A copy is rebuilt whenever its\n * node's pose changes, and bakes the same texels as its source. */\nconst BAKE_SOURCE = new WeakMap<object, object>();\n\nconst CACHES = new WeakMap<PaintResources, MeshBakeCache<WebGLTexture>>();\n\nfunction cacheFor(ctx: PaintBindContext): MeshBakeCache<WebGLTexture> {\n let cache = CACHES.get(ctx.resources);\n if (!cache) {\n const gl = ctx.gl;\n const made = new MeshBakeCache<WebGLTexture>((texture) => gl.deleteTexture(texture));\n ctx.resources.onRelease(() => {\n made.clear();\n CACHES.delete(ctx.resources);\n });\n CACHES.set(ctx.resources, made);\n cache = made;\n }\n return cache;\n}\n\n/** Device pixels the larger side of `box` covers when drawn in `units`. */\nfunction devicePixelsOf(ctx: PaintBindContext, mesh: MeshGradientPaint, 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: MeshGradientPaint): CachedBake | null {\n const box = meshBounds(mesh.patches);\n if (!box) return null;\n const size = meshBakeSize(devicePixelsOf(ctx, mesh, box), ctx.maxTextureSize);\n\n const cache = cacheFor(ctx);\n const key = BAKE_SOURCE.get(mesh) ?? mesh;\n const hit = cache.get(key, size);\n if (hit) return { texture: hit, box };\n\n const baked = bakeMesh(mesh.patches, mesh.interpolate ?? 'rgb', size);\n if (!baked) return null;\n\n const gl = ctx.gl;\n const texture = gl.createTexture();\n if (!texture) return null;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n baked.size, baked.size, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, baked.pixels,\n );\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n cache.set(key, size, texture);\n return { texture, box };\n}\n\nfunction bindMesh(ctx: PaintBindContext, fill: Paint): PaintProgram | null {\n const mesh = asMesh(fill);\n if (!mesh.patches.some(isValidPatch)) return null;\n\n const inverse = ctx.spaceInverse(mesh.units);\n if (!inverse) return null;\n\n const program = ctx.program(MESH_PROGRAM_ID);\n if (!program) return null;\n\n const entry = bakeFor(ctx, mesh);\n if (!entry) return null;\n\n const gl = ctx.gl;\n gl.useProgram(program.handle);\n ctx.setProjAndModel(program);\n gl.uniformMatrix3fv(program.uniform('u_worldInv')!, false, mat3.toUniform(inverse));\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, entry.texture);\n gl.uniform1i(program.uniform('u_sampler')!, 0);\n\n const { box } = entry;\n gl.uniform2f(program.uniform('u_meshOrigin')!, box.x, box.y);\n gl.uniform2f(program.uniform('u_meshSize')!, box.width, box.height);\n gl.uniform1f(program.uniform('u_opacity')!, mesh.opacity ?? 1);\n gl.uniform1f(program.uniform('u_alpha')!, ctx.alpha);\n return program;\n}\n\n/** The kind's draw half, shader program included. Core adds the editor's\n * slots and registers the whole entry. */\nexport const meshDrawKind: PaintDrawKind = {\n id: MESH_GRADIENT_KIND,\n programs: { [MESH_PROGRAM_ID]: { vert: MESH_VERT_SRC, frag: MESH_FRAG_SRC } },\n bind: bindMesh,\n inPoseFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units !== 'bounds') return fill;\n const posed = asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: box.x + p.x * box.width,\n y: box.y + p.y * box.height,\n })),\n units: 'local' as const,\n });\n BAKE_SOURCE.set(posed, fill);\n return posed;\n },\n toBoundsFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units === 'bounds' || box.width === 0 || box.height === 0) return fill;\n return asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: (p.x - box.x) / box.width,\n y: (p.y - box.y) / box.height,\n })),\n units: 'bounds' as const,\n });\n },\n};\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: MeshGradientPaint): 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","import type { IconRef } from '@weasel-js/icons';\nimport type { Paint } from '@weasel-js/paint';\nimport {\n meshDrawKind, meshFromStops, meshGradientXml, meshStops, seedMeshPatch, type MeshGradientPaint,\n} from '@weasel-js/renderer/mesh';\nimport type { PaintKindEntry } from './paintKindEntry';\n\n// `asPaint`'s cast both ways, kept local: this module must import nothing\n// stateful, or `meshKindLazy`'s self-contained copy would duplicate it.\nconst asMesh = (fill: Paint): MeshGradientPaint => fill as unknown as MeshGradientPaint;\nconst asFill = (mesh: MeshGradientPaint): Paint => mesh as unknown as Paint;\n\n/** The `mesh-gradient` kind's registry entry. `./registerMesh` registers it;\n * the paint-kind registry loads it on demand otherwise. */\nexport const meshGradientKind: PaintKindEntry = {\n ...meshDrawKind,\n label: 'Mesh',\n // Written as library mode emits `icon('paintMesh')`: the call would pull the icons package into meshKindLazy.\n icon: /* @icon */ 'core:paintMesh' as IconRef,\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 toSvg: (id, fill) => meshGradientXml(id, asMesh(fill)),\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"meshKindLazy.js","names":["invert","invertAffine","asMesh","asFill"],"sources":["../../../../paint/src/hex.ts","../../../../paint/src/colorSpaces.ts","../../../../paint/src/color.ts","../../../../geom/src/scalar.ts","../../../../geom/src/affine.ts","../../../../geom/src/glMat3.ts","../../../../renderer/src/meshPaint/surface.ts","../../../../renderer/src/meshPaint/bake.ts","../../../../renderer/src/meshPaint/bakeCache.ts","../../../../renderer/src/meshPaint/meshShader.ts","../../../../renderer/src/meshPaint/meshPaint.ts","../../../src/core/paint/meshKind.ts"],"sourcesContent":["const HEX = /^#(?:[0-9a-f]{3,4}|[0-9a-f]{6}|[0-9a-f]{8})$/i;\n\n/**\n * The kit's one hex color reader: `#rgb`, `#rgba`, `#rrggbb`, or `#rrggbbaa`,\n * in any case, as four 0..255 channels with alpha last (255 when the color\n * names none). `null` for anything else, a missing `#` included.\n */\nexport function parseHexBytes(input: string): [number, number, number, number] | null {\n if (!HEX.test(input)) return null;\n const digits = input.slice(1);\n const long = digits.length <= 4 ? digits.replace(/./g, '$&$&') : digits;\n const byte = (i: number): number => Number.parseInt(long.slice(i, i + 2), 16);\n return [byte(0), byte(2), byte(4), long.length === 8 ? byte(6) : 255];\n}\n\n/** A hex color's red, green, and blue as 0..255, its alpha dropped. Throws on anything {@link parseHexBytes} does not read. */\nexport function hexToRgbBytes(input: string): [number, number, number] {\n const bytes = parseHexBytes(input);\n if (!bytes) throw new Error(`not a hex color: \"${input}\"`);\n return [bytes[0], bytes[1], bytes[2]];\n}\n","// sRGB ↔ OKLab conversion. Reference: https://bottosson.github.io/posts/oklab/\n\nimport { hexToRgbBytes } from './hex';\n\nconst SRGB_TO_LINEAR: Float64Array = (() => {\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})();\n\nfunction linearToSrgbByte(c: number): number {\n if (c <= 0) return 0;\n if (c >= 1) return 255;\n const v = c <= 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n return Math.round(v * 255);\n}\n\n/** 0..1 float channel to the 8-bit index the LUTs are cut for. Rounds and\n * clamps; `& 0xff` would truncate, and wrap anything out of range. */\nconst f2u = (v: number): number => Math.max(0, Math.min(255, Math.round(v * 255)));\n\n/**\n * Convert a 0..1 float sRGB triple to OKLab — the renderer's own color space,\n * and what a caller holding a `resolveColor` result has. Rounds into the u8\n * grid the way every other float→u8 crossing in this file does, rather than\n * leaving each caller to pick a convention.\n */\nexport function srgbFloatToOklab(r: number, g: number, b: number): [number, number, number] {\n return srgbU8ToOklab(f2u(r), f2u(g), f2u(b));\n}\n\n/** Convert an 8-bit sRGB triple to OKLab. Channels are indices into a 256-entry\n * LUT: pass integers, or `srgbFloatToOklab` for 0..1 floats. */\nexport function srgbU8ToOklab(r: number, g: number, b: number): [number, number, number] {\n return linearSrgbToOklab(SRGB_TO_LINEAR[r & 0xff], SRGB_TO_LINEAR[g & 0xff], SRGB_TO_LINEAR[b & 0xff]);\n}\n\n/** Linear-light sRGB (0..1 floats, unclamped) to OKLab. */\nexport function linearSrgbToOklab(rl: number, gl: number, bl: number): [number, number, number] {\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.7936177850 * mp - 0.0040720468 * sp,\n 1.9779984951 * lp - 2.4285922050 * mp + 0.4505937099 * sp,\n 0.0259040371 * lp + 0.7827717662 * mp - 0.8086757660 * sp,\n ];\n}\n\n/** OKLab to linear-light sRGB. Not gamut-clipped: out-of-gamut colors come\n * back with channels outside 0..1. */\nexport function oklabToLinearSrgb(L: number, A: number, B: number): [number, number, number] {\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.2914855480 * 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.7076147010 * s,\n ];\n}\n\nfunction inGamut(rl: number, gl: number, bl: number): boolean {\n // Small epsilon absorbs float-roundtrip noise on pure-primary colors.\n const eps = 1e-6;\n return (\n rl >= -eps && rl <= 1 + eps &&\n gl >= -eps && gl <= 1 + eps &&\n bl >= -eps && bl <= 1 + eps\n );\n}\n\nfunction clipToGamut(L: number, A: number, B: number): [number, number, number] {\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 // 5 iterations → ~3% chroma precision; sufficient for u8 output.\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; else hi = t;\n }\n [rl, gl, bl] = oklabToLinearSrgb(L, A * lo, B * lo);\n return [rl, gl, bl];\n}\n\n/** Convert OKLab back to an 8-bit sRGB triple, clamped into gamut. */\nexport function oklabToSrgbU8(L: number, A: number, B: number): [number, number, number] {\n const [rl, gl, bl] = clipToGamut(L, A, B);\n return [linearToSrgbByte(rl), linearToSrgbByte(gl), linearToSrgbByte(bl)];\n}\n\n/** Blend two 8-bit sRGB colors through OKLab. Perceptually even, and it does\n * not pass through the muddy midpoints an sRGB blend produces between\n * complementary hues. */\nexport function lerpOklab(\n from: readonly [number, number, number],\n to: readonly [number, number, number],\n t: number,\n): [number, number, number] {\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}\n\n/**\n * `color-mix(in oklab, a p%, b)` for two 0..1 sRGBA colors, `p` as 0..1: the\n * channels mix premultiplied by alpha, as CSS does, so a transparent side\n * lends the result its opacity and none of its color.\n */\nexport function mixOklab(\n a: readonly [number, number, number, number],\n b: readonly [number, number, number, number],\n p: number,\n): [number, number, number, number] {\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: number) => (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}\n\n/** Convert OKLab (L, a, b) to OKLCh (L, C, h). h is in radians, range [-π, π]. */\nexport function oklabToOklch(L: number, A: number, B: number): [number, number, number] {\n const C = Math.hypot(A, B);\n const h = Math.atan2(B, A);\n return [L, C, h];\n}\n\n/** Convert OKLCh (L, C, h) to OKLab (L, a, b). h is in radians. */\nexport function oklchToOklab(L: number, C: number, h: number): [number, number, number] {\n return [L, C * Math.cos(h), C * Math.sin(h)];\n}\n\n/** Lerp OKLCh values with shortest-arc hue interpolation. Lightness and\n * chroma lerp linearly. When chroma is near zero on either endpoint, hue\n * is taken from the other endpoint (avoids hue snap-from-undefined).\n * h inputs are in radians. */\nexport function lerpOklch(\n from: readonly [number, number, number],\n to: readonly [number, number, number],\n t: number,\n): [number, number, number] {\n const [L1, C1, h1Raw] = from;\n const [L2, C2, h2Raw] = to;\n const C_EPS = 1e-4;\n // When one endpoint is near-achromatic, take hue from the other endpoint\n // to avoid spurious arc rotation through undefined hue space.\n const h1 = C1 < C_EPS ? h2Raw : h1Raw;\n const h2 = C2 < C_EPS ? h1Raw : h2Raw;\n const TWO_PI = Math.PI * 2;\n // Shortest-arc delta in [-π, π].\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}\n\n/** Which space a color blend is computed in. `'rgb'` is cheapest; `'oklab'`\n * is perceptually even; `'oklch'` additionally travels around the hue wheel\n * rather than through it. */\nexport type ColorSpace = 'rgb' | 'oklab' | 'oklch';\n\nconst u2f = (v: number): number => v / 255;\n\n/** Lerp a flat RGBA color array `from` toward `to`. Inputs are 0..1\n * floats (the renderer's color space); outputs are 0..1 floats too.\n * Alpha is always linearly lerped; RGB channels are lerped in the\n * requested color space. OKLab / OKLCh paths bounce through u8 because\n * the gamma-correction LUT and gamut-clip routines are byte-keyed —\n * the round-trip is lossy at <1% per channel, well under the visible\n * threshold for these animations. */\nexport function lerpColorArray(\n from: readonly number[],\n to: readonly number[],\n t: number,\n space: ColorSpace = 'rgb',\n): number[] {\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<number>(from.length);\n const n = from.length / 4;\n if (space === 'rgb') {\n // Pure float lerp — no rounding (which previously discretized 0..1\n // inputs to 0/1, giving the cycle its 'choppy 8-corner' look).\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}\n\n// ---------------------------------------------------------------------------\n// OKLCh in degrees\n// ---------------------------------------------------------------------------\n\n/**\n * OKLCh with the hue in **degrees**, and `#rrggbb` on the other side.\n *\n * The helpers above take radians, because that is what the math wants. Every\n * consumer that authors colors — a theme ramp, a palette generator — wants\n * degrees and a hex string, and two packages independently built the same\n * wrapper before this existed.\n */\nexport interface OklchDeg {\n readonly L: number;\n readonly C: number;\n /** 0..360. */\n readonly H: number;\n}\n\nconst hex2 = (v: number): string => Math.max(0, Math.min(255, Math.round(v))).toString(16).padStart(2, '0');\n\n/**\n * OKLCh (hue in degrees) to `#rrggbb`. Over-saturated requests come back at\n * the gamut boundary: `oklabToSrgbU8` clips chroma at constant lightness, which\n * is what lets a caller find a hue's ceiling by asking for far more than exists.\n */\nexport function oklchDegToHex(L: number, C: number, hueDeg: number): string {\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}\n\n/** A hex color (`#rgb`, `#rgba`, `#rrggbb`, or `#rrggbbaa`, alpha ignored) to\n * OKLCh with the hue wrapped into 0..360. Throws on anything else. */\nexport function hexToOklchDeg(hex: string): OklchDeg {\n const [L, A, B] = srgbU8ToOklab(...hexToRgbBytes(hex));\n const [l, c, h] = oklabToOklch(L, A, B);\n return { L: l, C: c, H: ((((h * 180) / Math.PI) % 360) + 360) % 360 };\n}\n\n// ---------------------------------------------------------------------------\n// Float sRGB transfer, HSL, and interpolation across spaces\n// ---------------------------------------------------------------------------\n\n/** sRGB-encoded channel (0..1) to linear light. Unclamped; odd-symmetric\n * below zero, as CSS `srgb-linear` extends it. */\nexport function srgbToLinear(c: number): number {\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}\n\n/** Linear-light channel to sRGB encoding (0..1). Unclamped. */\nexport function linearToSrgb(c: number): number {\n const a = Math.abs(c);\n const v = a <= 0.0031308 ? a * 12.92 : 1.055 * Math.pow(a, 1 / 2.4) - 0.055;\n return c < 0 ? -v : v;\n}\n\n/** HSL to sRGB. Hue in degrees, saturation, lightness and output all 0..1. */\nexport function hslToSrgb(h: number, s: number, l: number): [number, number, number] {\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}\n\nfunction hueToChannel(p: number, q: number, t: number): number {\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}\n\n/** sRGB (0..1) to HSL: `[hue°, saturation, lightness]`, hue in 0..360. An\n * achromatic color reports hue 0 and saturation 0. */\nexport function srgbToHsl(r: number, g: number, b: number): [number, number, number] {\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: number;\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}\n\n/**\n * The space a color interpolation runs in, spelled as CSS `color-mix()` spells\n * them. `'srgb'` and `'srgb-linear'` blend gamma-encoded and linear-light\n * channels; `'oklab'` blends perceptual coordinates; `'oklch'` and `'hsl'` are\n * polar, so their hue travels around the wheel rather than through it.\n *\n * Distinct from {@link ColorSpace}, the gradient and animation vocabulary,\n * which keeps its `'rgb'` spelling and its byte-precision paths.\n */\nexport type ColorInterpolationSpace = 'oklch' | 'oklab' | 'hsl' | 'srgb' | 'srgb-linear';\n\n/** Which way a polar space's hue goes between two endpoints, as CSS\n * `hue-interpolation-method`: the arc of at most 180°, or the other one. */\nexport type HueInterpolation = 'shorter' | 'longer';\n\n/** An endpoint with less chroma (OKLCH) or saturation (HSL) than this has no\n * hue of its own. */\nconst ACHROMATIC_EPS = 1e-4;\n\nfunction lerpHueDeg(h1: number, h2: number, t: number, method: HueInterpolation): number {\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}\n\ntype Polar = readonly [radius: number, hueDeg: number, axis: number];\n\nfunction lerpPolar(a: Polar, b: Polar, t: number, method: HueInterpolation): [number, number, number] {\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}\n\ntype Rgb = readonly [number, number, number];\n\nconst lerp3 = (a: Rgb, b: Rgb, t: number): [number, number, number] => [\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];\n\nconst clamp01 = (v: number): number => (v < 0 ? 0 : v > 1 ? 1 : v);\n\nconst srgbToOklabFloat = (c: Rgb): [number, number, number] =>\n linearSrgbToOklab(srgbToLinear(c[0]), srgbToLinear(c[1]), srgbToLinear(c[2]));\n\nfunction oklabToSrgbClipped(L: number, A: number, B: number): [number, number, number] {\n const [rl, gl, bl] = clipToGamut(L, A, B);\n return [clamp01(linearToSrgb(rl)), clamp01(linearToSrgb(gl)), clamp01(linearToSrgb(bl))];\n}\n\n/**\n * Interpolate between two sRGB colors (0..1 floats) in `space`, at `t` in 0..1.\n * Float precision throughout, with no byte round-trip. The result is sRGB;\n * only OKLab and OKLCH blends can leave gamut, and those come back\n * chroma-clipped at constant OKLab lightness.\n *\n * `hue` applies to the polar spaces only. An endpoint with no chroma (OKLCH)\n * or no saturation (HSL) borrows the other endpoint's hue, so a ramp to white\n * or black holds its hue instead of sweeping from red.\n */\nexport function interpolateSrgb(\n from: readonly [number, number, number],\n to: readonly [number, number, number],\n t: number,\n space: ColorInterpolationSpace = 'oklch',\n hue: HueInterpolation = 'shorter',\n): [number, number, number] {\n switch (space) {\n case 'srgb':\n return lerp3(from, to, t);\n case 'srgb-linear': {\n const lin = (c: Rgb): Rgb => [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: Rgb): Polar => {\n const [L, C, h] = oklabToOklch(...srgbToOklabFloat(c));\n return [C, (((h * 180) / Math.PI) % 360 + 360) % 360, L];\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: Rgb): Polar => {\n const [h, s, l] = srgbToHsl(c[0], c[1], c[2]);\n return [s, h, l];\n };\n const [s, h, l] = lerpPolar(polar(from), polar(to), t, hue);\n return hslToSrgb(h, s, l);\n }\n }\n}\n","import { hslToSrgb, linearToSrgb, oklabToLinearSrgb, oklchToOklab } from './colorSpaces';\nimport { parseHexBytes } from './hex';\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 * - `color(srgb …)` and `color(srgb-linear …)`; `oklab()` and `oklch()`, clamped into sRGB\n *\n * Not supported: `lab()`, `lch()`, other `color()` spaces, `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 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 if (lower.startsWith('color(')) {\n const parsed = parseColorFunction(lower);\n if (parsed) return parsed;\n }\n if (lower.startsWith('ok')) {\n const parsed = parseOkFunction(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). The cache is capped at ~1024 entries and\n * cleared wholesale on overflow. */\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/** The hex form {@link normalizeHex} writes: `'rgb'` drops alpha, `'rgba'` always writes it (`ff` when none was named). */\nexport type HexForm = 'rgb' | 'rgba';\n\n/**\n * Canonicalize a hex color string to lowercase `#rrggbb` or `#rrggbbaa`: the\n * latter when `form` is `'rgba'`, or with no `form`, when the input names an alpha.\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, form?: HexForm): string {\n const hex = tryNormalizeHex(input, form);\n if (hex === undefined) throw new Error(`normalizeHex: invalid hex \"${input}\"`);\n return hex;\n}\n\n/** {@link normalizeHex}, undefined where it would throw. */\nexport function tryNormalizeHex(input: string, form?: HexForm): string | undefined {\n const trimmed = input.trim();\n const hashed = trimmed.startsWith('#') ? trimmed : `#${trimmed}`;\n const bytes = parseHexBytes(hashed);\n if (!bytes) return undefined;\n const digits = bytes.map((n) => n.toString(16).padStart(2, '0')).join('');\n const alpha = form ? form === 'rgba' : hashed.length === 5 || hashed.length === 9;\n return `#${alpha ? digits : digits.slice(0, 6)}`;\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 bytes = parseHexBytes(s);\n if (!bytes) throw new Error(`parseColor: invalid hex \"${s}\"`);\n return [bytes[0] / 255, bytes[1] / 255, bytes[2] / 255, bytes[3] / 255];\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] = hslToSrgb(h, sat, lit);\n return [r, g, b, parseAlpha(channels.alpha)];\n}\n\n/** `color(srgb …)` or `color(srgb-linear …)`, channels as numbers 0..1 or percents. */\nfunction parseColorFunction(s: string): [number, number, number, number] | null {\n const body = unwrapFn(s, 'color');\n const space = body?.match(/^(srgb-linear|srgb)\\s+/);\n if (!body || !space || body.includes(',')) return null;\n const channels = splitChannels(body.slice(space[0].length));\n if (!channels) return null;\n const rgb = channels.rgb.map((tok) => parseChannel(tok, 1));\n if (rgb.some((c) => c === null)) return null;\n const [r, g, b] = (space[1] === 'srgb' ? rgb : rgb.map((c) => linearToSrgb(c as number))) as number[];\n return [clamp01(r as number), clamp01(g as number), clamp01(b as number), parseAlpha(channels.alpha)];\n}\n\n/** `oklab(L a b)` or `oklch(L C h)`, clamped into sRGB. L is 0..1 or a percent; a, b and C are numbers. */\nfunction parseOkFunction(s: string): [number, number, number, number] | null {\n const lch = unwrapFn(s, 'oklch');\n const body = lch ?? unwrapFn(s, 'oklab');\n if (body === null || body.includes(',')) return null;\n const channels = splitChannels(body);\n if (!channels) return null;\n const L = parsePercentOrNumber(channels.rgb[0]);\n const second = Number(channels.rgb[1]);\n if (L === null || !Number.isFinite(second)) return null;\n let A = second;\n let B = Number(channels.rgb[2]);\n if (lch !== null) {\n const h = parseHue(channels.rgb[2]);\n if (h === null) return null;\n [, A, B] = oklchToOklab(L, second, h * (Math.PI / 180));\n } else if (!Number.isFinite(B)) return null;\n const [r, g, b] = oklabToLinearSrgb(L, A, B).map((c) => clamp01(linearToSrgb(c)));\n return [r as number, g as number, b as number, 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\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 * Scalar / 2-vector primitives and the kernel-wide epsilon policy.\n *\n * Points are scalar pairs (px, py); there is no point struct. All math is\n * f64 (JS-native). Epsilons are f32-SCALE and magnitude-relative, because\n * stored coords are quantized to Float32 (~7 significant digits).\n */\n\n/** Base relative epsilon, sized for Float32 storage (~1 part in 1e-6). */\nexport const EPS = 1e-6;\n\n/** A determinant at or below this fraction of its matrix's own scale counts as\n * singular. Dimensionless, so a uniformly tiny matrix still inverts while a\n * large one whose determinant is only rounding does not. */\nexport const SINGULAR_RATIO = 1e-12;\n\n/** `v` held to `lo`..`hi`. `lo` wins when the bounds cross; `NaN` passes through. */\nexport function clamp(v: number, lo: number, hi: number): number {\n return v < lo ? lo : v > hi ? hi : v;\n}\n\n/** 2D cross (wedge) product of vectors (ax,ay) and (bx,by). */\nexport function cross(ax: number, ay: number, bx: number, by: number): number {\n return ax * by - ay * bx;\n}\n\n/** 2D dot product. */\nexport function dot(ax: number, ay: number, bx: number, by: number): number {\n return ax * bx + ay * by;\n}\n\n/** Component difference (ax-bx, ay-by) as a tuple. Cold-path use only. */\nexport function sub(ax: number, ay: number, bx: number, by: number): [number, number] {\n return [ax - bx, ay - by];\n}\n\n/** Squared length of (x,y). Avoids the sqrt; compare against squared thresholds. */\nexport function len2(x: number, y: number): number {\n return x * x + y * y;\n}\n\n/** Three-valued sign. */\nexport function sign(n: number): -1 | 0 | 1 {\n return n > 0 ? 1 : n < 0 ? -1 : 0;\n}\n\n/**\n * Magnitude-scaled approximate equality. Two values are equal when their\n * absolute difference is within EPS scaled by the larger magnitude. Every\n * comparison of two *computed coordinates* goes through this — never `===`,\n * never an f64-tight literal.\n *\n * The exception is a guard against an exact algebraic value that a formula\n * produces bit-for-bit: a homogeneous `w === 1`, a ray's `d === 0`. Those are\n * testing a branch, not comparing coordinates. Widening one to `approxEq`\n * would change which branch runs, not how precisely it runs.\n */\nexport function approxEq(a: number, b: number, eps: number = EPS): boolean {\n if (a === b) return true; // also the only way two infinities compare equal\n const diff = Math.abs(a - b);\n // Infinity/Infinity is 1, so an unguarded relative test calls every finite\n // number equal to an infinity.\n if (!Number.isFinite(diff)) return false;\n const scale = Math.max(1, Math.abs(a), Math.abs(b));\n return diff <= eps * scale;\n}\n","/**\n * 2D affine transforms in canvas/DOMMatrix order: [a, b, c, d, e, f].\n * x' = a·x + c·y + e\n * y' = b·x + d·y + f\n * Represented as a readonly 6-tuple (f64). The affine tier of the kernel.\n *\n * `glMat3.ts` beside this file holds the renderer's matrix: a 9-element\n * column-major array (a full 3×3) laid out for `uniformMatrix3fv`. Its\n * *logical element order* is identical to ours.\n */\nimport { SINGULAR_RATIO } from './scalar';\n\n/** `[a, b, c, d, e, f]`: `x' = a·x + c·y + e`, `y' = b·x + d·y + f`. */\nexport type Affine = readonly [number, number, number, number, number, number];\n\n/** The transform that leaves a point where it is. */\nexport function identity(): Affine {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/** A pure translation by `(tx, ty)`. */\nexport function translate(tx: number, ty: number): Affine {\n return [1, 0, 0, 1, tx, ty];\n}\n\n/** A pure scale about the origin. Scale about another point by composing\n * translate → scale → inverse translate with `multiply`. */\nexport function scale(sx: number, sy: number): Affine {\n return [sx, 0, 0, sy, 0, 0];\n}\n\n/** A pure rotation about the origin, in radians, clockwise in canvas\n * coordinates (y down). */\nexport function rotate(rad: number): Affine {\n const c = Math.cos(rad);\n const s = Math.sin(rad);\n return [c, s, -s, c, 0, 0];\n}\n\n/** Compose: result applies `n` first, then `m` (m·n). */\nexport function multiply(m: Affine, n: Affine): Affine {\n return [\n m[0] * n[0] + m[2] * n[1],\n m[1] * n[0] + m[3] * n[1],\n m[0] * n[2] + m[2] * n[3],\n m[1] * n[2] + m[3] * n[3],\n m[0] * n[4] + m[2] * n[5] + m[4],\n m[1] * n[4] + m[3] * n[5] + m[5],\n ];\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Affine): Affine | null {\n const det = m[0] * m[3] - m[1] * m[2];\n // The determinant is an area, so it is judged against the squared column norms.\n const norm2 = Math.max(m[0] * m[0] + m[1] * m[1], m[2] * m[2] + m[3] * m[3]);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * norm2)) return null;\n const id = 1 / det;\n const a = m[3] * id;\n const b = -m[1] * id;\n const c = -m[2] * id;\n const d = m[0] * id;\n return [a, b, c, d, -(m[4] * a + m[5] * c), -(m[4] * b + m[5] * d)];\n}\n\n/** Apply to a point, returning a tuple. Cold-path use; hot loops inline. */\nexport function applyToPoint(m: Affine, x: number, y: number): [number, number] {\n return [m[0] * x + m[2] * y + m[4], m[1] * x + m[3] * y + m[5]];\n}\n\n/** Affine that maps source box (sx,sy,sw,sh) onto destination box (dx,dy,dw,dh). */\nexport function boxToBox(\n sx: number, sy: number, sw: number, sh: number,\n dx: number, dy: number, dw: number, dh: number,\n): Affine {\n const kx = sw === 0 ? 1 : dw / sw;\n const ky = sh === 0 ? 1 : dh / sh;\n // translate(dx,dy) · scale(kx,ky) · translate(-sx,-sy)\n return [kx, 0, 0, ky, dx - sx * kx, dy - sy * ky];\n}\n\n/** Rotation by `rad` about pivot (cx,cy): translate(c)·rotate·translate(-c). */\nexport function rotateAboutPoint(cx: number, cy: number, rad: number): Affine {\n return multiply(translate(cx, cy), multiply(rotate(rad), translate(-cx, -cy)));\n}\n\n/**\n * Apply an affine to an interleaved coord stream, returning a fresh f64\n * buffer. Command codes are unaffected — for a Bezier the transformed control\n * points define the transformed curve exactly (affine invariance), so callers\n * pass `path.coords` straight through and keep `path.commands` as-is.\n */\nexport function transformCoords(coords: ArrayLike<number>, m: Affine): Float64Array {\n const out = new Float64Array(coords.length);\n const a = m[0], b = m[1], c = m[2], d = m[3], e = m[4], f = m[5];\n for (let i = 0; i + 1 < coords.length; i += 2) {\n const x = coords[i], y = coords[i + 1];\n out[i] = a * x + c * y + e;\n out[i + 1] = b * x + d * y + f;\n }\n return out;\n}\n","/**\n * 2D affine matrix utilities. Column-major 9 elements, matching\n * `WebGL2RenderingContext.uniformMatrix3fv` element order so an upload needs\n * no transpose flag.\n *\n * Layout (column-major):\n * [m00, m10, 0,\n * m01, m11, 0,\n * tx, ty, 1]\n */\n\nimport { invert as invertAffine, type Affine } from './affine';\n\n/**\n * A 2D affine transform as a column-major 9-element array, laid out as above.\n *\n * Every matrix the kit builds is a `Float64Array`: a view translation far\n * from the origin at high zoom needs more than a float32's 24 bits to hold a\n * fraction of a pixel. A `Float32Array` is accepted wherever one is read.\n * `mat3.toUniform` makes the float32 copy a GL uniform upload wants.\n */\nexport type GlMat3 = Float32Array | Float64Array;\n\nfunction create(a: number, b: number, c: number, d: number, tx: number, ty: number): GlMat3 {\n // Column-major:\n // col 0: (a, b, 0)\n // col 1: (c, d, 0)\n // col 2: (tx, ty, 1)\n return new Float64Array([a, b, 0, c, d, 0, tx, ty, 1]);\n}\n\nfunction identity(): GlMat3 {\n return create(1, 0, 0, 1, 0, 0);\n}\n\nfunction multiply(out: GlMat3, m: GlMat3): GlMat3 {\n // out := out · m (right-multiply by m).\n const a = out[0], b = out[1];\n const c = out[3], d = out[4];\n const tx = out[6], ty = out[7];\n const ma = m[0], mb = m[1];\n const mc = m[3], md = m[4];\n const mtx = m[6], mty = m[7];\n\n return create(\n a * ma + c * mb, // new a\n b * ma + d * mb, // new b\n a * mc + c * md, // new c\n b * mc + d * md, // new d\n a * mtx + c * mty + tx, // new tx\n b * mtx + d * mty + ty, // new ty\n );\n}\n\n/** `m · T(tx, ty)`: composes onto `m`, where `@weasel-js/geom`'s `translate`\n * constructs a fresh matrix. */\nfunction translated(m: GlMat3, tx: number, ty: number): GlMat3 {\n const t = create(1, 0, 0, 1, tx, ty);\n return multiply(m, t);\n}\n\n/** `m · S(sx, sy)`: composes onto `m`, where geom's `scale` constructs one. */\nfunction scaled(m: GlMat3, sx: number, sy: number): GlMat3 {\n const s = create(sx, 0, 0, sy, 0, 0);\n return multiply(m, s);\n}\n\n/** This layout read as the kernel's 6-element affine. The two carry the same\n * logical order, so the conversion is a repack and nothing else. */\nfunction toAffine(m: GlMat3): Affine {\n return [m[0], m[1], m[3], m[4], m[6], m[7]];\n}\n\n/** The kernel's affine in this layout. The inverse of {@link toAffine}. */\nfunction fromAffine(a: Affine): GlMat3 {\n return create(a[0], a[1], a[2], a[3], a[4], a[5]);\n}\n\n/** Inverse of an affine matrix, or `null` when `@weasel-js/geom`'s `invert`\n * finds it singular — the same rule, read through this layout. */\nfunction invert(m: GlMat3): GlMat3 | null {\n const inv = invertAffine(toAffine(m));\n return inv && fromAffine(inv);\n}\n\n/** A float32 copy of `m`, for `uniformMatrix3fv` or a shader uniform value. */\nfunction toUniform(m: GlMat3): Float32Array {\n return Float32Array.from(m);\n}\n\nfunction apply(m: GlMat3, x: number, y: number): [number, number] {\n const a = m[0], b = m[1];\n const c = m[3], d = m[4];\n const tx = m[6], ty = m[7];\n return [a * x + c * y + tx, b * x + d * y + ty];\n}\n\n/**\n * Map screen pixel coords (0..width on X, 0..height on Y, top-left origin)\n * into clip space (-1..1 on X, 1..-1 on Y — note Y flip so screen-down\n * matches clip-down).\n */\nfunction screenToClip(width: number, height: number): GlMat3 {\n return create(\n 2 / width, // a\n 0, // b\n 0, // c\n -2 / height, // d\n -1, // tx\n 1, // ty\n );\n}\n\n/**\n * Uniform-equivalent scale factor: the square root of the absolute\n * determinant of the linear part, i.e. the geometric mean of the two axis\n * scales. Rotation-invariant. Under non-uniform scale it is between the two\n * axes and exact on neither — the same compromise `meanScale` documents.\n */\nfunction meanScaleOf(m: GlMat3): number {\n return Math.sqrt(Math.abs(m[0] * m[4] - m[1] * m[3]));\n}\n\n/** The least any direction is scaled by the linear part — its smaller singular\n * value. What a screen length is worth in world units, at most. */\nfunction minScaleOf(m: GlMat3): number {\n const sum = m[0] * m[0] + m[1] * m[1] + m[3] * m[3] + m[4] * m[4];\n const det = m[0] * m[4] - m[1] * m[3];\n return Math.sqrt(Math.max(0, (sum - Math.sqrt(Math.max(0, sum * sum - 4 * det * det))) / 2));\n}\n\n/** The renderer's 3x3 matrix operations, as one namespace. These work on the\n * 9-element form the GL uniform upload wants — distinct from the 6-element\n * `Affine`, though the logical element order is the same. */\nexport const mat3 = {\n identity,\n toAffine,\n fromAffine,\n multiply,\n translated,\n scaled,\n invert,\n toUniform,\n apply,\n screenToClip,\n meanScaleOf,\n minScaleOf,\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. A Coons patch reads its interior off the boundary alone; a\n * tensor patch adds four interior control points that pull it around.\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. Twelve points is a Coons\n * patch and sixteen is a tensor patch.\n *\n * `colors` are the corner colors in the same walk order.\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 */\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. */\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: each patch is subdivided into small\n * quads and rasterized forward, once per paint, into a texture the shader then\n * samples. Inverting a bicubic per fragment would be Newton iteration.\n *\n * The bitmap is straight (non-premultiplied) RGBA; the fragment shader\n * premultiplies.\n */\n\nimport { resolveColor } from '@weasel-js/paint';\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`. Three lerps rather than four\n * weights, because a perceptual space has no meaningful four-way mix — OKLCh's\n * hue 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, or `null`\n * when no patch is drawable.\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. A pixel exactly on\n * an edge two cells share is claimed by both — harmless, because both carry\n * the same color there.\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 * Everything outside the bake's box is transparent: a mesh covers the area its\n * patches cover, not the whole shape it is filling, and a clamped read would\n * otherwise smear its border colors 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. Output is 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: a set of curved quadrilateral patches, each with a color at every\n * corner.\n *\n * It uses only the slots `registerPaintKind` gives a consumer, so whatever it\n * can do, a consumer's own kind can do too.\n */\n\nimport type { GradStop } from '@weasel-js/paint';\nimport type { PaintBindContext, PaintDrawKind, PaintProgram, PaintResources } from '../paintKinds';\nimport { resolveColor, rgbaToHex } from '@weasel-js/paint';\nimport { mat3 } from '@weasel-js/geom';\nimport { oklabToOklch, oklabToSrgbU8, oklchToOklab, srgbFloatToOklab } from '@weasel-js/paint';\nimport type { ColorSpace, Paint, PaintUnits } from '@weasel-js/paint';\nimport type { FillPoseBox } from '../fillInPoseFrame';\nimport { bakeMesh, meshBounds, type MeshBox } from './bake';\nimport { MeshBakeCache, meshBakeSize } from './bakeCache';\nimport { isValidPatch, type MeshPatch, type MeshPoint } from './surface';\nimport { MESH_FRAG_SRC, MESH_PROGRAM_ID, MESH_VERT_SRC } from './meshShader';\n\nexport type { MeshPatch, MeshPoint } from './surface';\n\n/**\n * A mesh gradient paint.\n *\n * `patches` are in the space `units` names, the same way a gradient's\n * geometry is — under `'bounds'` every point is a fraction of the painted\n * node's box, which is what lets the paint survive a resize.\n *\n * `interpolate` is the space corner colors blend through, matching the three\n * gradients.\n */\nexport interface MeshGradientPaint {\n kind: 'mesh-gradient';\n patches: MeshPatch[];\n units?: PaintUnits;\n interpolate?: ColorSpace;\n opacity?: number;\n}\n\n/** The kind's id, as `Paint['fill']` carries it. */\nexport const MESH_GRADIENT_KIND = 'mesh-gradient';\n\n/** A mesh paint, narrowed. */\nexport function isMeshGradientPaint(fill: Paint | null | undefined): fill is Paint & MeshGradientPaint {\n // `Paint`'s discriminant stays closed over the built-in kinds — see\n // `asPaint` — so a registered kind reads it widened.\n return fill != null && (fill.kind as string | undefined) === MESH_GRADIENT_KIND;\n}\n\nfunction asMesh(fill: Paint): MeshGradientPaint {\n return fill as unknown as MeshGradientPaint;\n}\n\n// `asPaint`'s cast, kept local: this module must import nothing from the\n// registry, whose state the lazy kind's self-contained copy would duplicate.\nfunction asFill(mesh: MeshGradientPaint): Paint {\n return mesh as unknown as Paint;\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): MeshGradientPaint {\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 kind: 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[]): MeshGradientPaint {\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 { kind: 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: MeshGradientPaint): 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: MeshGradientPaint, move: (p: MeshPoint) => MeshPoint): MeshPatch[] {\n return mesh.patches.map((patch) => ({ ...patch, points: patch.points.map(move) }));\n}\n\n// ─── The bake cache ─────────────────────────────────────────────────────────\n//\n// A kind owns its own GPU state; the registry hands it a `gl` and a resource\n// lifetime. One cache per lifetime, so two renderers — or one renderer past a\n// context restore — never trade textures, and the lifetime's end frees them.\n\ninterface CachedBake {\n texture: WebGLTexture;\n /** Where the mesh being bound sits in paint space. The texels are shared by\n * every pose-frame copy of one paint; the box is each copy's own. */\n box: MeshBox;\n}\n\n/** The paint a pose-frame copy was made from. A copy is rebuilt whenever its\n * node's pose changes, and bakes the same texels as its source. */\nconst BAKE_SOURCE = new WeakMap<object, object>();\n\nconst CACHES = new WeakMap<PaintResources, MeshBakeCache<WebGLTexture>>();\n\nfunction cacheFor(ctx: PaintBindContext): MeshBakeCache<WebGLTexture> {\n let cache = CACHES.get(ctx.resources);\n if (!cache) {\n const gl = ctx.gl;\n const made = new MeshBakeCache<WebGLTexture>((texture) => gl.deleteTexture(texture));\n ctx.resources.onRelease(() => {\n made.clear();\n CACHES.delete(ctx.resources);\n });\n CACHES.set(ctx.resources, made);\n cache = made;\n }\n return cache;\n}\n\n/** Device pixels the larger side of `box` covers when drawn in `units`. */\nfunction devicePixelsOf(ctx: PaintBindContext, mesh: MeshGradientPaint, 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: MeshGradientPaint): CachedBake | null {\n const box = meshBounds(mesh.patches);\n if (!box) return null;\n const size = meshBakeSize(devicePixelsOf(ctx, mesh, box), ctx.maxTextureSize);\n\n const cache = cacheFor(ctx);\n const key = BAKE_SOURCE.get(mesh) ?? mesh;\n const hit = cache.get(key, size);\n if (hit) return { texture: hit, box };\n\n const baked = bakeMesh(mesh.patches, mesh.interpolate ?? 'rgb', size);\n if (!baked) return null;\n\n const gl = ctx.gl;\n const texture = gl.createTexture();\n if (!texture) return null;\n gl.bindTexture(gl.TEXTURE_2D, texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(\n gl.TEXTURE_2D, 0, gl.RGBA,\n baked.size, baked.size, 0,\n gl.RGBA, gl.UNSIGNED_BYTE, baked.pixels,\n );\n gl.bindTexture(gl.TEXTURE_2D, null);\n\n cache.set(key, size, texture);\n return { texture, box };\n}\n\nfunction bindMesh(ctx: PaintBindContext, fill: Paint): PaintProgram | null {\n const mesh = asMesh(fill);\n if (!mesh.patches.some(isValidPatch)) return null;\n\n const inverse = ctx.spaceInverse(mesh.units);\n if (!inverse) return null;\n\n const program = ctx.program(MESH_PROGRAM_ID);\n if (!program) return null;\n\n const entry = bakeFor(ctx, mesh);\n if (!entry) return null;\n\n const gl = ctx.gl;\n gl.useProgram(program.handle);\n ctx.setProjAndModel(program);\n gl.uniformMatrix3fv(program.uniform('u_worldInv')!, false, mat3.toUniform(inverse));\n\n gl.activeTexture(gl.TEXTURE0);\n gl.bindTexture(gl.TEXTURE_2D, entry.texture);\n gl.uniform1i(program.uniform('u_sampler')!, 0);\n\n const { box } = entry;\n gl.uniform2f(program.uniform('u_meshOrigin')!, box.x, box.y);\n gl.uniform2f(program.uniform('u_meshSize')!, box.width, box.height);\n gl.uniform1f(program.uniform('u_opacity')!, mesh.opacity ?? 1);\n gl.uniform1f(program.uniform('u_alpha')!, ctx.alpha);\n return program;\n}\n\n/** The kind's draw half, shader program included. Core adds the editor's\n * slots and registers the whole entry. */\nexport const meshDrawKind: PaintDrawKind = {\n id: MESH_GRADIENT_KIND,\n programs: { [MESH_PROGRAM_ID]: { vert: MESH_VERT_SRC, frag: MESH_FRAG_SRC } },\n bind: bindMesh,\n inPoseFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units !== 'bounds') return fill;\n const posed = asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: box.x + p.x * box.width,\n y: box.y + p.y * box.height,\n })),\n units: 'local' as const,\n });\n BAKE_SOURCE.set(posed, fill);\n return posed;\n },\n toBoundsFrame: (fill, box: FillPoseBox) => {\n const mesh = asMesh(fill);\n if (mesh.units === 'bounds' || box.width === 0 || box.height === 0) return fill;\n return asFill({\n ...mesh,\n patches: mapPatches(mesh, (p) => ({\n x: (p.x - box.x) / box.width,\n y: (p.y - box.y) / box.height,\n })),\n units: 'bounds' as const,\n });\n },\n};\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: MeshGradientPaint): 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","import type { IconRef } from '@weasel-js/icons';\nimport type { Paint } from '@weasel-js/paint';\nimport {\n meshDrawKind, meshFromStops, meshGradientXml, meshStops, seedMeshPatch, type MeshGradientPaint,\n} from '@weasel-js/renderer/mesh';\nimport type { PaintKindEntry } from './paintKindEntry';\n\n// `asPaint`'s cast both ways, kept local: this module must import nothing\n// stateful, or `meshKindLazy`'s self-contained copy would duplicate it.\nconst asMesh = (fill: Paint): MeshGradientPaint => fill as unknown as MeshGradientPaint;\nconst asFill = (mesh: MeshGradientPaint): Paint => mesh as unknown as Paint;\n\n/** The `mesh-gradient` kind's registry entry. `./registerMesh` registers it;\n * the paint-kind registry loads it on demand otherwise. */\nexport const meshGradientKind: PaintKindEntry = {\n ...meshDrawKind,\n label: 'Mesh',\n // Written as library mode emits `icon('paintMesh')`: the call would pull the icons package into meshKindLazy.\n icon: /* @icon */ 'core:paintMesh' as IconRef,\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 toSvg: (id, fill) => meshGradientXml(id, asMesh(fill)),\n};\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"paintKindEntry.js","names":[],"sources":["../../../src/core/paint/paintKindEntry.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport type { IconRef } from '@weasel-js/icons';\nimport type { Paint, GradStop, TileKind } from '@weasel-js/paint';\nimport type { PaintDrawKind } from '@weasel-js/renderer';\n\n/**\n * `Paint`'s discriminant, open on the string the way `ChromeId` is: the\n * kinds the kit ships, plus whatever a consumer registers.\n */\nexport type PaintKind =\n | 'solid' | 'linear-gradient' | 'radial-gradient' | 'conic-gradient'\n | TileKind | 'texture'\n | (string & {});\n\n/**\n * A set of kinds an editor offers as one choice. Kinds sharing a family show\n * as a single segment in a kind bar, named by the family, and the member is\n * picked inside that segment's body. The built-in tiles and `texture` are the\n * `patternFamily`.\n */\nexport interface PaintKindFamily {\n id: string;\n label: string;\n /** Glyph for the family's segment. */\n icon?: IconRef;\n}\n\n/** What a registered kind's editor renders. `PaintInput` in `@weasel-js/ui`\n * is the control that mounts it. */\nexport interface PaintKindEditorProps {\n value: Paint;\n onInput?(next: Paint): void;\n onChange(next: Paint): void;\n}\n\n/**\n * One paint kind: the renderer's draw slots, plus what an editor and a\n * serializer read.\n *\n * `seed`, `label` and `colorOf` are the editor's slots and every kind has\n * them. The rest are optional because a kind may not need them.\n */\nexport interface PaintKindEntry extends PaintDrawKind {\n label: string;\n /** Glyph naming this kind in an editor's kind bar. A kind without one is\n * named by its `label`. */\n icon?: IconRef;\n /** The family this kind is offered under; see {@link PaintKindFamily}. A\n * kind without one is its own segment. */\n family?: PaintKindFamily;\n /** A paint of this kind seeded from a color — what an editor writes when a\n * consumer switches a solid to this kind. */\n seed(fromColor: string): Paint;\n /** The single color this paint shows, or `undefined` when it has none. */\n colorOf(paint: Paint): string | undefined;\n /** Editor slot. */\n Editor?: ComponentType<PaintKindEditorProps>;\n /**\n * The stop list this paint reads as. With `fromStops`, it is what makes a\n * kind a gradient: `listGradientKinds` returns the kinds carrying both, and\n * `switchGradientKind` converts between any two of them through the list.\n */\n stopsOf?(paint: Paint): GradStop[];\n /** A paint of this kind built from a stop list, in `bounds` units. The\n * converse of `stopsOf`; supply both or neither. */\n fromStops?(stops: GradStop[]): Paint;\n /**\n * The `<defs>` entry backing a `url(#id)` reference.\n *\n * SVG has paint servers for two gradients and a pattern and nothing else, so\n * a kind beyond those has no element to target: write a foreign-namespaced\n * one under the `wzl:` prefix `@weasel-js/svg` declares on the root whenever\n * a document holds such a paint. That package emits the fallback color\n * beside the reference on its own, from `colorOf`.\n */\n toSvg?(id: string, fill: Paint): string;\n}\n\n/**\n * A consumer's own paint, typed as a `Paint`.\n *\n * `Paint` stays a closed union: opening its discriminant would widen every\n * built-in member and break the narrowing the kit's own branches depend on.\n * A registered kind declares its own interface instead and passes it through\n * here — the kit reads only `kind` and hands the whole object back to that\n * kind's slots.\n */\nexport function asPaint<T extends { kind: string }>(paint: T): Paint {\n return paint as unknown as Paint;\n}\n"],"mappings":";;;;;;;;;;AAuFA,SAAgB,QAAoC,OAAiB;CACnE,OAAO;AACT"}
1
+ {"version":3,"file":"paintKindEntry.js","names":[],"sources":["../../../src/core/paint/paintKindEntry.ts"],"sourcesContent":["import type { ComponentType } from 'react';\nimport type { IconRef } from '@weasel-js/icons';\nimport type { Paint, GradStop, TileKind } from '@weasel-js/paint';\nimport type { PaintDrawKind } from '@weasel-js/renderer';\n\n/**\n * `Paint`'s discriminant, open on the string the way `ChromeId` is: the\n * kinds the kit ships, plus whatever a consumer registers.\n */\nexport type PaintKind =\n | 'solid' | 'linear-gradient' | 'radial-gradient' | 'conic-gradient'\n | TileKind | 'image' | 'texture'\n | (string & {});\n\n/**\n * A set of kinds an editor offers as one choice. Kinds sharing a family show\n * as a single segment in a kind bar, named by the family, and the member is\n * picked inside that segment's body. The built-in tiles, `image` and `texture` are the\n * `patternFamily`.\n */\nexport interface PaintKindFamily {\n id: string;\n label: string;\n /** Glyph for the family's segment. */\n icon?: IconRef;\n}\n\n/** What a registered kind's editor renders. `PaintInput` in `@weasel-js/ui`\n * is the control that mounts it. */\nexport interface PaintKindEditorProps {\n value: Paint;\n onInput?(next: Paint): void;\n onChange(next: Paint): void;\n}\n\n/**\n * One paint kind: the renderer's draw slots, plus what an editor and a\n * serializer read.\n *\n * `seed`, `label` and `colorOf` are the editor's slots and every kind has\n * them. The rest are optional because a kind may not need them.\n */\nexport interface PaintKindEntry extends PaintDrawKind {\n label: string;\n /** Glyph naming this kind in an editor's kind bar. A kind without one is\n * named by its `label`. */\n icon?: IconRef;\n /** The family this kind is offered under; see {@link PaintKindFamily}. A\n * kind without one is its own segment. */\n family?: PaintKindFamily;\n /** A paint of this kind seeded from a color — what an editor writes when a\n * consumer switches a solid to this kind. */\n seed(fromColor: string): Paint;\n /** The single color this paint shows, or `undefined` when it has none. */\n colorOf(paint: Paint): string | undefined;\n /** Editor slot. */\n Editor?: ComponentType<PaintKindEditorProps>;\n /**\n * The stop list this paint reads as. With `fromStops`, it is what makes a\n * kind a gradient: `listGradientKinds` returns the kinds carrying both, and\n * `switchGradientKind` converts between any two of them through the list.\n */\n stopsOf?(paint: Paint): GradStop[];\n /** A paint of this kind built from a stop list, in `bounds` units. The\n * converse of `stopsOf`; supply both or neither. */\n fromStops?(stops: GradStop[]): Paint;\n /**\n * The `<defs>` entry backing a `url(#id)` reference.\n *\n * SVG has paint servers for two gradients and a pattern and nothing else, so\n * a kind beyond those has no element to target: write a foreign-namespaced\n * one under the `wzl:` prefix `@weasel-js/svg` declares on the root whenever\n * a document holds such a paint. That package emits the fallback color\n * beside the reference on its own, from `colorOf`.\n */\n toSvg?(id: string, fill: Paint): string;\n}\n\n/**\n * A consumer's own paint, typed as a `Paint`.\n *\n * `Paint` stays a closed union: opening its discriminant would widen every\n * built-in member and break the narrowing the kit's own branches depend on.\n * A registered kind declares its own interface instead and passes it through\n * here — the kit reads only `kind` and hands the whole object back to that\n * kind's slots.\n */\nexport function asPaint<T extends { kind: string }>(paint: T): Paint {\n return paint as unknown as Paint;\n}\n"],"mappings":";;;;;;;;;;AAuFA,SAAgB,QAAoC,OAAiB;CACnE,OAAO;AACT"}
@@ -4,7 +4,7 @@ import { gradientForBounds, isGradientPaint, isTilePaint, withGradientKind } fro
4
4
  import { _resetPaintDrawKindsForTests } from "@weasel-js/renderer/test-seams";
5
5
 
6
6
  //#region src/core/paint/paintKinds.ts
7
- /** The family the built-in tiles and `texture` are offered under. A consumer's
7
+ /** The family the built-in tiles, `image` and `texture` are offered under. A consumer's
8
8
  * own pattern kind joins it by naming this as its `family`. */
9
9
  var patternFamily = {
10
10
  id: "pattern",
@@ -26,6 +26,13 @@ var BUILTINS = [
26
26
  tileKind("crosshatch", "Crosshatch"),
27
27
  tileKind("dots", "Dots"),
28
28
  tileKind("chunks", "Chunks"),
29
+ {
30
+ id: "image",
31
+ label: "Image",
32
+ family: patternFamily,
33
+ seed: (color) => seedTile("hatch", color),
34
+ colorOf: () => void 0
35
+ },
29
36
  {
30
37
  id: "texture",
31
38
  label: "Texture",