@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,125 @@
1
+ import {CodeRange} from './CodeRange';
2
+ import {CodeTag, resolveCodeTag} from './CodeScope';
3
+
4
+ /**
5
+ * Transform the fragments to isolate the given range into its own fragment.
6
+ *
7
+ * @remarks
8
+ * This function will try to preserve the original fragments, resolving them
9
+ * only if they overlap with the range.
10
+ *
11
+ * @param range - The range to extract.
12
+ * @param fragments - The fragments to transform.
13
+ *
14
+ * @returns A tuple containing the transformed fragments and the index of the
15
+ * isolated fragment within.
16
+ */
17
+ export function extractRange(
18
+ range: CodeRange,
19
+ fragments: CodeTag[],
20
+ ): [CodeTag[], number] {
21
+ const [from, to] = range;
22
+ let [fromRow, fromColumn] = from;
23
+ let [toRow, toColumn] = to;
24
+ if (fromRow > toRow || (fromRow === toRow && fromColumn > toColumn)) {
25
+ [fromRow, fromColumn] = to;
26
+ [toRow, toColumn] = from;
27
+ }
28
+
29
+ let currentRow = 0;
30
+ let currentColumn = 0;
31
+ const newFragments: CodeTag[] = [];
32
+ let index = -1;
33
+ let found = false;
34
+ let extracted = '';
35
+
36
+ for (const fragment of fragments) {
37
+ if (found) {
38
+ newFragments.push(fragment);
39
+ continue;
40
+ }
41
+
42
+ const resolved = resolveCodeTag(fragment, false);
43
+ const lines = resolved.split('\n');
44
+ const newRows = lines.length - 1;
45
+ const lastColumn = lines[newRows].length;
46
+ const nextColumn = newRows > 0 ? lastColumn : currentColumn + lastColumn;
47
+
48
+ if (
49
+ fromRow > currentRow + newRows ||
50
+ (fromRow === currentRow + newRows && fromColumn > nextColumn)
51
+ ) {
52
+ currentRow += newRows;
53
+ currentColumn = nextColumn;
54
+ newFragments.push(fragment);
55
+ continue;
56
+ }
57
+
58
+ for (let i = 0; i < resolved.length; i++) {
59
+ const char = resolved.charAt(i);
60
+ if (fromRow === currentRow && fromColumn >= currentColumn) {
61
+ if (fromColumn === currentColumn) {
62
+ index = newFragments.length + 1;
63
+ newFragments.push(resolved.slice(0, i), '');
64
+ } else if (char === '\n') {
65
+ index = newFragments.length + 1;
66
+ newFragments.push(
67
+ resolved.slice(0, i) + ' '.repeat(fromColumn - currentColumn),
68
+ '',
69
+ );
70
+ }
71
+ }
72
+
73
+ if (index !== -1 && toRow === currentRow && toColumn >= currentColumn) {
74
+ if (toColumn === currentColumn) {
75
+ newFragments.push(resolved.slice(i));
76
+ found = true;
77
+ break;
78
+ }
79
+
80
+ if (char === '\n') {
81
+ if (currentColumn < toColumn) {
82
+ extracted += '\n';
83
+ if (i + 1 < resolved.length) {
84
+ newFragments.push(resolved.slice(i + 1));
85
+ }
86
+ } else {
87
+ newFragments.push(resolved.slice(i));
88
+ }
89
+ found = true;
90
+ break;
91
+ }
92
+ }
93
+
94
+ if (index !== -1) {
95
+ extracted += char;
96
+ }
97
+
98
+ if (char === '\n') {
99
+ currentRow++;
100
+ currentColumn = 0;
101
+ } else {
102
+ currentColumn++;
103
+ }
104
+ }
105
+
106
+ if (index === -1) {
107
+ newFragments.push(fragment);
108
+ }
109
+ }
110
+
111
+ if (index === -1) {
112
+ index = newFragments.length + 1;
113
+ const missingRows = fromRow - currentRow;
114
+ const missingColumns =
115
+ missingRows > 0 ? fromColumn : fromColumn - currentColumn;
116
+ newFragments.push(
117
+ '\n'.repeat(missingRows) + ' '.repeat(missingColumns),
118
+ '',
119
+ );
120
+ }
121
+
122
+ newFragments[index] = extracted;
123
+
124
+ return [newFragments, index];
125
+ }
@@ -0,0 +1,13 @@
1
+ export * from './CodeCursor';
2
+ export * from './CodeDiffer';
3
+ export * from './CodeFragment';
4
+ export * from './CodeHighlighter';
5
+ export * from './CodeRange';
6
+ export * from './CodeScope';
7
+ export * from './CodeSelection';
8
+ export * from './CodeSignal';
9
+ export * from './CodeTokenizer';
10
+ export * from './DefaultHighlightStyle';
11
+ export * from './diff';
12
+ export * from './extractRange';
13
+ export * from './LezerHighlighter';
@@ -0,0 +1,103 @@
1
+ import {BBox, SerializedVector2, Vector2} from '@efxlab/motion-canvas-core';
2
+ import {CurveProfile} from '../curves';
3
+ import {PolynomialSegment} from '../curves/PolynomialSegment';
4
+ import {computed} from '../decorators';
5
+ import {DesiredLength} from '../partials';
6
+ import {arc, drawLine, drawPivot, moveTo} from '../utils';
7
+ import {Curve} from './Curve';
8
+
9
+ export interface BezierOverlayInfo {
10
+ curve: Path2D;
11
+ handleLines: Path2D;
12
+ controlPoints: Vector2[];
13
+ startPoint: Vector2;
14
+ endPoint: Vector2;
15
+ }
16
+
17
+ export abstract class Bezier extends Curve {
18
+ public override profile(): CurveProfile {
19
+ const segment = this.segment();
20
+ return {
21
+ segments: [segment],
22
+ arcLength: segment.arcLength,
23
+ minSin: 0,
24
+ };
25
+ }
26
+
27
+ protected abstract segment(): PolynomialSegment;
28
+
29
+ protected abstract overlayInfo(matrix: DOMMatrix): BezierOverlayInfo;
30
+
31
+ @computed()
32
+ protected childrenBBox(): BBox {
33
+ return BBox.fromPoints(...this.segment().points);
34
+ }
35
+
36
+ protected override desiredSize(): SerializedVector2<DesiredLength> {
37
+ return this.segment().getBBox().size;
38
+ }
39
+
40
+ protected override offsetComputedLayout(box: BBox): BBox {
41
+ box.position = box.position.sub(this.segment().getBBox().center);
42
+ return box;
43
+ }
44
+
45
+ public override drawOverlay(
46
+ context: CanvasRenderingContext2D,
47
+ matrix: DOMMatrix,
48
+ ) {
49
+ const size = this.computedSize();
50
+ const box = this.childrenBBox().transformCorners(matrix);
51
+ const offset = size.mul(this.offset()).scale(0.5).transformAsPoint(matrix);
52
+ const overlayInfo = this.overlayInfo(matrix);
53
+
54
+ context.lineWidth = 1;
55
+ context.strokeStyle = 'white';
56
+ context.fillStyle = 'white';
57
+
58
+ // Draw the curve itself first so everything else gets drawn on top of it
59
+ context.stroke(overlayInfo.curve);
60
+
61
+ context.fillStyle = 'white';
62
+ context.globalAlpha = 0.5;
63
+
64
+ context.beginPath();
65
+ context.stroke(overlayInfo.handleLines);
66
+
67
+ context.globalAlpha = 1;
68
+ context.lineWidth = 2;
69
+
70
+ // Draw start and end points
71
+ for (const point of [overlayInfo.startPoint, overlayInfo.endPoint]) {
72
+ moveTo(context, point);
73
+ context.beginPath();
74
+ arc(context, point, 4);
75
+ context.closePath();
76
+ context.stroke();
77
+ context.fill();
78
+ }
79
+
80
+ // Draw the control points
81
+ context.fillStyle = 'black';
82
+ for (const point of overlayInfo.controlPoints) {
83
+ moveTo(context, point);
84
+ context.beginPath();
85
+ arc(context, point, 4);
86
+ context.closePath();
87
+ context.fill();
88
+ context.stroke();
89
+ }
90
+
91
+ // Draw the offset marker
92
+ context.lineWidth = 1;
93
+ context.beginPath();
94
+ drawPivot(context, offset);
95
+ context.stroke();
96
+
97
+ // Draw the bounding box
98
+ context.beginPath();
99
+ drawLine(context, box);
100
+ context.closePath();
101
+ context.stroke();
102
+ }
103
+ }
@@ -0,0 +1,359 @@
1
+ import {
2
+ all,
3
+ DEFAULT,
4
+ easeInOutCubic,
5
+ InterpolationFunction,
6
+ modify,
7
+ PossibleVector2,
8
+ Reference,
9
+ SignalValue,
10
+ SimpleSignal,
11
+ threadable,
12
+ ThreadGenerator,
13
+ TimingFunction,
14
+ tween,
15
+ unwrap,
16
+ Vector2,
17
+ } from '@efxlab/motion-canvas-core';
18
+ import {cloneable, signal} from '../decorators';
19
+ import {Curve} from './Curve';
20
+ import {Node, NodeProps} from './Node';
21
+ import {Rect, RectProps} from './Rect';
22
+
23
+ export interface CameraProps extends NodeProps {
24
+ /**
25
+ * {@inheritDoc Camera.scene}
26
+ */
27
+ scene?: Node;
28
+
29
+ /**
30
+ * {@inheritDoc Camera.zoom}
31
+ */
32
+ zoom?: SignalValue<number>;
33
+ }
34
+
35
+ /**
36
+ * A node representing an orthographic camera.
37
+ *
38
+ * @preview
39
+ * ```tsx editor
40
+ * import {Camera, Circle, makeScene2D, Rect} from '@efxlab/motion-canvas-2d';
41
+ * import {all, createRef} from '@efxlab/motion-canvas-core';
42
+ *
43
+ * export default makeScene2D(function* (view) {
44
+ * const camera = createRef<Camera>();
45
+ * const rect = createRef<Rect>();
46
+ * const circle = createRef<Circle>();
47
+ *
48
+ * view.add(
49
+ * <>
50
+ * <Camera ref={camera}>
51
+ * <Rect
52
+ * ref={rect}
53
+ * fill={'lightseagreen'}
54
+ * size={100}
55
+ * position={[100, -50]}
56
+ * />
57
+ * <Circle
58
+ * ref={circle}
59
+ * fill={'hotpink'}
60
+ * size={120}
61
+ * position={[-100, 50]}
62
+ * />
63
+ * </Camera>
64
+ * </>,
65
+ * );
66
+ *
67
+ * yield* all(
68
+ * camera().centerOn(rect(), 3),
69
+ * camera().rotation(180, 3),
70
+ * camera().zoom(1.8, 3),
71
+ * );
72
+ * yield* camera().centerOn(circle(), 2);
73
+ * yield* camera().reset(1);
74
+ * });
75
+ * ```
76
+ */
77
+ export class Camera extends Node {
78
+ /**
79
+ * The scene node that the camera is rendering.
80
+ */
81
+ @signal()
82
+ declare public readonly scene: SimpleSignal<Node, this>;
83
+
84
+ public constructor({children, ...props}: CameraProps) {
85
+ super(props);
86
+
87
+ if (!this.scene()) {
88
+ this.scene(new Node({}));
89
+ }
90
+
91
+ if (children) {
92
+ this.scene().add(children);
93
+ }
94
+ }
95
+
96
+ /**
97
+ * The zoom level of the camera.
98
+ *
99
+ * @defaultValue 1
100
+ */
101
+ @cloneable(false)
102
+ @signal()
103
+ declare public readonly zoom: SimpleSignal<number, this>;
104
+
105
+ protected getZoom(): number {
106
+ return 1 / this.scale.x();
107
+ }
108
+
109
+ protected setZoom(value: SignalValue<number>) {
110
+ this.scale(modify(value, unwrapped => 1 / unwrapped));
111
+ }
112
+
113
+ protected getDefaultZoom() {
114
+ return this.scale.x.context.getInitial();
115
+ }
116
+
117
+ protected *tweenZoom(
118
+ value: SignalValue<number>,
119
+ duration: number,
120
+ timingFunction: TimingFunction,
121
+ interpolationFunction: InterpolationFunction<number>,
122
+ ): ThreadGenerator {
123
+ const from = this.scale.x();
124
+ yield* tween(duration, v => {
125
+ this.zoom(
126
+ 1 / interpolationFunction(from, 1 / unwrap(value), timingFunction(v)),
127
+ );
128
+ });
129
+ }
130
+
131
+ /**
132
+ * Resets the camera's position, rotation and zoom level to their original
133
+ * values.
134
+ *
135
+ * @param duration - The duration of the tween.
136
+ * @param timingFunction - The timing function to use for the tween.
137
+ */
138
+ @threadable()
139
+ public *reset(
140
+ duration: number,
141
+ timingFunction: TimingFunction = easeInOutCubic,
142
+ ): ThreadGenerator {
143
+ yield* all(
144
+ this.position(DEFAULT, duration, timingFunction),
145
+ this.zoom(DEFAULT, duration, timingFunction),
146
+ this.rotation(DEFAULT, duration, timingFunction),
147
+ );
148
+ }
149
+
150
+ /**
151
+ * Centers the camera on the specified position without changing the zoom
152
+ * level.
153
+ *
154
+ * @param position - The position to center the camera on.
155
+ * @param duration - The duration of the tween.
156
+ * @param timingFunction - The timing function to use for the tween.
157
+ * @param interpolationFunction - The interpolation function to use for the
158
+ * tween.
159
+ */
160
+ public centerOn(
161
+ position: PossibleVector2,
162
+ duration: number,
163
+ timingFunction?: TimingFunction,
164
+ interpolationFunction?: InterpolationFunction<Vector2>,
165
+ ): ThreadGenerator;
166
+ /**
167
+ * Centers the camera on the specified node without changing the zoom level.
168
+ *
169
+ * @param node - The node to center the camera on.
170
+ * @param duration - The duration of the tween.
171
+ * @param timingFunction - The timing function to use for the tween.
172
+ * @param interpolationFunction - The interpolation function to use for the
173
+ * tween.
174
+ */
175
+ public centerOn(
176
+ node: Node,
177
+ duration: number,
178
+ timingFunction?: TimingFunction,
179
+ interpolationFunction?: InterpolationFunction<Vector2>,
180
+ ): ThreadGenerator;
181
+ @threadable()
182
+ public *centerOn(
183
+ positionOrNode: Node | PossibleVector2,
184
+ duration: number,
185
+ timing: TimingFunction = easeInOutCubic,
186
+ interpolationFunction: InterpolationFunction<Vector2> = Vector2.lerp,
187
+ ): ThreadGenerator {
188
+ const position =
189
+ positionOrNode instanceof Node
190
+ ? positionOrNode
191
+ .absolutePosition()
192
+ .transformAsPoint(this.scene().worldToLocal())
193
+ : positionOrNode;
194
+ yield* this.position(position, duration, timing, interpolationFunction);
195
+ }
196
+
197
+ /**
198
+ * Makes the camera follow a path specified by the provided curve.
199
+ *
200
+ * @remarks
201
+ * This will not change the orientation of the camera. To make the camera
202
+ * orient itself along the curve, use {@link followCurveWithRotation} or
203
+ * {@link followCurveWithRotationReverse}.
204
+ *
205
+ * If you want to follow the curve in reverse, use {@link followCurveReverse}.
206
+ *
207
+ * @param curve - The curve to follow.
208
+ * @param duration - The duration of the tween.
209
+ * @param timing - The timing function to use for the tween.
210
+ */
211
+ @threadable()
212
+ public *followCurve(
213
+ curve: Curve,
214
+ duration: number,
215
+ timing: TimingFunction = easeInOutCubic,
216
+ ): ThreadGenerator {
217
+ yield* tween(duration, value => {
218
+ const t = timing(value);
219
+ const point = curve
220
+ .getPointAtPercentage(t)
221
+ .position.transformAsPoint(curve.localToWorld());
222
+
223
+ this.position(point);
224
+ });
225
+ }
226
+
227
+ /**
228
+ * Makes the camera follow a path specified by the provided curve in reverse.
229
+ *
230
+ * @remarks
231
+ * This will not change the orientation of the camera. To make the camera
232
+ * orient itself along the curve, use {@link followCurveWithRotation} or
233
+ * {@link followCurveWithRotationReverse}.
234
+ *
235
+ * If you want to follow the curve forward, use {@link followCurve}.
236
+ *
237
+ * @param curve - The curve to follow.
238
+ * @param duration - The duration of the tween.
239
+ * @param timing - The timing function to use for the tween.
240
+ */
241
+ @threadable()
242
+ public *followCurveReverse(
243
+ curve: Curve,
244
+ duration: number,
245
+ timing: TimingFunction = easeInOutCubic,
246
+ ) {
247
+ yield* tween(duration, value => {
248
+ const t = 1 - timing(value);
249
+ const point = curve
250
+ .getPointAtPercentage(t)
251
+ .position.transformAsPoint(curve.localToWorld());
252
+
253
+ this.position(point);
254
+ });
255
+ }
256
+
257
+ /**
258
+ * Makes the camera follow a path specified by the provided curve while
259
+ * pointing the camera the direction of the tangent.
260
+ *
261
+ * @remarks
262
+ * To make the camera follow the curve without changing its orientation, use
263
+ * {@link followCurve} or {@link followCurveReverse}.
264
+ *
265
+ * If you want to follow the curve in reverse, use
266
+ * {@link followCurveWithRotationReverse}.
267
+ *
268
+ * @param curve - The curve to follow.
269
+ * @param duration - The duration of the tween.
270
+ * @param timing - The timing function to use for the tween.
271
+ */
272
+ @threadable()
273
+ public *followCurveWithRotation(
274
+ curve: Curve,
275
+ duration: number,
276
+ timing: TimingFunction = easeInOutCubic,
277
+ ) {
278
+ yield* tween(duration, value => {
279
+ const t = timing(value);
280
+ const {position, normal} = curve.getPointAtPercentage(t);
281
+ const point = position.transformAsPoint(curve.localToWorld());
282
+ const angle = normal.flipped.perpendicular.degrees;
283
+
284
+ this.position(point);
285
+ this.rotation(angle);
286
+ });
287
+ }
288
+
289
+ /**
290
+ * Makes the camera follow a path specified by the provided curve in reverse
291
+ * while pointing the camera the direction of the tangent.
292
+ *
293
+ * @remarks
294
+ * To make the camera follow the curve without changing its orientation, use
295
+ * {@link followCurve} or {@link followCurveReverse}.
296
+ *
297
+ * If you want to follow the curve forward, use
298
+ * {@link followCurveWithRotation}.
299
+ *
300
+ * @param curve - The curve to follow.
301
+ * @param duration - The duration of the tween.
302
+ * @param timing - The timing function to use for the tween.
303
+ */
304
+ @threadable()
305
+ public *followCurveWithRotationReverse(
306
+ curve: Curve,
307
+ duration: number,
308
+ timing: TimingFunction = easeInOutCubic,
309
+ ) {
310
+ yield* tween(duration, value => {
311
+ const t = 1 - timing(value);
312
+ const {position, normal} = curve.getPointAtPercentage(t);
313
+ const point = position.transformAsPoint(curve.localToWorld());
314
+ const angle = normal.flipped.perpendicular.degrees;
315
+
316
+ this.position(point);
317
+ this.rotation(angle);
318
+ });
319
+ }
320
+
321
+ protected override transformContext(context: CanvasRenderingContext2D) {
322
+ const matrix = this.localToParent().inverse();
323
+ context.transform(
324
+ matrix.a,
325
+ matrix.b,
326
+ matrix.c,
327
+ matrix.d,
328
+ matrix.e,
329
+ matrix.f,
330
+ );
331
+ }
332
+
333
+ public override hit(position: Vector2): Node | null {
334
+ const local = position.transformAsPoint(this.localToParent());
335
+ return this.scene().hit(local);
336
+ }
337
+
338
+ protected override drawChildren(context: CanvasRenderingContext2D) {
339
+ (this.scene() as Camera).drawChildren(context);
340
+ }
341
+
342
+ // eslint-disable-next-line @typescript-eslint/naming-convention
343
+ public static Stage({
344
+ children,
345
+ cameraRef,
346
+ scene,
347
+ ...props
348
+ }: RectProps & {cameraRef?: Reference<Camera>; scene?: Node}) {
349
+ const camera = new Camera({scene: scene, children});
350
+
351
+ cameraRef?.(camera);
352
+
353
+ return new Rect({
354
+ clip: true,
355
+ ...props,
356
+ children: [camera],
357
+ });
358
+ }
359
+ }