Spaces:
Sleeping
Sleeping
| import {makeScene2D} from '@motion-canvas/2d'; | |
| import { | |
| Node, | |
| Rect, | |
| Layout, | |
| LayoutProps, | |
| } from '@motion-canvas/2d/lib/components'; | |
| import {all, loop} from '@motion-canvas/core/lib/flow'; | |
| import {createRef, range} from '@motion-canvas/core/lib/utils'; | |
| import {linear} from '@motion-canvas/core/lib/tweening'; | |
| const YELLOW = '#FFC66D'; | |
| const RED = '#FF6470'; | |
| const GREEN = '#99C47A'; | |
| const BLUE = '#68ABDF'; | |
| const Trail = (props: LayoutProps) => ( | |
| <Layout layout direction={'column'} gap={30} offsetY={-1} {...props} /> | |
| ); | |
| export default makeScene2D(function* (view) { | |
| view.fill('black'); | |
| const star = createRef<Node>(); | |
| const trail1 = createRef<Layout>(); | |
| const trail2 = createRef<Layout>(); | |
| const trail3 = createRef<Layout>(); | |
| const dot = createRef<Rect>(); | |
| view.add( | |
| <> | |
| <Node rotation={-45} position={44} scale={0.8} cache> | |
| <Node cache y={-270}> | |
| <Trail ref={trail1}> | |
| {range(3).map(_ => ( | |
| <Rect width={40} radius={20} height={120} fill={YELLOW} /> | |
| ))} | |
| </Trail> | |
| <Rect | |
| width={40} | |
| radius={20} | |
| height={270} | |
| fill={'white'} | |
| offsetY={-1} | |
| compositeOperation={'destination-in'} | |
| /> | |
| </Node> | |
| <Node cache x={-70} y={-200}> | |
| <Trail ref={trail2}> | |
| {range(3).map(_ => ( | |
| <Rect width={40} height={120} radius={20} fill={RED} /> | |
| ))} | |
| </Trail> | |
| <Rect | |
| width={40} | |
| radius={20} | |
| height={180} | |
| fill={'white'} | |
| offsetY={-1} | |
| compositeOperation={'destination-in'} | |
| /> | |
| </Node> | |
| <Node cache x={70} y={-300}> | |
| <Trail ref={trail3}> | |
| {range(4).map(i => ( | |
| <Rect | |
| ref={i === 1 ? dot : undefined} | |
| width={40} | |
| radius={20} | |
| height={100} | |
| fill={i === 0 ? GREEN : BLUE} | |
| offsetY={1} | |
| /> | |
| ))} | |
| </Trail> | |
| <Rect | |
| width={40} | |
| radius={20} | |
| height={220} | |
| fill={'white'} | |
| offsetY={-1} | |
| y={60} | |
| compositeOperation={'destination-in'} | |
| /> | |
| </Node> | |
| <Node ref={star}> | |
| {range(5).map(i => ( | |
| <Rect | |
| width={100} | |
| radius={50} | |
| height={150} | |
| fill={'white'} | |
| offsetY={1} | |
| rotation={(360 / 5) * i} | |
| compositeOperation={'destination-out'} | |
| /> | |
| ))} | |
| {range(5).map(i => ( | |
| <Rect | |
| width={40} | |
| radius={20} | |
| height={120} | |
| fill={'white'} | |
| offsetY={1} | |
| rotation={(360 / 5) * i} | |
| /> | |
| ))} | |
| </Node> | |
| </Node> | |
| </>, | |
| ); | |
| yield* all( | |
| star().rotation(360, 4, linear), | |
| loop(4, function* () { | |
| yield* trail1().position.y(-150, 1, linear); | |
| trail1().position.y(0); | |
| }), | |
| loop(2, function* () { | |
| yield* trail2().position.y(-150, 2, linear); | |
| trail2().position.y(0); | |
| }), | |
| loop(2, function* () { | |
| yield* all( | |
| trail3().position.y(-130, 2, linear), | |
| dot().fill(GREEN, 2, linear), | |
| ); | |
| dot().fill(BLUE); | |
| trail3().position.y(0); | |
| }), | |
| ); | |
| }); |