@revideo/2d 0.1.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 (454) hide show
  1. package/LICENSE +21 -0
  2. package/editor/index.css +33 -0
  3. package/editor/index.js +340 -0
  4. package/editor/index.js.map +1 -0
  5. package/lib/code/CodeCursor.d.ts +83 -0
  6. package/lib/code/CodeCursor.d.ts.map +1 -0
  7. package/lib/code/CodeCursor.js +306 -0
  8. package/lib/code/CodeDiffer.d.ts +28 -0
  9. package/lib/code/CodeDiffer.d.ts.map +1 -0
  10. package/lib/code/CodeDiffer.js +51 -0
  11. package/lib/code/CodeFragment.d.ts +42 -0
  12. package/lib/code/CodeFragment.d.ts.map +1 -0
  13. package/lib/code/CodeFragment.js +72 -0
  14. package/lib/code/CodeHighlighter.d.ts +71 -0
  15. package/lib/code/CodeHighlighter.d.ts.map +1 -0
  16. package/lib/code/CodeHighlighter.js +2 -0
  17. package/lib/code/CodeMetrics.d.ts +11 -0
  18. package/lib/code/CodeMetrics.d.ts.map +1 -0
  19. package/lib/code/CodeMetrics.js +29 -0
  20. package/lib/code/CodeRange.d.ts +41 -0
  21. package/lib/code/CodeRange.d.ts.map +1 -0
  22. package/lib/code/CodeRange.js +179 -0
  23. package/lib/code/CodeScope.d.ts +16 -0
  24. package/lib/code/CodeScope.d.ts.map +1 -0
  25. package/lib/code/CodeScope.js +72 -0
  26. package/lib/code/CodeSelection.d.ts +6 -0
  27. package/lib/code/CodeSelection.d.ts.map +1 -0
  28. package/lib/code/CodeSelection.js +13 -0
  29. package/lib/code/CodeSignal.d.ts +60 -0
  30. package/lib/code/CodeSignal.d.ts.map +1 -0
  31. package/lib/code/CodeSignal.js +201 -0
  32. package/lib/code/CodeTokenizer.d.ts +8 -0
  33. package/lib/code/CodeTokenizer.d.ts.map +1 -0
  34. package/lib/code/CodeTokenizer.js +50 -0
  35. package/lib/code/DefaultHighlightStyle.d.ts +3 -0
  36. package/lib/code/DefaultHighlightStyle.d.ts.map +1 -0
  37. package/lib/code/DefaultHighlightStyle.js +98 -0
  38. package/lib/code/LezerHighlighter.d.ts +23 -0
  39. package/lib/code/LezerHighlighter.d.ts.map +1 -0
  40. package/lib/code/LezerHighlighter.js +113 -0
  41. package/lib/code/diff.d.ts +31 -0
  42. package/lib/code/diff.d.ts.map +1 -0
  43. package/lib/code/diff.js +236 -0
  44. package/lib/code/extractRange.d.ts +17 -0
  45. package/lib/code/extractRange.d.ts.map +1 -0
  46. package/lib/code/extractRange.js +94 -0
  47. package/lib/code/index.d.ts +14 -0
  48. package/lib/code/index.d.ts.map +1 -0
  49. package/lib/code/index.js +14 -0
  50. package/lib/components/Audio.d.ts +13 -0
  51. package/lib/components/Audio.d.ts.map +1 -0
  52. package/lib/components/Audio.js +120 -0
  53. package/lib/components/AudioTest.d.ts +99 -0
  54. package/lib/components/AudioTest.d.ts.map +1 -0
  55. package/lib/components/AudioTest.js +283 -0
  56. package/lib/components/Bezier.d.ts +22 -0
  57. package/lib/components/Bezier.d.ts.map +1 -0
  58. package/lib/components/Bezier.js +80 -0
  59. package/lib/components/Circle.d.ts +191 -0
  60. package/lib/components/Circle.d.ts.map +1 -0
  61. package/lib/components/Circle.js +178 -0
  62. package/lib/components/Code.d.ts +265 -0
  63. package/lib/components/Code.d.ts.map +1 -0
  64. package/lib/components/Code.js +325 -0
  65. package/lib/components/CodeBlock.d.ts +128 -0
  66. package/lib/components/CodeBlock.d.ts.map +1 -0
  67. package/lib/components/CodeBlock.js +458 -0
  68. package/lib/components/CubicBezier.d.ts +69 -0
  69. package/lib/components/CubicBezier.d.ts.map +1 -0
  70. package/lib/components/CubicBezier.js +81 -0
  71. package/lib/components/Curve.d.ts +202 -0
  72. package/lib/components/Curve.d.ts.map +1 -0
  73. package/lib/components/Curve.js +284 -0
  74. package/lib/components/Grid.d.ts +75 -0
  75. package/lib/components/Grid.d.ts.map +1 -0
  76. package/lib/components/Grid.js +91 -0
  77. package/lib/components/Icon.d.ts +58 -0
  78. package/lib/components/Icon.d.ts.map +1 -0
  79. package/lib/components/Icon.js +58 -0
  80. package/lib/components/Img.d.ts +116 -0
  81. package/lib/components/Img.d.ts.map +1 -0
  82. package/lib/components/Img.js +232 -0
  83. package/lib/components/Knot.d.ts +89 -0
  84. package/lib/components/Knot.d.ts.map +1 -0
  85. package/lib/components/Knot.js +68 -0
  86. package/lib/components/Latex.d.ts +34 -0
  87. package/lib/components/Latex.d.ts.map +1 -0
  88. package/lib/components/Latex.js +93 -0
  89. package/lib/components/Layout.d.ts +417 -0
  90. package/lib/components/Layout.d.ts.map +1 -0
  91. package/lib/components/Layout.js +690 -0
  92. package/lib/components/Line.d.ts +158 -0
  93. package/lib/components/Line.d.ts.map +1 -0
  94. package/lib/components/Line.js +312 -0
  95. package/lib/components/Media.d.ts +35 -0
  96. package/lib/components/Media.d.ts.map +1 -0
  97. package/lib/components/Media.js +135 -0
  98. package/lib/components/Node.d.ts +835 -0
  99. package/lib/components/Node.d.ts.map +1 -0
  100. package/lib/components/Node.js +1317 -0
  101. package/lib/components/Path.d.ts +18 -0
  102. package/lib/components/Path.d.ts.map +1 -0
  103. package/lib/components/Path.js +96 -0
  104. package/lib/components/Polygon.d.ts +111 -0
  105. package/lib/components/Polygon.d.ts.map +1 -0
  106. package/lib/components/Polygon.js +123 -0
  107. package/lib/components/QuadBezier.d.ts +61 -0
  108. package/lib/components/QuadBezier.d.ts.map +1 -0
  109. package/lib/components/QuadBezier.js +76 -0
  110. package/lib/components/Ray.d.ts +60 -0
  111. package/lib/components/Ray.d.ts.map +1 -0
  112. package/lib/components/Ray.js +95 -0
  113. package/lib/components/Rect.d.ts +112 -0
  114. package/lib/components/Rect.d.ts.map +1 -0
  115. package/lib/components/Rect.js +76 -0
  116. package/lib/components/SVG.d.ts +175 -0
  117. package/lib/components/SVG.d.ts.map +1 -0
  118. package/lib/components/SVG.js +577 -0
  119. package/lib/components/Shape.d.ts +39 -0
  120. package/lib/components/Shape.d.ts.map +1 -0
  121. package/lib/components/Shape.js +134 -0
  122. package/lib/components/Spline.d.ts +87 -0
  123. package/lib/components/Spline.d.ts.map +1 -0
  124. package/lib/components/Spline.js +229 -0
  125. package/lib/components/Txt.d.ts +51 -0
  126. package/lib/components/Txt.d.ts.map +1 -0
  127. package/lib/components/Txt.js +168 -0
  128. package/lib/components/TxtLeaf.d.ts +20 -0
  129. package/lib/components/TxtLeaf.d.ts.map +1 -0
  130. package/lib/components/TxtLeaf.js +174 -0
  131. package/lib/components/Video.d.ts +45 -0
  132. package/lib/components/Video.d.ts.map +1 -0
  133. package/lib/components/Video.js +148 -0
  134. package/lib/components/View2D.d.ts +25 -0
  135. package/lib/components/View2D.d.ts.map +1 -0
  136. package/lib/components/View2D.js +88 -0
  137. package/lib/components/index.d.ts +27 -0
  138. package/lib/components/index.d.ts.map +1 -0
  139. package/lib/components/index.js +27 -0
  140. package/lib/components/types.d.ts +17 -0
  141. package/lib/components/types.d.ts.map +1 -0
  142. package/lib/components/types.js +2 -0
  143. package/lib/curves/ArcSegment.d.ts +26 -0
  144. package/lib/curves/ArcSegment.d.ts.map +1 -0
  145. package/lib/curves/ArcSegment.js +101 -0
  146. package/lib/curves/CircleSegment.d.ts +18 -0
  147. package/lib/curves/CircleSegment.d.ts.map +1 -0
  148. package/lib/curves/CircleSegment.js +52 -0
  149. package/lib/curves/CubicBezierSegment.d.ts +18 -0
  150. package/lib/curves/CubicBezierSegment.d.ts.map +1 -0
  151. package/lib/curves/CubicBezierSegment.js +55 -0
  152. package/lib/curves/CurveDrawingInfo.d.ts +11 -0
  153. package/lib/curves/CurveDrawingInfo.d.ts.map +1 -0
  154. package/lib/curves/CurveDrawingInfo.js +2 -0
  155. package/lib/curves/CurvePoint.d.ts +15 -0
  156. package/lib/curves/CurvePoint.d.ts.map +1 -0
  157. package/lib/curves/CurvePoint.js +2 -0
  158. package/lib/curves/CurveProfile.d.ts +7 -0
  159. package/lib/curves/CurveProfile.d.ts.map +1 -0
  160. package/lib/curves/CurveProfile.js +2 -0
  161. package/lib/curves/KnotInfo.d.ts +12 -0
  162. package/lib/curves/KnotInfo.d.ts.map +1 -0
  163. package/lib/curves/KnotInfo.js +2 -0
  164. package/lib/curves/LineSegment.d.ts +16 -0
  165. package/lib/curves/LineSegment.d.ts.map +1 -0
  166. package/lib/curves/LineSegment.js +45 -0
  167. package/lib/curves/Polynomial.d.ts +118 -0
  168. package/lib/curves/Polynomial.d.ts.map +1 -0
  169. package/lib/curves/Polynomial.js +259 -0
  170. package/lib/curves/Polynomial2D.d.ts +22 -0
  171. package/lib/curves/Polynomial2D.d.ts.map +1 -0
  172. package/lib/curves/Polynomial2D.js +45 -0
  173. package/lib/curves/PolynomialSegment.d.ts +39 -0
  174. package/lib/curves/PolynomialSegment.d.ts.map +1 -0
  175. package/lib/curves/PolynomialSegment.js +85 -0
  176. package/lib/curves/QuadBezierSegment.d.ts +17 -0
  177. package/lib/curves/QuadBezierSegment.d.ts.map +1 -0
  178. package/lib/curves/QuadBezierSegment.js +49 -0
  179. package/lib/curves/Segment.d.ts +9 -0
  180. package/lib/curves/Segment.d.ts.map +1 -0
  181. package/lib/curves/Segment.js +3 -0
  182. package/lib/curves/UniformPolynomialCurveSampler.d.ts +43 -0
  183. package/lib/curves/UniformPolynomialCurveSampler.d.ts.map +1 -0
  184. package/lib/curves/UniformPolynomialCurveSampler.js +73 -0
  185. package/lib/curves/createCurveProfileLerp.d.ts +32 -0
  186. package/lib/curves/createCurveProfileLerp.d.ts.map +1 -0
  187. package/lib/curves/createCurveProfileLerp.js +351 -0
  188. package/lib/curves/getBezierSplineProfile.d.ts +12 -0
  189. package/lib/curves/getBezierSplineProfile.d.ts.map +1 -0
  190. package/lib/curves/getBezierSplineProfile.js +137 -0
  191. package/lib/curves/getCircleProfile.d.ts +4 -0
  192. package/lib/curves/getCircleProfile.d.ts.map +1 -0
  193. package/lib/curves/getCircleProfile.js +44 -0
  194. package/lib/curves/getPathProfile.d.ts +3 -0
  195. package/lib/curves/getPathProfile.d.ts.map +1 -0
  196. package/lib/curves/getPathProfile.js +128 -0
  197. package/lib/curves/getPointAtDistance.d.ts +4 -0
  198. package/lib/curves/getPointAtDistance.d.ts.map +1 -0
  199. package/lib/curves/getPointAtDistance.js +15 -0
  200. package/lib/curves/getPolylineProfile.d.ts +4 -0
  201. package/lib/curves/getPolylineProfile.d.ts.map +1 -0
  202. package/lib/curves/getPolylineProfile.js +58 -0
  203. package/lib/curves/getRectProfile.d.ts +4 -0
  204. package/lib/curves/getRectProfile.d.ts.map +1 -0
  205. package/lib/curves/getRectProfile.js +57 -0
  206. package/lib/curves/index.d.ts +17 -0
  207. package/lib/curves/index.d.ts.map +1 -0
  208. package/lib/curves/index.js +17 -0
  209. package/lib/decorators/canvasStyleSignal.d.ts +5 -0
  210. package/lib/decorators/canvasStyleSignal.d.ts.map +1 -0
  211. package/lib/decorators/canvasStyleSignal.js +12 -0
  212. package/lib/decorators/colorSignal.d.ts +2 -0
  213. package/lib/decorators/colorSignal.d.ts.map +1 -0
  214. package/lib/decorators/colorSignal.js +9 -0
  215. package/lib/decorators/compound.d.ts +26 -0
  216. package/lib/decorators/compound.d.ts.map +1 -0
  217. package/lib/decorators/compound.js +49 -0
  218. package/lib/decorators/computed.d.ts +9 -0
  219. package/lib/decorators/computed.d.ts.map +1 -0
  220. package/lib/decorators/computed.js +18 -0
  221. package/lib/decorators/defaultStyle.d.ts +2 -0
  222. package/lib/decorators/defaultStyle.d.ts.map +1 -0
  223. package/lib/decorators/defaultStyle.js +14 -0
  224. package/lib/decorators/filtersSignal.d.ts +11 -0
  225. package/lib/decorators/filtersSignal.d.ts.map +1 -0
  226. package/lib/decorators/filtersSignal.js +73 -0
  227. package/lib/decorators/index.d.ts +11 -0
  228. package/lib/decorators/index.d.ts.map +1 -0
  229. package/lib/decorators/index.js +11 -0
  230. package/lib/decorators/initializers.d.ts +4 -0
  231. package/lib/decorators/initializers.d.ts.map +1 -0
  232. package/lib/decorators/initializers.js +27 -0
  233. package/lib/decorators/nodeName.d.ts +9 -0
  234. package/lib/decorators/nodeName.d.ts.map +1 -0
  235. package/lib/decorators/nodeName.js +13 -0
  236. package/lib/decorators/signal.d.ts +183 -0
  237. package/lib/decorators/signal.d.ts.map +1 -0
  238. package/lib/decorators/signal.js +285 -0
  239. package/lib/decorators/spacingSignal.d.ts +2 -0
  240. package/lib/decorators/spacingSignal.d.ts.map +1 -0
  241. package/lib/decorators/spacingSignal.js +15 -0
  242. package/lib/decorators/vector2Signal.d.ts +8 -0
  243. package/lib/decorators/vector2Signal.d.ts.map +1 -0
  244. package/lib/decorators/vector2Signal.js +15 -0
  245. package/lib/index.d.ts +9 -0
  246. package/lib/index.d.ts.map +1 -0
  247. package/lib/index.js +9 -0
  248. package/lib/jsx-dev-runtime.d.ts +3 -0
  249. package/lib/jsx-dev-runtime.d.ts.map +1 -0
  250. package/lib/jsx-dev-runtime.js +3 -0
  251. package/lib/jsx-runtime.d.ts +12 -0
  252. package/lib/jsx-runtime.d.ts.map +1 -0
  253. package/lib/jsx-runtime.js +23 -0
  254. package/lib/partials/Filter.d.ts +82 -0
  255. package/lib/partials/Filter.d.ts.map +1 -0
  256. package/lib/partials/Filter.js +135 -0
  257. package/lib/partials/Gradient.d.ts +31 -0
  258. package/lib/partials/Gradient.d.ts.map +1 -0
  259. package/lib/partials/Gradient.js +63 -0
  260. package/lib/partials/Pattern.d.ts +13 -0
  261. package/lib/partials/Pattern.d.ts.map +1 -0
  262. package/lib/partials/Pattern.js +27 -0
  263. package/lib/partials/ShaderConfig.d.ts +81 -0
  264. package/lib/partials/ShaderConfig.d.ts.map +1 -0
  265. package/lib/partials/ShaderConfig.js +25 -0
  266. package/lib/partials/index.d.ts +5 -0
  267. package/lib/partials/index.d.ts.map +1 -0
  268. package/lib/partials/index.js +5 -0
  269. package/lib/partials/types.d.ts +35 -0
  270. package/lib/partials/types.d.ts.map +1 -0
  271. package/lib/partials/types.js +2 -0
  272. package/lib/scenes/Scene2D.d.ts +24 -0
  273. package/lib/scenes/Scene2D.d.ts.map +1 -0
  274. package/lib/scenes/Scene2D.js +158 -0
  275. package/lib/scenes/index.d.ts +4 -0
  276. package/lib/scenes/index.d.ts.map +1 -0
  277. package/lib/scenes/index.js +4 -0
  278. package/lib/scenes/makeScene2D.d.ts +5 -0
  279. package/lib/scenes/makeScene2D.d.ts.map +1 -0
  280. package/lib/scenes/makeScene2D.js +12 -0
  281. package/lib/scenes/useScene2D.d.ts +3 -0
  282. package/lib/scenes/useScene2D.d.ts.map +1 -0
  283. package/lib/scenes/useScene2D.js +5 -0
  284. package/lib/tsconfig.build.tsbuildinfo +1 -0
  285. package/lib/utils/CanvasUtils.d.ts +21 -0
  286. package/lib/utils/CanvasUtils.d.ts.map +1 -0
  287. package/lib/utils/CanvasUtils.js +138 -0
  288. package/lib/utils/diff.d.ts +31 -0
  289. package/lib/utils/diff.d.ts.map +1 -0
  290. package/lib/utils/diff.js +97 -0
  291. package/lib/utils/index.d.ts +3 -0
  292. package/lib/utils/index.d.ts.map +1 -0
  293. package/lib/utils/index.js +3 -0
  294. package/lib/utils/is.d.ts +8 -0
  295. package/lib/utils/is.d.ts.map +1 -0
  296. package/lib/utils/is.js +10 -0
  297. package/lib/utils/makeSignalExtensions.d.ts +4 -0
  298. package/lib/utils/makeSignalExtensions.d.ts.map +1 -0
  299. package/lib/utils/makeSignalExtensions.js +20 -0
  300. package/package.json +49 -0
  301. package/src/editor/NodeInspectorConfig.tsx +76 -0
  302. package/src/editor/PreviewOverlayConfig.tsx +66 -0
  303. package/src/editor/Provider.tsx +97 -0
  304. package/src/editor/SceneGraphTabConfig.tsx +82 -0
  305. package/src/editor/icons/CircleIcon.tsx +7 -0
  306. package/src/editor/icons/CodeBlockIcon.tsx +8 -0
  307. package/src/editor/icons/CurveIcon.tsx +7 -0
  308. package/src/editor/icons/GridIcon.tsx +7 -0
  309. package/src/editor/icons/IconMap.ts +35 -0
  310. package/src/editor/icons/ImgIcon.tsx +8 -0
  311. package/src/editor/icons/LayoutIcon.tsx +9 -0
  312. package/src/editor/icons/LineIcon.tsx +7 -0
  313. package/src/editor/icons/NodeIcon.tsx +7 -0
  314. package/src/editor/icons/RayIcon.tsx +7 -0
  315. package/src/editor/icons/RectIcon.tsx +7 -0
  316. package/src/editor/icons/ShapeIcon.tsx +7 -0
  317. package/src/editor/icons/TxtIcon.tsx +8 -0
  318. package/src/editor/icons/VideoIcon.tsx +7 -0
  319. package/src/editor/icons/View2DIcon.tsx +10 -0
  320. package/src/editor/index.css +0 -0
  321. package/src/editor/index.ts +17 -0
  322. package/src/editor/tree/DetachedRoot.tsx +23 -0
  323. package/src/editor/tree/NodeElement.tsx +73 -0
  324. package/src/editor/tree/TreeElement.tsx +72 -0
  325. package/src/editor/tree/TreeRoot.tsx +10 -0
  326. package/src/editor/tree/ViewRoot.tsx +20 -0
  327. package/src/editor/tree/index.module.scss +38 -0
  328. package/src/editor/tree/index.ts +3 -0
  329. package/src/editor/tsconfig.build.json +5 -0
  330. package/src/editor/tsconfig.json +12 -0
  331. package/src/editor/tsdoc.json +4 -0
  332. package/src/editor/vite-env.d.ts +1 -0
  333. package/src/lib/code/CodeCursor.ts +449 -0
  334. package/src/lib/code/CodeDiffer.ts +77 -0
  335. package/src/lib/code/CodeFragment.ts +96 -0
  336. package/src/lib/code/CodeHighlighter.ts +75 -0
  337. package/src/lib/code/CodeMetrics.ts +47 -0
  338. package/src/lib/code/CodeRange.test.ts +74 -0
  339. package/src/lib/code/CodeRange.ts +216 -0
  340. package/src/lib/code/CodeScope.ts +100 -0
  341. package/src/lib/code/CodeSelection.ts +28 -0
  342. package/src/lib/code/CodeSignal.ts +338 -0
  343. package/src/lib/code/CodeTokenizer.ts +54 -0
  344. package/src/lib/code/DefaultHighlightStyle.ts +98 -0
  345. package/src/lib/code/LezerHighlighter.ts +139 -0
  346. package/src/lib/code/diff.test.ts +311 -0
  347. package/src/lib/code/diff.ts +319 -0
  348. package/src/lib/code/extractRange.ts +120 -0
  349. package/src/lib/code/index.ts +13 -0
  350. package/src/lib/components/Audio.ts +130 -0
  351. package/src/lib/components/Bezier.ts +103 -0
  352. package/src/lib/components/Circle.ts +269 -0
  353. package/src/lib/components/Code.ts +553 -0
  354. package/src/lib/components/CodeBlock.ts +578 -0
  355. package/src/lib/components/CubicBezier.ts +111 -0
  356. package/src/lib/components/Curve.ts +455 -0
  357. package/src/lib/components/Grid.ts +134 -0
  358. package/src/lib/components/Icon.ts +95 -0
  359. package/src/lib/components/Img.ts +305 -0
  360. package/src/lib/components/Knot.ts +156 -0
  361. package/src/lib/components/Latex.ts +112 -0
  362. package/src/lib/components/Layout.ts +1057 -0
  363. package/src/lib/components/Line.ts +390 -0
  364. package/src/lib/components/Media.ts +165 -0
  365. package/src/lib/components/Node.ts +1932 -0
  366. package/src/lib/components/Path.ts +132 -0
  367. package/src/lib/components/Polygon.ts +174 -0
  368. package/src/lib/components/QuadBezier.ts +99 -0
  369. package/src/lib/components/Ray.ts +121 -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 +317 -0
  374. package/src/lib/components/Txt.test.tsx +81 -0
  375. package/src/lib/components/Txt.ts +201 -0
  376. package/src/lib/components/TxtLeaf.ts +202 -0
  377. package/src/lib/components/Video.ts +198 -0
  378. package/src/lib/components/View2D.ts +90 -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 +149 -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 +223 -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 +72 -0
  417. package/src/lib/decorators/computed.ts +18 -0
  418. package/src/lib/decorators/defaultStyle.ts +18 -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 +32 -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 +29 -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 +210 -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 +5 -0
  443. package/src/lib/tsconfig.json +14 -0
  444. package/src/lib/tsdoc.json +4 -0
  445. package/src/lib/utils/CanvasUtils.ts +304 -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 +2 -0
  449. package/src/lib/utils/is.ts +11 -0
  450. package/src/lib/utils/makeSignalExtensions.ts +29 -0
  451. package/src/tsconfig.base.json +18 -0
  452. package/src/tsconfig.build.json +8 -0
  453. package/src/tsconfig.json +5 -0
  454. package/tsconfig.project.json +7 -0
