Getting Started

Installation

If you haven't already, install the Dart SDK (tutorial).
You will also need to have LATXE\LaTeX and Git installed.

Then, you can install the ManimWeb CLI with:

pub global activate manim_web

That's it, the Manim Web CLI is installed.

⚠️

If the command's output tells you need to add a folder to your PATH environment variable, you'll need to do it.

For example, with linux/macos it's:

export PATH="$PATH":"$HOME/.pub-cache/bin"

Creating the project

You can use either the manimweb command or the manim_web command: they're the same.

Create a project with the default template with:

manimweb init --directory {directory}

Replace {directory} with the name of the directory to create. Make sure the directory is empty or doesn't exist.

Then go to the directory ( cd {directory} ).

First scene with Manim Web

You can open the src/example.dart in your favorite text editor. Visual Studio Code with the Dart extension works really well.

Copy and paste the code below.

import 'package:manim_web/manim.dart';

class ExampleScene extends Scene {
  @override
  FutureOr<void> preload() {
    Tex.preload('Hello World!');
  }

  @override
  FutureOr<void> construct() async {
    var tex = Tex('Hello World!');

    tex.scaleUniformly(4);

    await play(FadeIn(tex));
  }
}

You can then start the dev server with:

manimweb dev --file src/example.dart --html src/example.html

The server should be running on localhost:8080

How it works

import 'package:manim_web/manim.dart';

...

On line 1, you import the whole Manim Web library. It allows you to use Scene, Tex, FadeIn.

import 'package:manim_web/manim.dart';

class ExampleScene extends Scene {
  @override
  FutureOr<void> preload() {
    Tex.preload('Hello World!');
  }

  @override
  FutureOr<void> construct() async {
    var tex = Tex('Hello World!');

    tex.scaleUniformly(4);

    await play(FadeIn(tex));
  }
}

On line 3, you create a scene: ExampleScene.

Then, you define two methods: preload and construct on lines 5 and 10. Both methods return a FutureOr<void> which is either a Future (asynchronous result) or of type void. The construct method is also async, it allows you to use the await keyword later.

The construct method

First, look at the construct method's body:

var tex = Tex('Hello World!');

tex.scaleUniformly(4);

await play(FadeIn(tex));

You first create some text "Hello World!".

💡

The Tex class is a Mobject. Here, it represents text generated with LATXE\LaTeX. You can also use math formulas with MathTex.

var tex = Tex('Hello World!');

tex.scaleUniformly(4);

await play(FadeIn(tex));

Then, the tex is scaled by 4 uniformly.

💡

You can also scale differently along the x and y-axis with the scale method.

var tex = Tex('Hello World!');

tex.scaleUniformly(4);

await play(FadeIn(tex));

Finally, the animation part:

You start by creating a new Animation. It's a FadeIn animation.

💡
There are a lot more: FadeOut, ShowCreation...

Then, you play the animation with the play method. The play method is part of the Scene, so you could also write:

await this.play(FadeIn(tex));

With the this keyword referring to the scene.

Also, you use await to wait for the scene to play the animation.

Now, you should know how the construct method works.

The preload method

When running your animation, your browser can't use LATXE\LaTeX to generate the needed Math formulas and texts. You need to preload the results.

The preload method is used for that, it doesn't run in your browser but manimweb runs it internally. It tells which text and formulas need to be preloaded.

In this method, there is only one line:

Tex.preload('Hello World!');

You tell ManimWeb you will use Tex with the "Hello World!" text. Then, ManimWeb will run LATXE\LaTeX to generate the "Hello World!" text.

Mobjects

In ManimWeb, every element displayed is a Mobject.

Tex is a Mobject, but it's not the only one. There are many more mobjects: MathTex, Circle, Square, Axes, Arrow, Dot, Group, NumberPlane, SVGMobject...

But, Mobject can't be rendered, they're only used as a container. VMobject is an extension of Mobject which can be rendered. It's what most mobjects use.

Animations

When using the play method, you used the FadeIn animation. Every animation extends from Animation.

You can play many animations at once with the playMany method. Instead of giving a single animation, you use a list of animations. Then, all the animations will be played simultaneously.

If you want to delay the animations, you can use an AnimationGroup with the lagRatio argument. Like this:

var square1 = Square();
var square2 = Square();

square1.shift(RIGHT);
square2.shift(RIGHT);

await play(
  AnimationGroup(
    [
      FadeIn(square1),
      FadeIn(square2),
    ],
    lagRatio: 0.02,
  ),
);