import { Img, Rect, Node, Video, makeScene2D, Txt, Line, LineSegment, } from "@motion-canvas/2d"; import { Direction, beginSlide, createRef, map, slideTransition, tween, all, waitFor, } from "@motion-canvas/core"; import { CodeBlock } from "@motion-canvas/2d/lib/components/CodeBlock"; import { theme } from "../theme"; const fibonacciFn = (n: number): number => { if (n <= 2) { return 1; } return fibonacciFn(n - 1) + fibonacciFn(n - 2); }; const fibonacci = ` const fibonacci = (n: number): number => { if (n <= 2) { return 1; } return fibonacci(n - 1) + fibonacci(n - 2); }; ` .split("\n") .filter((x) => x.trim()) .join("\n"); export default makeScene2D(function* (view) { const block = createRef(); const node = createRef(); const rect = createRef(); const boxMoji = createRef(); const inSegment = createRef(); const outSegment = createRef(); const input = createRef(); const output = createRef(); yield* view.add( <> 😴 , ); yield boxMoji().position(rect().middle()); yield* slideTransition(Direction.Left); yield* beginSlide("Black Box"); const padding = 100; const left = rect().left(); const right = rect().right(); yield* all( inSegment().points([left.addX(-padding), left], 0.5), outSegment().points([right, right.addX(padding)], 0.5), ); yield input().position(left.addX(-padding)); yield output().position(right); for (const i of [1, 2, 3]) { yield* all( input().opacity(1, 0.5), input().text(i.toString(), 0.5), input().position(left.addX(-padding - 20), 0.5), ); yield* beginSlide("Input " + i); yield* input().position(left, 0.5); yield* all(input().opacity(0, 0.2), boxMoji().text("👷‍♀️⚙️", 0.2)); yield* waitFor(0.5); const result = fibonacciFn(i); yield* all( output().opacity(1, 0.5), output().text(result.toString(), 0.5), output().position(right, 0.5), ); yield* all(boxMoji().text("😴", 0.2)); yield* beginSlide("Output " + i); } yield* all( boxMoji().opacity(0, 0.2), block().fontSize(30, 1), node().opacity(1, 1), ); yield* beginSlide("Revealing"); });