@efxlab/motion-canvas-2d 4.0.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 (455) hide show
  1. package/editor/index.css +40 -0
  2. package/editor/index.js +525 -0
  3. package/editor/index.js.map +1 -0
  4. package/lib/code/CodeCursor.d.ts +84 -0
  5. package/lib/code/CodeCursor.d.ts.map +1 -0
  6. package/lib/code/CodeCursor.js +315 -0
  7. package/lib/code/CodeDiffer.d.ts +28 -0
  8. package/lib/code/CodeDiffer.d.ts.map +1 -0
  9. package/lib/code/CodeDiffer.js +51 -0
  10. package/lib/code/CodeFragment.d.ts +42 -0
  11. package/lib/code/CodeFragment.d.ts.map +1 -0
  12. package/lib/code/CodeFragment.js +72 -0
  13. package/lib/code/CodeHighlighter.d.ts +69 -0
  14. package/lib/code/CodeHighlighter.d.ts.map +1 -0
  15. package/lib/code/CodeHighlighter.js +2 -0
  16. package/lib/code/CodeMetrics.d.ts +11 -0
  17. package/lib/code/CodeMetrics.d.ts.map +1 -0
  18. package/lib/code/CodeMetrics.js +29 -0
  19. package/lib/code/CodeRange.d.ts +43 -0
  20. package/lib/code/CodeRange.d.ts.map +1 -0
  21. package/lib/code/CodeRange.js +185 -0
  22. package/lib/code/CodeScope.d.ts +16 -0
  23. package/lib/code/CodeScope.d.ts.map +1 -0
  24. package/lib/code/CodeScope.js +72 -0
  25. package/lib/code/CodeSelection.d.ts +6 -0
  26. package/lib/code/CodeSelection.d.ts.map +1 -0
  27. package/lib/code/CodeSelection.js +13 -0
  28. package/lib/code/CodeSignal.d.ts +63 -0
  29. package/lib/code/CodeSignal.d.ts.map +1 -0
  30. package/lib/code/CodeSignal.js +206 -0
  31. package/lib/code/CodeTokenizer.d.ts +8 -0
  32. package/lib/code/CodeTokenizer.d.ts.map +1 -0
  33. package/lib/code/CodeTokenizer.js +50 -0
  34. package/lib/code/DefaultHighlightStyle.d.ts +3 -0
  35. package/lib/code/DefaultHighlightStyle.d.ts.map +1 -0
  36. package/lib/code/DefaultHighlightStyle.js +98 -0
  37. package/lib/code/LezerHighlighter.d.ts +22 -0
  38. package/lib/code/LezerHighlighter.d.ts.map +1 -0
  39. package/lib/code/LezerHighlighter.js +91 -0
  40. package/lib/code/diff.d.ts +31 -0
  41. package/lib/code/diff.d.ts.map +1 -0
  42. package/lib/code/diff.js +236 -0
  43. package/lib/code/extractRange.d.ts +17 -0
  44. package/lib/code/extractRange.d.ts.map +1 -0
  45. package/lib/code/extractRange.js +102 -0
  46. package/lib/code/index.d.ts +14 -0
  47. package/lib/code/index.d.ts.map +1 -0
  48. package/lib/code/index.js +14 -0
  49. package/lib/components/Bezier.d.ts +22 -0
  50. package/lib/components/Bezier.d.ts.map +1 -0
  51. package/lib/components/Bezier.js +80 -0
  52. package/lib/components/Camera.d.ts +172 -0
  53. package/lib/components/Camera.d.ts.map +1 -0
  54. package/lib/components/Camera.js +239 -0
  55. package/lib/components/Circle.d.ts +191 -0
  56. package/lib/components/Circle.d.ts.map +1 -0
  57. package/lib/components/Circle.js +178 -0
  58. package/lib/components/Code.d.ts +238 -0
  59. package/lib/components/Code.d.ts.map +1 -0
  60. package/lib/components/Code.js +331 -0
  61. package/lib/components/CodeBlock.d.ts +131 -0
  62. package/lib/components/CodeBlock.d.ts.map +1 -0
  63. package/lib/components/CodeBlock.js +462 -0
  64. package/lib/components/CubicBezier.d.ts +69 -0
  65. package/lib/components/CubicBezier.d.ts.map +1 -0
  66. package/lib/components/CubicBezier.js +81 -0
  67. package/lib/components/Curve.d.ts +202 -0
  68. package/lib/components/Curve.d.ts.map +1 -0
  69. package/lib/components/Curve.js +284 -0
  70. package/lib/components/Grid.d.ts +75 -0
  71. package/lib/components/Grid.d.ts.map +1 -0
  72. package/lib/components/Grid.js +91 -0
  73. package/lib/components/Icon.d.ts +58 -0
  74. package/lib/components/Icon.d.ts.map +1 -0
  75. package/lib/components/Icon.js +58 -0
  76. package/lib/components/Img.d.ts +116 -0
  77. package/lib/components/Img.d.ts.map +1 -0
  78. package/lib/components/Img.js +233 -0
  79. package/lib/components/Knot.d.ts +89 -0
  80. package/lib/components/Knot.d.ts.map +1 -0
  81. package/lib/components/Knot.js +68 -0
  82. package/lib/components/Latex.d.ts +49 -0
  83. package/lib/components/Latex.d.ts.map +1 -0
  84. package/lib/components/Latex.js +206 -0
  85. package/lib/components/Layout.d.ts +423 -0
  86. package/lib/components/Layout.d.ts.map +1 -0
  87. package/lib/components/Layout.js +699 -0
  88. package/lib/components/Line.d.ts +158 -0
  89. package/lib/components/Line.d.ts.map +1 -0
  90. package/lib/components/Line.js +315 -0
  91. package/lib/components/Node.d.ts +843 -0
  92. package/lib/components/Node.d.ts.map +1 -0
  93. package/lib/components/Node.js +1335 -0
  94. package/lib/components/Path.d.ts +18 -0
  95. package/lib/components/Path.d.ts.map +1 -0
  96. package/lib/components/Path.js +96 -0
  97. package/lib/components/Polygon.d.ts +157 -0
  98. package/lib/components/Polygon.d.ts.map +1 -0
  99. package/lib/components/Polygon.js +183 -0
  100. package/lib/components/QuadBezier.d.ts +61 -0
  101. package/lib/components/QuadBezier.d.ts.map +1 -0
  102. package/lib/components/QuadBezier.js +76 -0
  103. package/lib/components/Ray.d.ts +60 -0
  104. package/lib/components/Ray.d.ts.map +1 -0
  105. package/lib/components/Ray.js +95 -0
  106. package/lib/components/Rect.d.ts +112 -0
  107. package/lib/components/Rect.d.ts.map +1 -0
  108. package/lib/components/Rect.js +76 -0
  109. package/lib/components/SVG.d.ts +175 -0
  110. package/lib/components/SVG.d.ts.map +1 -0
  111. package/lib/components/SVG.js +582 -0
  112. package/lib/components/Shape.d.ts +39 -0
  113. package/lib/components/Shape.d.ts.map +1 -0
  114. package/lib/components/Shape.js +134 -0
  115. package/lib/components/Spline.d.ts +87 -0
  116. package/lib/components/Spline.d.ts.map +1 -0
  117. package/lib/components/Spline.js +230 -0
  118. package/lib/components/Txt.d.ts +51 -0
  119. package/lib/components/Txt.d.ts.map +1 -0
  120. package/lib/components/Txt.js +172 -0
  121. package/lib/components/TxtLeaf.d.ts +20 -0
  122. package/lib/components/TxtLeaf.d.ts.map +1 -0
  123. package/lib/components/TxtLeaf.js +185 -0
  124. package/lib/components/Video.d.ts +110 -0
  125. package/lib/components/Video.d.ts.map +1 -0
  126. package/lib/components/Video.js +267 -0
  127. package/lib/components/View2D.d.ts +25 -0
  128. package/lib/components/View2D.d.ts.map +1 -0
  129. package/lib/components/View2D.js +85 -0
  130. package/lib/components/index.d.ts +27 -0
  131. package/lib/components/index.d.ts.map +1 -0
  132. package/lib/components/index.js +27 -0
  133. package/lib/components/types.d.ts +17 -0
  134. package/lib/components/types.d.ts.map +1 -0
  135. package/lib/components/types.js +2 -0
  136. package/lib/curves/ArcSegment.d.ts +26 -0
  137. package/lib/curves/ArcSegment.d.ts.map +1 -0
  138. package/lib/curves/ArcSegment.js +116 -0
  139. package/lib/curves/CircleSegment.d.ts +18 -0
  140. package/lib/curves/CircleSegment.d.ts.map +1 -0
  141. package/lib/curves/CircleSegment.js +60 -0
  142. package/lib/curves/CubicBezierSegment.d.ts +18 -0
  143. package/lib/curves/CubicBezierSegment.d.ts.map +1 -0
  144. package/lib/curves/CubicBezierSegment.js +60 -0
  145. package/lib/curves/CurveDrawingInfo.d.ts +11 -0
  146. package/lib/curves/CurveDrawingInfo.d.ts.map +1 -0
  147. package/lib/curves/CurveDrawingInfo.js +2 -0
  148. package/lib/curves/CurvePoint.d.ts +15 -0
  149. package/lib/curves/CurvePoint.d.ts.map +1 -0
  150. package/lib/curves/CurvePoint.js +2 -0
  151. package/lib/curves/CurveProfile.d.ts +7 -0
  152. package/lib/curves/CurveProfile.d.ts.map +1 -0
  153. package/lib/curves/CurveProfile.js +2 -0
  154. package/lib/curves/KnotInfo.d.ts +12 -0
  155. package/lib/curves/KnotInfo.d.ts.map +1 -0
  156. package/lib/curves/KnotInfo.js +2 -0
  157. package/lib/curves/LineSegment.d.ts +16 -0
  158. package/lib/curves/LineSegment.d.ts.map +1 -0
  159. package/lib/curves/LineSegment.js +51 -0
  160. package/lib/curves/Polynomial.d.ts +118 -0
  161. package/lib/curves/Polynomial.d.ts.map +1 -0
  162. package/lib/curves/Polynomial.js +263 -0
  163. package/lib/curves/Polynomial2D.d.ts +22 -0
  164. package/lib/curves/Polynomial2D.d.ts.map +1 -0
  165. package/lib/curves/Polynomial2D.js +51 -0
  166. package/lib/curves/PolynomialSegment.d.ts +39 -0
  167. package/lib/curves/PolynomialSegment.d.ts.map +1 -0
  168. package/lib/curves/PolynomialSegment.js +88 -0
  169. package/lib/curves/QuadBezierSegment.d.ts +17 -0
  170. package/lib/curves/QuadBezierSegment.d.ts.map +1 -0
  171. package/lib/curves/QuadBezierSegment.js +53 -0
  172. package/lib/curves/Segment.d.ts +9 -0
  173. package/lib/curves/Segment.d.ts.map +1 -0
  174. package/lib/curves/Segment.js +3 -0
  175. package/lib/curves/UniformPolynomialCurveSampler.d.ts +43 -0
  176. package/lib/curves/UniformPolynomialCurveSampler.d.ts.map +1 -0
  177. package/lib/curves/UniformPolynomialCurveSampler.js +74 -0
  178. package/lib/curves/createCurveProfileLerp.d.ts +32 -0
  179. package/lib/curves/createCurveProfileLerp.d.ts.map +1 -0
  180. package/lib/curves/createCurveProfileLerp.js +351 -0
  181. package/lib/curves/getBezierSplineProfile.d.ts +12 -0
  182. package/lib/curves/getBezierSplineProfile.d.ts.map +1 -0
  183. package/lib/curves/getBezierSplineProfile.js +140 -0
  184. package/lib/curves/getCircleProfile.d.ts +4 -0
  185. package/lib/curves/getCircleProfile.d.ts.map +1 -0
  186. package/lib/curves/getCircleProfile.js +44 -0
  187. package/lib/curves/getPathProfile.d.ts +3 -0
  188. package/lib/curves/getPathProfile.d.ts.map +1 -0
  189. package/lib/curves/getPathProfile.js +128 -0
  190. package/lib/curves/getPointAtDistance.d.ts +4 -0
  191. package/lib/curves/getPointAtDistance.d.ts.map +1 -0
  192. package/lib/curves/getPointAtDistance.js +15 -0
  193. package/lib/curves/getPolylineProfile.d.ts +4 -0
  194. package/lib/curves/getPolylineProfile.d.ts.map +1 -0
  195. package/lib/curves/getPolylineProfile.js +58 -0
  196. package/lib/curves/getRectProfile.d.ts +4 -0
  197. package/lib/curves/getRectProfile.d.ts.map +1 -0
  198. package/lib/curves/getRectProfile.js +57 -0
  199. package/lib/curves/index.d.ts +17 -0
  200. package/lib/curves/index.d.ts.map +1 -0
  201. package/lib/curves/index.js +17 -0
  202. package/lib/decorators/canvasStyleSignal.d.ts +5 -0
  203. package/lib/decorators/canvasStyleSignal.d.ts.map +1 -0
  204. package/lib/decorators/canvasStyleSignal.js +12 -0
  205. package/lib/decorators/colorSignal.d.ts +2 -0
  206. package/lib/decorators/colorSignal.d.ts.map +1 -0
  207. package/lib/decorators/colorSignal.js +9 -0
  208. package/lib/decorators/compound.d.ts +27 -0
  209. package/lib/decorators/compound.d.ts.map +1 -0
  210. package/lib/decorators/compound.js +49 -0
  211. package/lib/decorators/computed.d.ts +9 -0
  212. package/lib/decorators/computed.d.ts.map +1 -0
  213. package/lib/decorators/computed.js +18 -0
  214. package/lib/decorators/defaultStyle.d.ts +2 -0
  215. package/lib/decorators/defaultStyle.d.ts.map +1 -0
  216. package/lib/decorators/defaultStyle.js +13 -0
  217. package/lib/decorators/filtersSignal.d.ts +11 -0
  218. package/lib/decorators/filtersSignal.d.ts.map +1 -0
  219. package/lib/decorators/filtersSignal.js +73 -0
  220. package/lib/decorators/index.d.ts +11 -0
  221. package/lib/decorators/index.d.ts.map +1 -0
  222. package/lib/decorators/index.js +11 -0
  223. package/lib/decorators/initializers.d.ts +4 -0
  224. package/lib/decorators/initializers.d.ts.map +1 -0
  225. package/lib/decorators/initializers.js +27 -0
  226. package/lib/decorators/nodeName.d.ts +9 -0
  227. package/lib/decorators/nodeName.d.ts.map +1 -0
  228. package/lib/decorators/nodeName.js +13 -0
  229. package/lib/decorators/signal.d.ts +183 -0
  230. package/lib/decorators/signal.d.ts.map +1 -0
  231. package/lib/decorators/signal.js +285 -0
  232. package/lib/decorators/spacingSignal.d.ts +2 -0
  233. package/lib/decorators/spacingSignal.d.ts.map +1 -0
  234. package/lib/decorators/spacingSignal.js +15 -0
  235. package/lib/decorators/vector2Signal.d.ts +8 -0
  236. package/lib/decorators/vector2Signal.d.ts.map +1 -0
  237. package/lib/decorators/vector2Signal.js +15 -0
  238. package/lib/index.d.ts +9 -0
  239. package/lib/index.d.ts.map +1 -0
  240. package/lib/index.js +9 -0
  241. package/lib/jsx-dev-runtime.d.ts +3 -0
  242. package/lib/jsx-dev-runtime.d.ts.map +1 -0
  243. package/lib/jsx-dev-runtime.js +3 -0
  244. package/lib/jsx-runtime.d.ts +12 -0
  245. package/lib/jsx-runtime.d.ts.map +1 -0
  246. package/lib/jsx-runtime.js +23 -0
  247. package/lib/partials/Filter.d.ts +82 -0
  248. package/lib/partials/Filter.d.ts.map +1 -0
  249. package/lib/partials/Filter.js +137 -0
  250. package/lib/partials/Gradient.d.ts +31 -0
  251. package/lib/partials/Gradient.d.ts.map +1 -0
  252. package/lib/partials/Gradient.js +63 -0
  253. package/lib/partials/Pattern.d.ts +13 -0
  254. package/lib/partials/Pattern.d.ts.map +1 -0
  255. package/lib/partials/Pattern.js +27 -0
  256. package/lib/partials/ShaderConfig.d.ts +81 -0
  257. package/lib/partials/ShaderConfig.d.ts.map +1 -0
  258. package/lib/partials/ShaderConfig.js +25 -0
  259. package/lib/partials/index.d.ts +5 -0
  260. package/lib/partials/index.d.ts.map +1 -0
  261. package/lib/partials/index.js +5 -0
  262. package/lib/partials/types.d.ts +35 -0
  263. package/lib/partials/types.d.ts.map +1 -0
  264. package/lib/partials/types.js +2 -0
  265. package/lib/scenes/Scene2D.d.ts +23 -0
  266. package/lib/scenes/Scene2D.d.ts.map +1 -0
  267. package/lib/scenes/Scene2D.js +152 -0
  268. package/lib/scenes/index.d.ts +4 -0
  269. package/lib/scenes/index.d.ts.map +1 -0
  270. package/lib/scenes/index.js +4 -0
  271. package/lib/scenes/makeScene2D.d.ts +5 -0
  272. package/lib/scenes/makeScene2D.d.ts.map +1 -0
  273. package/lib/scenes/makeScene2D.js +12 -0
  274. package/lib/scenes/useScene2D.d.ts +3 -0
  275. package/lib/scenes/useScene2D.d.ts.map +1 -0
  276. package/lib/scenes/useScene2D.js +5 -0
  277. package/lib/tsconfig.build.tsbuildinfo +1 -0
  278. package/lib/tsconfig.tsbuildinfo +1 -0
  279. package/lib/utils/CanvasUtils.d.ts +21 -0
  280. package/lib/utils/CanvasUtils.d.ts.map +1 -0
  281. package/lib/utils/CanvasUtils.js +138 -0
  282. package/lib/utils/diff.d.ts +31 -0
  283. package/lib/utils/diff.d.ts.map +1 -0
  284. package/lib/utils/diff.js +97 -0
  285. package/lib/utils/index.d.ts +4 -0
  286. package/lib/utils/index.d.ts.map +1 -0
  287. package/lib/utils/index.js +4 -0
  288. package/lib/utils/is.d.ts +8 -0
  289. package/lib/utils/is.d.ts.map +1 -0
  290. package/lib/utils/is.js +10 -0
  291. package/lib/utils/makeSignalExtensions.d.ts +4 -0
  292. package/lib/utils/makeSignalExtensions.d.ts.map +1 -0
  293. package/lib/utils/makeSignalExtensions.js +20 -0
  294. package/lib/utils/withDefaults.d.ts +20 -0
  295. package/lib/utils/withDefaults.d.ts.map +1 -0
  296. package/lib/utils/withDefaults.js +23 -0
  297. package/package.json +54 -0
  298. package/src/editor/NodeInspectorConfig.tsx +76 -0
  299. package/src/editor/PreviewOverlayConfig.tsx +65 -0
  300. package/src/editor/Provider.tsx +109 -0
  301. package/src/editor/SceneGraphTabConfig.tsx +87 -0
  302. package/src/editor/icons/CircleIcon.tsx +7 -0
  303. package/src/editor/icons/CodeBlockIcon.tsx +8 -0
  304. package/src/editor/icons/CurveIcon.tsx +7 -0
  305. package/src/editor/icons/GridIcon.tsx +7 -0
  306. package/src/editor/icons/IconMap.ts +35 -0
  307. package/src/editor/icons/ImgIcon.tsx +8 -0
  308. package/src/editor/icons/LayoutIcon.tsx +9 -0
  309. package/src/editor/icons/LineIcon.tsx +7 -0
  310. package/src/editor/icons/NodeIcon.tsx +7 -0
  311. package/src/editor/icons/RayIcon.tsx +7 -0
  312. package/src/editor/icons/RectIcon.tsx +7 -0
  313. package/src/editor/icons/ShapeIcon.tsx +7 -0
  314. package/src/editor/icons/TxtIcon.tsx +8 -0
  315. package/src/editor/icons/VideoIcon.tsx +7 -0
  316. package/src/editor/icons/View2DIcon.tsx +10 -0
  317. package/src/editor/index.css +0 -0
  318. package/src/editor/index.ts +19 -0
  319. package/src/editor/shortcuts.ts +27 -0
  320. package/src/editor/tree/DetachedRoot.tsx +27 -0
  321. package/src/editor/tree/NodeElement.tsx +72 -0
  322. package/src/editor/tree/TreeElement.tsx +70 -0
  323. package/src/editor/tree/TreeRoot.tsx +10 -0
  324. package/src/editor/tree/ViewRoot.tsx +20 -0
  325. package/src/editor/tree/index.module.scss +45 -0
  326. package/src/editor/tree/index.ts +4 -0
  327. package/src/editor/tree/navigation.ts +145 -0
  328. package/src/editor/tsconfig.build.json +5 -0
  329. package/src/editor/tsconfig.json +12 -0
  330. package/src/editor/tsdoc.json +4 -0
  331. package/src/editor/utils/SignalSet.ts +37 -0
  332. package/src/editor/utils/index.ts +1 -0
  333. package/src/editor/vite-env.d.ts +1 -0
  334. package/src/lib/code/CodeCursor.ts +468 -0
  335. package/src/lib/code/CodeDiffer.ts +77 -0
  336. package/src/lib/code/CodeFragment.ts +96 -0
  337. package/src/lib/code/CodeHighlighter.ts +73 -0
  338. package/src/lib/code/CodeMetrics.ts +47 -0
  339. package/src/lib/code/CodeRange.test.ts +113 -0
  340. package/src/lib/code/CodeRange.ts +222 -0
  341. package/src/lib/code/CodeScope.ts +100 -0
  342. package/src/lib/code/CodeSelection.ts +28 -0
  343. package/src/lib/code/CodeSignal.ts +348 -0
  344. package/src/lib/code/CodeTokenizer.ts +54 -0
  345. package/src/lib/code/DefaultHighlightStyle.ts +98 -0
  346. package/src/lib/code/LezerHighlighter.ts +113 -0
  347. package/src/lib/code/diff.test.ts +311 -0
  348. package/src/lib/code/diff.ts +319 -0
  349. package/src/lib/code/extractRange.ts +125 -0
  350. package/src/lib/code/index.ts +13 -0
  351. package/src/lib/components/Bezier.ts +103 -0
  352. package/src/lib/components/Camera.ts +359 -0
  353. package/src/lib/components/Circle.ts +269 -0
  354. package/src/lib/components/Code.ts +532 -0
  355. package/src/lib/components/CodeBlock.ts +581 -0
  356. package/src/lib/components/CubicBezier.ts +115 -0
  357. package/src/lib/components/Curve.ts +455 -0
  358. package/src/lib/components/Grid.ts +134 -0
  359. package/src/lib/components/Icon.ts +95 -0
  360. package/src/lib/components/Img.ts +305 -0
  361. package/src/lib/components/Knot.ts +156 -0
  362. package/src/lib/components/Latex.ts +249 -0
  363. package/src/lib/components/Layout.ts +1071 -0
  364. package/src/lib/components/Line.ts +394 -0
  365. package/src/lib/components/Node.ts +1949 -0
  366. package/src/lib/components/Path.ts +132 -0
  367. package/src/lib/components/Polygon.ts +238 -0
  368. package/src/lib/components/QuadBezier.ts +103 -0
  369. package/src/lib/components/Ray.ts +126 -0
  370. package/src/lib/components/Rect.ts +186 -0
  371. package/src/lib/components/SVG.ts +788 -0
  372. package/src/lib/components/Shape.ts +146 -0
  373. package/src/lib/components/Spline.ts +318 -0
  374. package/src/lib/components/Txt.test.tsx +81 -0
  375. package/src/lib/components/Txt.ts +204 -0
  376. package/src/lib/components/TxtLeaf.ts +210 -0
  377. package/src/lib/components/Video.ts +368 -0
  378. package/src/lib/components/View2D.ts +85 -0
  379. package/src/lib/components/__logs__/image-without-source.md +17 -0
  380. package/src/lib/components/__logs__/line-without-points.md +30 -0
  381. package/src/lib/components/__logs__/reactive-playback-rate.md +21 -0
  382. package/src/lib/components/__logs__/spline-with-insufficient-knots.md +24 -0
  383. package/src/lib/components/__tests__/children.test.tsx +142 -0
  384. package/src/lib/components/__tests__/clone.test.tsx +126 -0
  385. package/src/lib/components/__tests__/generatorTest.ts +27 -0
  386. package/src/lib/components/__tests__/mockScene2D.ts +50 -0
  387. package/src/lib/components/__tests__/query.test.tsx +122 -0
  388. package/src/lib/components/__tests__/state.test.tsx +60 -0
  389. package/src/lib/components/index.ts +26 -0
  390. package/src/lib/components/types.ts +35 -0
  391. package/src/lib/curves/ArcSegment.ts +155 -0
  392. package/src/lib/curves/CircleSegment.ts +77 -0
  393. package/src/lib/curves/CubicBezierSegment.ts +78 -0
  394. package/src/lib/curves/CurveDrawingInfo.ts +11 -0
  395. package/src/lib/curves/CurvePoint.ts +15 -0
  396. package/src/lib/curves/CurveProfile.ts +7 -0
  397. package/src/lib/curves/KnotInfo.ts +10 -0
  398. package/src/lib/curves/LineSegment.ts +62 -0
  399. package/src/lib/curves/Polynomial.ts +355 -0
  400. package/src/lib/curves/Polynomial2D.ts +62 -0
  401. package/src/lib/curves/PolynomialSegment.ts +124 -0
  402. package/src/lib/curves/QuadBezierSegment.ts +64 -0
  403. package/src/lib/curves/Segment.ts +17 -0
  404. package/src/lib/curves/UniformPolynomialCurveSampler.ts +93 -0
  405. package/src/lib/curves/createCurveProfileLerp.ts +471 -0
  406. package/src/lib/curves/getBezierSplineProfile.ts +227 -0
  407. package/src/lib/curves/getCircleProfile.ts +86 -0
  408. package/src/lib/curves/getPathProfile.ts +177 -0
  409. package/src/lib/curves/getPointAtDistance.ts +21 -0
  410. package/src/lib/curves/getPolylineProfile.test.ts +21 -0
  411. package/src/lib/curves/getPolylineProfile.ts +88 -0
  412. package/src/lib/curves/getRectProfile.ts +138 -0
  413. package/src/lib/curves/index.ts +16 -0
  414. package/src/lib/decorators/canvasStyleSignal.ts +15 -0
  415. package/src/lib/decorators/colorSignal.ts +9 -0
  416. package/src/lib/decorators/compound.ts +85 -0
  417. package/src/lib/decorators/computed.ts +18 -0
  418. package/src/lib/decorators/defaultStyle.ts +15 -0
  419. package/src/lib/decorators/filtersSignal.ts +133 -0
  420. package/src/lib/decorators/index.ts +10 -0
  421. package/src/lib/decorators/initializers.ts +34 -0
  422. package/src/lib/decorators/nodeName.ts +13 -0
  423. package/src/lib/decorators/signal.test.ts +89 -0
  424. package/src/lib/decorators/signal.ts +348 -0
  425. package/src/lib/decorators/spacingSignal.ts +15 -0
  426. package/src/lib/decorators/vector2Signal.ts +35 -0
  427. package/src/lib/globals.d.ts +3 -0
  428. package/src/lib/index.ts +8 -0
  429. package/src/lib/jsx-dev-runtime.ts +2 -0
  430. package/src/lib/jsx-runtime.ts +45 -0
  431. package/src/lib/parse-svg-path.d.ts +14 -0
  432. package/src/lib/partials/Filter.ts +185 -0
  433. package/src/lib/partials/Gradient.ts +103 -0
  434. package/src/lib/partials/Pattern.ts +35 -0
  435. package/src/lib/partials/ShaderConfig.ts +122 -0
  436. package/src/lib/partials/index.ts +4 -0
  437. package/src/lib/partials/types.ts +58 -0
  438. package/src/lib/scenes/Scene2D.ts +195 -0
  439. package/src/lib/scenes/index.ts +3 -0
  440. package/src/lib/scenes/makeScene2D.ts +19 -0
  441. package/src/lib/scenes/useScene2D.ts +6 -0
  442. package/src/lib/tsconfig.build.json +12 -0
  443. package/src/lib/tsconfig.json +14 -0
  444. package/src/lib/tsdoc.json +4 -0
  445. package/src/lib/utils/CanvasUtils.ts +306 -0
  446. package/src/lib/utils/diff.test.ts +453 -0
  447. package/src/lib/utils/diff.ts +148 -0
  448. package/src/lib/utils/index.ts +3 -0
  449. package/src/lib/utils/is.ts +11 -0
  450. package/src/lib/utils/makeSignalExtensions.ts +29 -0
  451. package/src/lib/utils/withDefaults.tsx +26 -0
  452. package/src/tsconfig.base.json +18 -0
  453. package/src/tsconfig.build.json +8 -0
  454. package/src/tsconfig.json +5 -0
  455. package/tsconfig.project.json +7 -0