@@ -0,0 +1,201 @@
1
+ import {
2
+ DEFAULT,
3
+ InterpolationFunction,
4
+ SignalValue,
5
+ SimpleSignal,
6
+ ThreadGenerator,
7
+ TimingFunction,
8
+ all,
9
+ capitalize,
10
+ threadable,
11
+ } from '@revideo/core';
12
+ import {computed, initial, nodeName, signal} from '../decorators';
13
+ import {is} from '../utils';
14
+ import {Node} from './Node';
15
+ import {Shape, ShapeProps} from './Shape';
16
+ import {TxtLeaf} from './TxtLeaf';
17
+ import {ComponentChildren} from './types';
18
+
19
+ type TxtChildren = string | Node | (string | Node)[];
20
+ type AnyTxt = Txt | TxtLeaf;
21
+
22
+ export interface TxtProps extends ShapeProps {
23
+ children?: TxtChildren;
24
+ text?: SignalValue<string>;
25
+ }
26
+
27
+ @nodeName('Txt')
28
+ export class Txt extends Shape {
29
+ /**
30
+ * Create a bold text node.
31
+ *
32
+ * @remarks
33
+ * This is a shortcut for
34
+ * ```tsx
35
+ * <Txt fontWeight={700} />
36
+ * ```
37
+ *
38
+ * @param props - Additional text properties.
39
+ */
40
+ public static b(props: TxtProps) {
41
+ return new Txt({...props, fontWeight: 700});
42
+ }
43
+
44
+ /**
45
+ * Create an italic text node.
46
+ *
47
+ * @remarks
48
+ * This is a shortcut for
49
+ * ```tsx
50
+ * <Txt fontStyle={'italic'} />
51
+ * ```
52
+ *
53
+ * @param props - Additional text properties.
54
+ */
55
+ public static i(props: TxtProps) {
56
+ return new Txt({...props, fontStyle: 'italic'});
57
+ }
58
+
59
+ @initial('')
60
+ @signal()
61
+ public declare readonly text: SimpleSignal<string, this>;
62
+
63
+ protected getText(): string {
64
+ return this.innerText();
65
+ }
66
+
67
+ protected setText(value: SignalValue<string>) {
68
+ const children = this.children();
69
+ let leaf: TxtLeaf | null = null;
70
+ for (let i = 0; i < children.length; i++) {
71
+ const child = children[i];
72
+ if (leaf === null && child instanceof TxtLeaf) {
73
+ leaf = child;
74
+ } else {
75
+ child.parent(null);
76
+ }
77
+ }
78
+
79
+ if (leaf === null) {
80
+ leaf = new TxtLeaf({text: value});
81
+ leaf.parent(this);
82
+ } else {
83
+ leaf.text(value);
84
+ }
85
+
86
+ this.setParsedChildren([leaf]);
87
+ }
88
+
89
+ protected override setChildren(value: SignalValue<ComponentChildren>) {
90
+ if (this.children.context.raw() === value) {
91
+ return;
92
+ }
93
+
94
+ if (typeof value === 'string') {
95
+ this.text(value);
96
+ } else {
97
+ super.setChildren(value);
98
+ }
99
+ }
100
+
101
+ @threadable()
102
+ protected *tweenText(
103
+ value: SignalValue<string>,
104
+ time: number,
105
+ timingFunction: TimingFunction,
106
+ interpolationFunction: InterpolationFunction<string>,
107
+ ): ThreadGenerator {
108
+ const children = this.children();
109
+ if (children.length !== 1 || !(children[0] instanceof TxtLeaf)) {
110
+ this.text.save();
111
+ }
112
+
113
+ const leaf = this.childAs<TxtLeaf>(0)!;
114
+ const oldText = leaf.text.context.raw();
115
+ const oldSize = this.size.context.raw();
116
+ leaf.text(value);
117
+ const newSize = this.size();
118
+ leaf.text(oldText ?? DEFAULT);
119
+
120
+ if (this.height() === 0) {
121
+ this.height(newSize.height);
122
+ }
123
+
124
+ yield* all(
125
+ this.size(newSize, time, timingFunction),
126
+ leaf.text(value, time, timingFunction, interpolationFunction),
127
+ );
128
+
129
+ this.children.context.setter(value);
130
+ this.size(oldSize);
131
+ }
132
+
133
+ protected getLayout(): boolean {
134
+ return true;
135
+ }
136
+
137
+ public constructor({children, text, ...props}: TxtProps) {
138
+ super(props);
139
+ this.children(text ?? children);
140
+ }
141
+
142
+ @computed()
143
+ protected innerText(): string {
144
+ const children = this.childrenAs<Txt | TxtLeaf>();
145
+ let text = '';
146
+ for (const child of children) {
147
+ text += child.text();
148
+ }
149
+
150
+ return text;
151
+ }
152
+
153
+ @computed()
154
+ protected parentTxt() {
155
+ const parent = this.parent();
156
+ return parent instanceof Txt ? parent : null;
157
+ }
158
+
159
+ protected override parseChildren(children: ComponentChildren): AnyTxt[] {
160
+ const result: AnyTxt[] = [];
161
+ const array = Array.isArray(children) ? children : [children];
162
+ for (const child of array) {
163
+ if (child instanceof Txt || child instanceof TxtLeaf) {
164
+ result.push(child);
165
+ } else if (typeof child === 'string') {
166
+ result.push(new TxtLeaf({text: child}));
167
+ }
168
+ }
169
+
170
+ return result;
171
+ }
172
+
173
+ protected override applyFlex() {
174
+ super.applyFlex();
175
+ this.element.style.display = this.findAncestor(is(Txt))
176
+ ? 'inline'
177
+ : 'block';
178
+ }
179
+
180
+ protected override draw(context: CanvasRenderingContext2D) {
181
+ this.drawChildren(context);
182
+ }
183
+ }
184
+
185
+ [
186
+ 'fill',
187
+ 'stroke',
188
+ 'lineWidth',
189
+ 'strokeFirst',
190
+ 'lineCap',
191
+ 'lineJoin',
192
+ 'lineDash',
193
+ 'lineDashOffset',
194
+ ].forEach(prop => {
195
+ (Txt.prototype as any)[`getDefault${capitalize(prop)}`] = function (
196
+ this: Txt,
197
+ initial: unknown,
198
+ ) {
199
+ return (this.parentTxt() as any)?.[prop]() ?? initial;
200
+ };
201
+ });
@@ -0,0 +1,202 @@
1
+ import {
2
+ BBox,
3
+ SignalValue,
4
+ SimpleSignal,
5
+ capitalize,
6
+ lazy,
7
+ textLerp,
8
+ } from '@revideo/core';
9
+ import {
10
+ computed,
11
+ initial,
12
+ interpolation,
13
+ nodeName,
14
+ signal,
15
+ } from '../decorators';
16
+ import {Shape, ShapeProps} from './Shape';
17
+ import {Txt} from './Txt';
18
+ import {View2D} from './View2D';
19
+
20
+ export interface TxtLeafProps extends ShapeProps {
21
+ children?: string;
22
+ text?: SignalValue<string>;
23
+ }
24
+
25
+ @nodeName('TxtLeaf')
26
+ export class TxtLeaf extends Shape {
27
+ @lazy(() => {
28
+ const formatter = document.createElement('span');
29
+ View2D.shadowRoot.append(formatter);
30
+ return formatter;
31
+ })
32
+ protected static formatter: HTMLDivElement;
33
+
34
+ @lazy(() => {
35
+ try {
36
+ return new (Intl as any).Segmenter(undefined, {
37
+ granularity: 'grapheme',
38
+ });
39
+ } catch (e) {
40
+ return null;
41
+ }
42
+ })
43
+ protected static readonly segmenter: any;
44
+
45
+ @initial('')
46
+ @interpolation(textLerp)
47
+ @signal()
48
+ public declare readonly text: SimpleSignal<string, this>;
49
+
50
+ public constructor({children, ...rest}: TxtLeafProps) {
51
+ super(rest);
52
+ if (children) {
53
+ this.text(children);
54
+ }
55
+ }
56
+
57
+ @computed()
58
+ protected parentTxt() {
59
+ const parent = this.parent();
60
+ return parent instanceof Txt ? parent : null;
61
+ }
62
+
63
+ protected override draw(context: CanvasRenderingContext2D) {
64
+ this.requestFontUpdate();
65
+ this.applyStyle(context);
66
+ this.applyText(context);
67
+ context.font = this.styles.font;
68
+ if ('letterSpacing' in context) {
69
+ context.letterSpacing = `${this.letterSpacing()}px`;
70
+ }
71
+
72
+ const parentRect = this.element.getBoundingClientRect();
73
+ const {width, height} = this.size();
74
+ const range = document.createRange();
75
+ let line = '';
76
+ const lineRect = new BBox();
77
+ for (const childNode of this.element.childNodes) {
78
+ if (!childNode.textContent) {
79
+ continue;
80
+ }
81
+
82
+ range.selectNodeContents(childNode);
83
+ const rangeRect = range.getBoundingClientRect();
84
+
85
+ const x = width / -2 + rangeRect.left - parentRect.left;
86
+ const y = height / -2 + rangeRect.top - parentRect.top;
87
+
88
+ if (lineRect.y === y) {
89
+ lineRect.width += rangeRect.width;
90
+ line += childNode.textContent;
91
+ } else {
92
+ this.drawText(context, line, lineRect);
93
+ lineRect.x = x;
94
+ lineRect.y = y;
95
+ lineRect.width = rangeRect.width;
96
+ lineRect.height = rangeRect.height;
97
+ line = childNode.textContent;
98
+ }
99
+ }
100
+
101
+ this.drawText(context, line, lineRect);
102
+ }
103
+
104
+ protected drawText(
105
+ context: CanvasRenderingContext2D,
106
+ text: string,
107
+ box: BBox,
108
+ ) {
109
+ const y = box.y + box.height / 2;
110
+ context.save();
111
+ context.textBaseline = 'middle';
112
+ text = text.replace(/\s+/g, ' ');
113
+
114
+ if (this.lineWidth() <= 0) {
115
+ context.fillText(text, box.x, y);
116
+ } else if (this.strokeFirst()) {
117
+ context.strokeText(text, box.x, y);
118
+ context.fillText(text, box.x, y);
119
+ } else {
120
+ context.fillText(text, box.x, y);
121
+ context.strokeText(text, box.x, y);
122
+ }
123
+
124
+ context.restore();
125
+ }
126
+
127
+ protected override getCacheBBox(): BBox {
128
+ const size = this.computedSize();
129
+ const range = document.createRange();
130
+ range.selectNodeContents(this.element);
131
+ const bbox = range.getBoundingClientRect();
132
+
133
+ const lineWidth = this.lineWidth();
134
+ // We take the default value of the miterLimit as 10.
135
+ const miterLimitCoefficient = this.lineJoin() === 'miter' ? 0.5 * 10 : 0.5;
136
+
137
+ return new BBox(-size.width / 2, -size.height / 2, bbox.width, bbox.height)
138
+ .expand([0, this.fontSize() * 0.5])
139
+ .expand(lineWidth * miterLimitCoefficient);
140
+ }
141
+
142
+ protected override applyFlex() {
143
+ super.applyFlex();
144
+ this.element.style.display = 'inline';
145
+ }
146
+
147
+ protected override updateLayout() {
148
+ this.applyFont();
149
+ this.applyFlex();
150
+
151
+ // Make sure the text is aligned correctly even if the text is smaller than
152
+ // the container.
153
+ if (this.justifyContent.isInitial()) {
154
+ this.element.style.justifyContent =
155
+ this.styles.getPropertyValue('text-align');
156
+ }
157
+
158
+ const wrap =
159
+ this.styles.whiteSpace !== 'nowrap' && this.styles.whiteSpace !== 'pre';
160
+
161
+ if (wrap) {
162
+ this.element.innerText = '';
163
+
164
+ if (TxtLeaf.segmenter) {
165
+ for (const word of TxtLeaf.segmenter.segment(this.text())) {
166
+ this.element.appendChild(document.createTextNode(word.segment));
167
+ }
168
+ } else {
169
+ for (const word of this.text().split('')) {
170
+ this.element.appendChild(document.createTextNode(word));
171
+ }
172
+ }
173
+ } else if (this.styles.whiteSpace === 'pre') {
174
+ this.element.innerText = '';
175
+ for (const line of this.text().split('\n')) {
176
+ this.element.appendChild(document.createTextNode(line + '\n'));
177
+ }
178
+ } else {
179
+ this.element.innerText = this.text();
180
+ }
181
+ }
182
+ }
183
+
184
+ [
185
+ 'fill',
186
+ 'stroke',
187
+ 'lineWidth',
188
+ 'strokeFirst',
189
+ 'lineCap',
190
+ 'lineJoin',
191
+ 'lineDash',
192
+ 'lineDashOffset',
193
+ ].forEach(prop => {
194
+ (TxtLeaf.prototype as any)[`get${capitalize(prop)}`] = function (
195
+ this: TxtLeaf,
196
+ ) {
197
+ return (
198
+ (this.parentTxt() as any)?.[prop]() ??
199
+ (this as any)[prop].context.getInitial()
200
+ );
201
+ };
202
+ });
@@ -0,0 +1,198 @@
1
+ import {
2
+ BBox,
3
+ DependencyContext,
4
+ PlaybackState,
5
+ SerializedVector2,
6
+ SignalValue,
7
+ SimpleSignal,
8
+ viaProxy,
9
+ } from '@revideo/core';
10
+ import {computed, initial, nodeName, signal} from '../decorators';
11
+ import {DesiredLength} from '../partials';
12
+ import {drawImage} from '../utils';
13
+ import {Media, MediaProps} from './Media';
14
+
15
+ export interface VideoProps extends MediaProps {
16
+ /**
17
+ * {@inheritDoc Video.alpha}
18
+ */
19
+ alpha?: SignalValue<number>;
20
+ /**
21
+ * {@inheritDoc Video.smoothing}
22
+ */
23
+ smoothing?: SignalValue<boolean>;
24
+ }
25
+
26
+ @nodeName('Video')
27
+ export class Video extends Media {
28
+ /**
29
+ * The alpha value of this video.
30
+ *
31
+ * @remarks
32
+ * Unlike opacity, the alpha value affects only the video itself, leaving the
33
+ * fill, stroke, and children intact.
34
+ */
35
+ @initial(1)
36
+ @signal()
37
+ public declare readonly alpha: SimpleSignal<number, this>;
38
+
39
+ /**
40
+ * Whether the video should be smoothed.
41
+ *
42
+ * @remarks
43
+ * When disabled, the video will be scaled using the nearest neighbor
44
+ * interpolation with no smoothing. The resulting video will appear pixelated.
45
+ *
46
+ * @defaultValue true
47
+ */
48
+ @initial(true)
49
+ @signal()
50
+ public declare readonly smoothing: SimpleSignal<boolean, this>;
51
+
52
+ private static readonly pool: Record<string, HTMLVideoElement> = {};
53
+
54
+ public constructor(props: VideoProps) {
55
+ super(props);
56
+ }
57
+
58
+ protected override desiredSize(): SerializedVector2<DesiredLength> {
59
+ const custom = super.desiredSize();
60
+ if (custom.x === null && custom.y === null) {
61
+ const image = this.video();
62
+ return {
63
+ x: image.videoWidth,
64
+ y: image.videoHeight,
65
+ };
66
+ }
67
+
68
+ return custom;
69
+ }
70
+
71
+ protected mediaElement(): HTMLVideoElement {
72
+ return this.video();
73
+ }
74
+
75
+ protected seekedMedia(): HTMLVideoElement {
76
+ return this.seekedVideo();
77
+ }
78
+
79
+ protected fastSeekedMedia(): HTMLVideoElement {
80
+ return this.fastSeekedVideo();
81
+ }
82
+
83
+ @computed()
84
+ private video(): HTMLVideoElement {
85
+ const src = viaProxy(this.src());
86
+ const key = `${this.key}/${src}`;
87
+ let video = Video.pool[key];
88
+ if (!video) {
89
+ video = document.createElement('video');
90
+ video.crossOrigin = 'anonymous';
91
+ video.src = src;
92
+ Video.pool[key] = video;
93
+ }
94
+
95
+ if (video.readyState < 2) {
96
+ DependencyContext.collectPromise(
97
+ new Promise<void>(resolve => {
98
+ const listener = () => {
99
+ resolve();
100
+ video.removeEventListener('canplay', listener);
101
+ };
102
+ video.addEventListener('canplay', listener);
103
+ }),
104
+ );
105
+ }
106
+
107
+ return video;
108
+ }
109
+
110
+ @computed()
111
+ protected seekedVideo(): HTMLVideoElement {
112
+ const video = this.video();
113
+ const time = this.clampTime(this.time());
114
+
115
+ video.playbackRate = this.playbackRate();
116
+
117
+ if (!video.paused) {
118
+ video.pause();
119
+ }
120
+
121
+ if (this.lastTime === time) {
122
+ return video;
123
+ }
124
+
125
+ this.setCurrentTime(time);
126
+
127
+ return video;
128
+ }
129
+
130
+ @computed()
131
+ protected fastSeekedVideo(): HTMLVideoElement {
132
+ const video = this.video();
133
+ const time = this.clampTime(this.time());
134
+
135
+ video.playbackRate = this.playbackRate();
136
+
137
+ if (this.lastTime === time) {
138
+ return video;
139
+ }
140
+
141
+ const playing =
142
+ this.playing() && time < video.duration && video.playbackRate > 0;
143
+ if (playing) {
144
+ if (video.paused) {
145
+ DependencyContext.collectPromise(video.play());
146
+ }
147
+ } else {
148
+ if (!video.paused) {
149
+ video.pause();
150
+ }
151
+ }
152
+
153
+ if (Math.abs(video.currentTime - time) > 0.3) {
154
+ this.setCurrentTime(time);
155
+ } else if (!playing) {
156
+ video.currentTime = time;
157
+ }
158
+
159
+ return video;
160
+ }
161
+
162
+ protected override draw(context: CanvasRenderingContext2D) {
163
+ this.drawShape(context);
164
+ const alpha = this.alpha();
165
+ if (alpha > 0) {
166
+ const playbackState = this.view().playbackState();
167
+ const video =
168
+ playbackState === PlaybackState.Playing ||
169
+ playbackState === PlaybackState.Presenting
170
+ ? this.fastSeekedVideo()
171
+ : this.seekedVideo();
172
+
173
+ const box = BBox.fromSizeCentered(this.computedSize());
174
+ context.save();
175
+ context.clip(this.getPath());
176
+ if (alpha < 1) {
177
+ context.globalAlpha *= alpha;
178
+ }
179
+ context.imageSmoothingEnabled = this.smoothing();
180
+ drawImage(context, video, box);
181
+ context.restore();
182
+ }
183
+
184
+ if (this.clip()) {
185
+ context.clip(this.getPath());
186
+ }
187
+
188
+ this.drawChildren(context);
189
+ }
190
+
191
+ protected override applyFlex() {
192
+ super.applyFlex();
193
+ const video = this.video();
194
+ this.element.style.aspectRatio = (
195
+ this.ratio() ?? video.videoWidth / video.videoHeight
196
+ ).toString();
197
+ }
198
+ }
@@ -0,0 +1,90 @@
1
+ import {PlaybackState, SimpleSignal, lazy} from '@revideo/core';
2
+ import {initial, signal} from '../decorators';
3
+ import {nodeName} from '../decorators/nodeName';
4
+ import {useScene2D} from '../scenes/useScene2D';
5
+ import type {Node} from './Node';
6
+ import {Rect, RectProps} from './Rect';
7
+
8
+ export interface View2DProps extends RectProps {
9
+ assetHash: string;
10
+ }
11
+
12
+ @nodeName('View2D')
13
+ export class View2D extends Rect {
14
+ @lazy(() => {
15
+ const frameID = 'revideo-2d-frame';
16
+ let frame = document.querySelector<HTMLDivElement>(`#${frameID}`);
17
+ if (!frame) {
18
+ frame = document.createElement('div');
19
+ frame.id = frameID;
20
+ frame.style.position = 'absolute';
21
+ frame.style.pointerEvents = 'none';
22
+ frame.style.top = '0';
23
+ frame.style.left = '0';
24
+ frame.style.opacity = '0';
25
+ frame.style.overflow = 'hidden';
26
+ document.body.prepend(frame);
27
+ }
28
+ return frame.shadowRoot ?? frame.attachShadow({mode: 'open'});
29
+ })
30
+ public static shadowRoot: ShadowRoot;
31
+
32
+ @initial(PlaybackState.Paused)
33
+ @signal()
34
+ public declare readonly playbackState: SimpleSignal<PlaybackState, this>;
35
+
36
+ @initial(0)
37
+ @signal()
38
+ public declare readonly globalTime: SimpleSignal<number, this>;
39
+
40
+ @signal()
41
+ public declare readonly assetHash: SimpleSignal<string, this>;
42
+
43
+ public constructor(props: View2DProps) {
44
+ super({
45
+ composite: true,
46
+ fontFamily: 'Roboto',
47
+ fontSize: 48,
48
+ lineHeight: '120%',
49
+ textWrap: false,
50
+ fontStyle: 'normal',
51
+ ...props,
52
+ });
53
+ this.view2D = this;
54
+
55
+ View2D.shadowRoot.append(this.element);
56
+ this.applyFlex();
57
+ }
58
+
59
+ public override dispose() {
60
+ this.removeChildren();
61
+ super.dispose();
62
+ }
63
+
64
+ public override render(context: CanvasRenderingContext2D) {
65
+ this.computedSize();
66
+ this.computedPosition();
67
+ super.render(context);
68
+ }
69
+
70
+ /**
71
+ * Find a node by its key.
72
+ *
73
+ * @param key - The key of the node.
74
+ */
75
+ public findKey<T extends Node = Node>(key: string): T | null {
76
+ return (useScene2D().getNode(key) as T) ?? null;
77
+ }
78
+
79
+ protected override requestLayoutUpdate() {
80
+ this.updateLayout();
81
+ }
82
+
83
+ protected override requestFontUpdate() {
84
+ this.applyFont();
85
+ }
86
+
87
+ public override view(): View2D {
88
+ return this;
89
+ }
90
+ }
@@ -0,0 +1,17 @@
1
+ The image won't be visible unless you specify a source:
2
+
3
+ ```tsx
4
+ import myImage from './example.png';
5
+ // ...
6
+ <Img src={myImage} />;
7
+ ```
8
+
9
+ If you did this intentionally, and don't want to see this warning, set the `src`
10
+ property to `null`:
11
+
12
+ ```tsx
13
+ <Img src={null} />
14
+ ```
15
+
16
+ [Learn more](https://motioncanvas.io/docs/media#images) about working with
17
+ images.