@@ -0,0 +1,132 @@
1
+ import {
2
+ BBox,
3
+ createSignal,
4
+ isReactive,
5
+ SignalValue,
6
+ SimpleSignal,
7
+ threadable,
8
+ TimingFunction,
9
+ tween,
10
+ Vector2,
11
+ } from '@efxlab/motion-canvas-core';
12
+ import {CurveProfile} from '../curves';
13
+ import {createCurveProfileLerp} from '../curves/createCurveProfileLerp';
14
+ import {getPathProfile} from '../curves/getPathProfile';
15
+ import {computed, signal} from '../decorators';
16
+ import {drawLine, drawPivot} from '../utils';
17
+ import {Curve, CurveProps} from './Curve';
18
+
19
+ export interface PathProps extends CurveProps {
20
+ data: SignalValue<string>;
21
+ }
22
+
23
+ export class Path extends Curve {
24
+ private currentProfile = createSignal<CurveProfile | null>(null);
25
+ @signal()
26
+ declare public readonly data: SimpleSignal<string, this>;
27
+
28
+ public constructor(props: PathProps) {
29
+ super(props);
30
+ this.canHaveSubpath = true;
31
+ }
32
+
33
+ @computed()
34
+ public override profile(): CurveProfile {
35
+ return this.currentProfile() ?? getPathProfile(this.data());
36
+ }
37
+
38
+ protected override childrenBBox() {
39
+ const points = this.profile().segments.flatMap(segment => segment.points);
40
+ return BBox.fromPoints(...points);
41
+ }
42
+
43
+ protected override lineWidthCoefficient(): number {
44
+ const join = this.lineJoin();
45
+
46
+ let coefficient = super.lineWidthCoefficient();
47
+
48
+ if (join === 'miter') {
49
+ const {minSin} = this.profile();
50
+ if (minSin > 0) {
51
+ coefficient = Math.max(coefficient, 0.5 / minSin);
52
+ }
53
+ }
54
+
55
+ return coefficient;
56
+ }
57
+
58
+ protected override processSubpath(
59
+ path: Path2D,
60
+ startPoint: Vector2 | null,
61
+ endPoint: Vector2 | null,
62
+ ): void {
63
+ if (startPoint && endPoint && startPoint.equals(endPoint)) {
64
+ path.closePath();
65
+ }
66
+ }
67
+
68
+ @threadable()
69
+ protected *tweenData(
70
+ newPath: SignalValue<string>,
71
+ time: number,
72
+ timingFunction: TimingFunction,
73
+ ) {
74
+ const fromProfile = this.profile();
75
+ const toProfile = getPathProfile(isReactive(newPath) ? newPath() : newPath);
76
+
77
+ const interpolator = createCurveProfileLerp(fromProfile, toProfile);
78
+
79
+ this.currentProfile(fromProfile);
80
+ yield* tween(
81
+ time,
82
+ value => {
83
+ const progress = timingFunction(value);
84
+ this.currentProfile(interpolator(progress));
85
+ },
86
+ () => {
87
+ this.currentProfile(null);
88
+ this.data(newPath);
89
+ },
90
+ );
91
+ }
92
+
93
+ public override drawOverlay(
94
+ context: CanvasRenderingContext2D,
95
+ matrix: DOMMatrix,
96
+ ): void {
97
+ const box = this.childrenBBox().transformCorners(matrix);
98
+ const size = this.computedSize();
99
+ const offset = size.mul(this.offset()).scale(0.5).transformAsPoint(matrix);
100
+ const segments = this.profile().segments;
101
+
102
+ context.lineWidth = 1;
103
+ context.strokeStyle = 'white';
104
+ context.fillStyle = 'white';
105
+
106
+ context.save();
107
+ context.setTransform(matrix);
108
+ let endPoint: Vector2 | null = null;
109
+ let path = new Path2D();
110
+
111
+ for (const segment of segments) {
112
+ if (endPoint && !segment.getPoint(0).position.equals(endPoint)) {
113
+ context.stroke(path);
114
+ path = new Path2D();
115
+ endPoint = null;
116
+ }
117
+ const [, end] = segment.draw(path, 0, 1, endPoint == null);
118
+ endPoint = end.position;
119
+ }
120
+ context.stroke(path);
121
+ context.restore();
122
+
123
+ context.beginPath();
124
+ drawPivot(context, offset);
125
+ context.stroke();
126
+
127
+ context.beginPath();
128
+ drawLine(context, box);
129
+ context.closePath();
130
+ context.stroke();
131
+ }
132
+ }
@@ -0,0 +1,238 @@
1
+ import {
2
+ BBox,
3
+ SerializedVector2,
4
+ SignalValue,
5
+ SimpleSignal,
6
+ Vector2,
7
+ } from '@efxlab/motion-canvas-core';
8
+ import {CurveProfile, getPolylineProfile} from '../curves';
9
+ import {computed, initial, signal} from '../decorators';
10
+ import {DesiredLength} from '../partials';
11
+ import {drawPolygon} from '../utils';
12
+ import {Curve, CurveProps} from './Curve';
13
+
14
+ export interface PolygonProps extends CurveProps {
15
+ /**
16
+ * {@inheritDoc Polygon.sides}
17
+ */
18
+ sides?: SignalValue<number>;
19
+ /**
20
+ * {@inheritDoc Polygon.radius}
21
+ */
22
+ radius?: SignalValue<number>;
23
+ }
24
+
25
+ /**
26
+ * A node for drawing regular polygons.
27
+ *
28
+ * @remarks
29
+ * This node can be used to render shapes such as: triangle, pentagon,
30
+ * hexagon and more.
31
+ *
32
+ * Note that the polygon is inscribed in a circle defined by the height
33
+ * and width. If height and width are unequal, the polygon is inscribed
34
+ * in the resulting ellipse.
35
+ *
36
+ * Since the polygon is inscribed in the circle, the actual displayed
37
+ * height and width may differ somewhat from the bounding rectangle. This
38
+ * will be particularly noticeable if the number of sides is low, e.g. for a
39
+ * triangle.
40
+ *
41
+ * @preview
42
+ * ```tsx editor
43
+ * // snippet Polygon
44
+ * import {makeScene2D, Polygon} from '@efxlab/motion-canvas-2d';
45
+ * import {createRef} from '@efxlab/motion-canvas-core';
46
+ *
47
+ * export default makeScene2D(function* (view) {
48
+ * const ref = createRef<Polygon>();
49
+ * view.add(
50
+ * <Polygon
51
+ * ref={ref}
52
+ * sides={6}
53
+ * size={160}
54
+ * fill={'lightseagreen'}
55
+ * />
56
+ * );
57
+ *
58
+ * yield* ref().sides(3, 2).to(6, 2);
59
+ * });
60
+ *
61
+ * // snippet Pentagon outline
62
+ * import {makeScene2D, Polygon} from '@efxlab/motion-canvas-2d';
63
+ *
64
+ * export default makeScene2D(function* (view) {
65
+ * view.add(
66
+ * <Polygon
67
+ * sides={5}
68
+ * size={160}
69
+ * radius={30}
70
+ * stroke={'lightblue'}
71
+ * lineWidth={8}
72
+ * />
73
+ * );
74
+ * });
75
+ *
76
+ * // snippet Accessing vertex data
77
+ * import {Circle, Polygon, makeScene2D} from '@efxlab/motion-canvas-2d';
78
+ * import {createRef, range} from '@efxlab/motion-canvas-core';
79
+ *
80
+ * export default makeScene2D(function* (view) {
81
+ * const polygon = createRef<Polygon>();
82
+ * view.add(
83
+ * <Polygon ref={polygon} sides={3} lineWidth={4} stroke={'white'} size={160}>
84
+ * {range(6).map(index => (
85
+ * <Circle
86
+ * fill={'white'}
87
+ * size={20}
88
+ * position={() => polygon().vertex(index)}
89
+ * opacity={() => polygon().vertexCompletion(index)}
90
+ * />
91
+ * ))}
92
+ * </Polygon>,
93
+ * );
94
+ *
95
+ * yield* polygon().sides(6, 2).wait(0.5).back(2);
96
+ * });
97
+ * ```
98
+ */
99
+ export class Polygon extends Curve {
100
+ /**
101
+ * The number of sides of the polygon.
102
+ *
103
+ * @remarks
104
+ * For example, a value of 6 creates a hexagon.
105
+ *
106
+ * @example
107
+ * ```tsx
108
+ * <Polygon
109
+ * size={320}
110
+ * sides={7}
111
+ * stroke={'#fff'}
112
+ * lineWidth={8}
113
+ * fill={'lightseagreen'}
114
+ * />
115
+ * ```
116
+ */
117
+ @initial(6)
118
+ @signal()
119
+ declare public readonly sides: SimpleSignal<number, this>;
120
+
121
+ /**
122
+ * The radius of the polygon's corners.
123
+ *
124
+ * @example
125
+ * ```tsx
126
+ * <Polygon
127
+ * radius={30}
128
+ * size={320}
129
+ * sides={3}
130
+ * stroke={'#fff'}
131
+ * lineWidth={8}
132
+ * />
133
+ * ```
134
+ */
135
+ @initial(0)
136
+ @signal()
137
+ declare public readonly radius: SimpleSignal<number, this>;
138
+
139
+ public constructor(props: PolygonProps) {
140
+ super(props);
141
+ }
142
+
143
+ /**
144
+ * Get the position of the nth vertex in the local space of this polygon.
145
+ *
146
+ * @param index - The index of the vertex.
147
+ */
148
+ public vertex(index: number): Vector2 {
149
+ const size = this.computedSize().scale(0.5);
150
+ const theta = (index * 2 * Math.PI) / this.sides();
151
+ const direction = Vector2.fromRadians(theta).perpendicular;
152
+ return direction.mul(size);
153
+ }
154
+
155
+ /**
156
+ * Get the completion of the nth vertex.
157
+ *
158
+ * @remarks
159
+ * The completion is a value between `0` and `1` that describes how the given
160
+ * vertex partakes in the polygon.
161
+ *
162
+ * For integer values of {@link sides}, the completion is simply `1` for
163
+ * each index making up the polygon and `0` for any other index. If `sides`
164
+ * includes a fraction, the last index of the polygon will have a completion
165
+ * equal to said fraction.
166
+ *
167
+ * Check out the {@link Polygon | Accessing vertex data} example for a
168
+ * demonstration.
169
+ *
170
+ * @param index - The index of the vertex.
171
+ */
172
+ public vertexCompletion(index: number): number {
173
+ const sides = this.sides();
174
+ if (index < 0 || index > sides) {
175
+ return 0;
176
+ }
177
+
178
+ if (index < sides - 1) {
179
+ return 1;
180
+ }
181
+
182
+ return sides - index;
183
+ }
184
+
185
+ @computed()
186
+ public override profile(): CurveProfile {
187
+ const sides = this.sides();
188
+ const radius = this.radius();
189
+
190
+ const points = [];
191
+ const size = this.computedSize().scale(0.5);
192
+ for (let i = 0; i < sides; i++) {
193
+ const theta = (i * 2 * Math.PI) / sides;
194
+ const direction = Vector2.fromRadians(theta).perpendicular;
195
+ points.push(direction.mul(size));
196
+ }
197
+
198
+ return getPolylineProfile(points, radius, true);
199
+ }
200
+
201
+ protected override desiredSize(): SerializedVector2<DesiredLength> {
202
+ return {
203
+ x: this.width.context.getter(),
204
+ y: this.height.context.getter(),
205
+ };
206
+ }
207
+
208
+ protected override offsetComputedLayout(box: BBox): BBox {
209
+ return box;
210
+ }
211
+
212
+ protected override childrenBBox(): BBox {
213
+ return BBox.fromSizeCentered(this.computedSize());
214
+ }
215
+
216
+ protected override requiresProfile(): boolean {
217
+ return super.requiresProfile() || this.radius() > 0;
218
+ }
219
+
220
+ protected override getPath(): Path2D {
221
+ if (this.requiresProfile()) {
222
+ return this.curveDrawingInfo().path;
223
+ }
224
+
225
+ return this.createPath();
226
+ }
227
+ protected override getRipplePath(): Path2D {
228
+ return this.createPath(this.rippleSize());
229
+ }
230
+
231
+ protected createPath(expand = 0) {
232
+ const path = new Path2D();
233
+ const sides = this.sides();
234
+ const box = BBox.fromSizeCentered(this.size()).expand(expand);
235
+ drawPolygon(path, box, sides);
236
+ return path;
237
+ }
238
+ }
@@ -0,0 +1,103 @@
1
+ import {
2
+ PossibleVector2,
3
+ SignalValue,
4
+ Vector2Signal,
5
+ } from '@efxlab/motion-canvas-core';
6
+ import {QuadBezierSegment} from '../curves';
7
+ import {PolynomialSegment} from '../curves/PolynomialSegment';
8
+ import {computed, vector2Signal} from '../decorators';
9
+ import {lineTo, moveTo, quadraticCurveTo} from '../utils';
10
+ import {Bezier, BezierOverlayInfo} from './Bezier';
11
+ import {CurveProps} from './Curve';
12
+
13
+ export interface QuadBezierProps extends CurveProps {
14
+ p0?: SignalValue<PossibleVector2>;
15
+ p0X?: SignalValue<number>;
16
+ p0Y?: SignalValue<number>;
17
+
18
+ p1?: SignalValue<PossibleVector2>;
19
+ p1X?: SignalValue<number>;
20
+ p1Y?: SignalValue<number>;
21
+
22
+ p2?: SignalValue<PossibleVector2>;
23
+ p2X?: SignalValue<number>;
24
+ p2Y?: SignalValue<number>;
25
+ }
26
+
27
+ /**
28
+ * A node for drawing a quadratic Bézier curve.
29
+ *
30
+ * @preview
31
+ * ```tsx editor
32
+ * import {makeScene2D, QuadBezier} from '@efxlab/motion-canvas-2d';
33
+ * import {createRef} from '@efxlab/motion-canvas-core';
34
+ *
35
+ * export default makeScene2D(function* (view) {
36
+ * const bezier = createRef<QuadBezier>();
37
+ *
38
+ * view.add(
39
+ * <QuadBezier
40
+ * ref={bezier}
41
+ * lineWidth={4}
42
+ * stroke={'lightseagreen'}
43
+ * p0={[-200, 0]}
44
+ * p1={[0, -200]}
45
+ * p2={[200, 0]}
46
+ * end={0}
47
+ * />
48
+ * );
49
+ *
50
+ * yield* bezier().end(1, 1);
51
+ * yield* bezier().start(1, 1).to(0, 1);
52
+ * });
53
+ * ```
54
+ */
55
+ export class QuadBezier extends Bezier {
56
+ /**
57
+ * The start point of the Bézier curve.
58
+ */
59
+ @vector2Signal('p0')
60
+ declare public readonly p0: Vector2Signal<this>;
61
+
62
+ /**
63
+ * The control point of the Bézier curve.
64
+ */
65
+ @vector2Signal('p1')
66
+ declare public readonly p1: Vector2Signal<this>;
67
+
68
+ /**
69
+ * The end point of the Bézier curve.
70
+ */
71
+ @vector2Signal('p2')
72
+ declare public readonly p2: Vector2Signal<this>;
73
+
74
+ public constructor(props: QuadBezierProps) {
75
+ super(props);
76
+ }
77
+
78
+ @computed()
79
+ protected segment(): PolynomialSegment {
80
+ return new QuadBezierSegment(this.p0(), this.p1(), this.p2());
81
+ }
82
+
83
+ protected overlayInfo(matrix: DOMMatrix): BezierOverlayInfo {
84
+ const [p0, p1, p2] = this.segment().transformPoints(matrix);
85
+
86
+ const curvePath = new Path2D();
87
+ moveTo(curvePath, p0);
88
+ quadraticCurveTo(curvePath, p1, p2);
89
+
90
+ const handleLinesPath = new Path2D();
91
+ moveTo(handleLinesPath, p0);
92
+ lineTo(handleLinesPath, p1);
93
+ lineTo(handleLinesPath, p2);
94
+
95
+ return {
96
+ curve: curvePath,
97
+ startPoint: p0,
98
+ endPoint: p2,
99
+ controlPoints: [p1],
100
+ handleLines: handleLinesPath,
101
+ };
102
+ }
103
+ }
@@ -0,0 +1,126 @@
1
+ import {
2
+ BBox,
3
+ PossibleVector2,
4
+ SignalValue,
5
+ Vector2Signal,
6
+ } from '@efxlab/motion-canvas-core';
7
+ import {CurveProfile, LineSegment} from '../curves';
8
+ import {nodeName, vector2Signal} from '../decorators';
9
+ import {arc, drawLine, drawPivot} from '../utils';
10
+ import {Curve, CurveProps} from './Curve';
11
+
12
+ export interface RayProps extends CurveProps {
13
+ /**
14
+ * {@inheritDoc Ray.from}
15
+ */
16
+ from?: SignalValue<PossibleVector2>;
17
+ fromX?: SignalValue<number>;
18
+ fromY?: SignalValue<number>;
19
+
20
+ /**
21
+ * {@inheritDoc Ray.to}
22
+ */
23
+ to?: SignalValue<PossibleVector2>;
24
+ toX?: SignalValue<number>;
25
+ toY?: SignalValue<number>;
26
+ }
27
+
28
+ /**
29
+ * A node for drawing an individual line segment.
30
+ *
31
+ * @preview
32
+ * ```tsx editor
33
+ * import {makeScene2D} from '@efxlab/motion-canvas-2d';
34
+ * import {Ray} from '@efxlab/motion-canvas-2d';
35
+ * import {createRef} from '@efxlab/motion-canvas-core';
36
+ *
37
+ * export default makeScene2D(function* (view) {
38
+ * const ray = createRef<Ray>();
39
+ *
40
+ * view.add(
41
+ * <Ray
42
+ * ref={ray}
43
+ * lineWidth={8}
44
+ * endArrow
45
+ * stroke={'lightseagreen'}
46
+ * fromX={-200}
47
+ * toX={200}
48
+ * />,
49
+ * );
50
+ *
51
+ * yield* ray().start(1, 1);
52
+ * yield* ray().start(0).end(0).start(1, 1);
53
+ * });
54
+ * ```
55
+ */
56
+ @nodeName('Ray')
57
+ export class Ray extends Curve {
58
+ /**
59
+ * The starting point of the ray.
60
+ */
61
+ @vector2Signal('from')
62
+ declare public readonly from: Vector2Signal<this>;
63
+
64
+ /**
65
+ * The ending point of the ray.
66
+ */
67
+ @vector2Signal('to')
68
+ declare public readonly to: Vector2Signal<this>;
69
+
70
+ public constructor(props: RayProps) {
71
+ super(props);
72
+ }
73
+
74
+ protected override childrenBBox() {
75
+ return BBox.fromPoints(this.from(), this.to());
76
+ }
77
+
78
+ public override profile(): CurveProfile {
79
+ const segment = new LineSegment(this.from(), this.to());
80
+
81
+ return {
82
+ arcLength: segment.arcLength,
83
+ minSin: 1,
84
+ segments: [segment],
85
+ };
86
+ }
87
+
88
+ public override drawOverlay(
89
+ context: CanvasRenderingContext2D,
90
+ matrix: DOMMatrix,
91
+ ) {
92
+ const box = this.childrenBBox().transformCorners(matrix);
93
+ const size = this.computedSize();
94
+ const offset = size.mul(this.offset()).scale(0.5).transformAsPoint(matrix);
95
+ const from = this.from().transformAsPoint(matrix);
96
+ const to = this.to().transformAsPoint(matrix);
97
+
98
+ context.fillStyle = 'white';
99
+ context.strokeStyle = 'black';
100
+ context.lineWidth = 1;
101
+
102
+ context.beginPath();
103
+ arc(context, from, 4);
104
+ context.fill();
105
+ context.stroke();
106
+
107
+ context.beginPath();
108
+ arc(context, to, 4);
109
+ context.fill();
110
+ context.stroke();
111
+
112
+ context.strokeStyle = 'white';
113
+ context.beginPath();
114
+ drawLine(context, [from, to]);
115
+ context.stroke();
116
+
117
+ context.beginPath();
118
+ drawPivot(context, offset);
119
+ context.stroke();
120
+
121
+ context.beginPath();
122
+ drawLine(context, box);
123
+ context.closePath();
124
+ context.stroke();
125
+ }
126
+ }