{"_id":"@agarwal29796/manim-js","_rev":"4-8b703e09ac79d03b8667bbd4377ce03a","name":"@agarwal29796/manim-js","dist-tags":{"latest":"0.3.1"},"versions":{"0.1.0":{"name":"@agarwal29796/manim-js","version":"0.1.0","keywords":["animation","manim","motion-graphics","canvas","svg","math","education","explainer","timeline","whiteboard"],"author":{"name":"Archit Agarwal","email":"archit@mirelz.com"},"license":"Apache-2.0","_id":"@agarwal29796/manim-js@0.1.0","maintainers":[{"name":"agarwal29796","email":"archit29796@gmail.com"}],"homepage":"https://github.com/agarwal29796/manim-js#readme","bugs":{"url":"https://github.com/agarwal29796/manim-js/issues"},"dist":{"shasum":"6a449059e31b24329beb5d23e76182ade11350ff","tarball":"https://registry.npmjs.org/@agarwal29796/manim-js/-/manim-js-0.1.0.tgz","fileCount":19,"integrity":"sha512-EahIiM50TjuDMGugWe/iFQzmEXiNM4aANfVhyJVwWZxdHoQEj4viofa8M0Fd2rOluq52B3ZVB10dl5+FRH4HAA==","signatures":[{"sig":"MEYCIQCu8f83R7DbmICdOZBVPYbfu5oXzv+FP5r7Tl67ntBSjgIhAODsYsQvNyo0PZLPxoZli3sz5ddaAdWG2yFa3MNi91sv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208049},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./canvas":{"import":{"types":"./dist/canvas.d.ts","default":"./dist/canvas.js"},"require":{"types":"./dist/canvas.d.cts","default":"./dist/canvas.cjs"}},"./package.json":"./package.json"},"gitHead":"96c6d1ed18aec9dfdb2f07d40efc8da052e169f7","scripts":{"dev":"tsup --watch","lint":"biome check .","test":"vitest run","build":"tsup","format":"biome format --write .","studio":"npm run studio:bundle && python3 -m http.server -d studio 8123","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"biome check --write .","changeset":"changeset","typecheck":"tsc --noEmit","test:watch":"vitest","check:exports":"publint --strict && attw --pack . --profile node16","studio:bundle":"esbuild studio/main.ts --bundle --format=iife --outfile=studio/bundle.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"agarwal29796","email":"archit29796@gmail.com"},"repository":{"url":"git+https://github.com/agarwal29796/manim-js.git","type":"git"},"_npmVersion":"10.8.2","description":"Manim.js — a Manim-inspired, framework-agnostic animation engine for the web. Author scenes in code; render anywhere via a tiny Renderer interface.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","esbuild":"^0.24.0","publint":"^0.2.12","typescript":"^5.6.3","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.10","@arethetypeswrong/cli":"^0.18.3"},"_npmOperationalInternal":{"tmp":"tmp/manim-js_0.1.0_1782023286955_0.3565029398254833","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@agarwal29796/manim-js","version":"0.2.0","keywords":["animation","manim","motion-graphics","canvas","svg","math","education","explainer","timeline","whiteboard"],"author":{"name":"Archit Agarwal","email":"archit@mirelz.com"},"license":"Apache-2.0","_id":"@agarwal29796/manim-js@0.2.0","maintainers":[{"name":"agarwal29796","email":"archit29796@gmail.com"}],"homepage":"https://github.com/agarwal29796/manim-js#readme","bugs":{"url":"https://github.com/agarwal29796/manim-js/issues"},"dist":{"shasum":"406021096a2f3b05b6959f5467a165af18b9b46a","tarball":"https://registry.npmjs.org/@agarwal29796/manim-js/-/manim-js-0.2.0.tgz","fileCount":39,"integrity":"sha512-e4SFnf+e29/nuRW4jpJRwJOyckdmJ/OnzVDJuifQiwL99mjgzATBwQa0CnRGA/MScri72aTzKdN/Xzc+YRCQfw==","signatures":[{"sig":"MEUCIGHeGBlgE+qyYcnDU95T8qg3llqP6p5bRzJk2t2OkvYkAiEAq5beyqv4EqKVnaRcyshI/cVara+I7S8rmyOiNFcMYlw=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":497728},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tex":{"import":{"types":"./dist/tex.d.ts","default":"./dist/tex.js"},"require":{"types":"./dist/tex.d.cts","default":"./dist/tex.cjs"}},"./canvas":{"import":{"types":"./dist/canvas.d.ts","default":"./dist/canvas.js"},"require":{"types":"./dist/canvas.d.cts","default":"./dist/canvas.cjs"}},"./export":{"import":{"types":"./dist/export.d.ts","default":"./dist/export.js"},"require":{"types":"./dist/export.d.cts","default":"./dist/export.cjs"}},"./package.json":"./package.json"},"gitHead":"ce7a7b26484efaae73010bb932fb04a4738239c8","scripts":{"dev":"tsup --watch","lint":"biome check .","site":"npm run build:site && python3 -m http.server -d site 8125","test":"vitest run","build":"tsup","format":"biome format --write .","studio":"npm run studio:bundle && python3 -m http.server -d studio 8123","gallery":"npm run gallery:bundle && python3 -m http.server -d gallery 8124","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"biome check --write .","changeset":"changeset","typecheck":"tsc --noEmit","build:site":"npm run gallery:bundle && npm run studio:bundle && rm -rf site && mkdir -p site/studio && cp gallery/index.html gallery/bundle.js site/ && cp studio/index.html studio/bundle.js site/studio/","test:watch":"vitest","check:exports":"publint --strict && attw --pack . --profile node16","studio:bundle":"esbuild studio/main.ts --bundle --format=iife --outfile=studio/bundle.js","gallery:bundle":"esbuild gallery/main.ts --bundle --format=iife --outfile=gallery/bundle.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"agarwal29796","email":"archit29796@gmail.com"},"repository":{"url":"git+https://github.com/agarwal29796/manim-js.git","type":"git"},"_npmVersion":"10.8.2","description":"Manim.js — a Manim-inspired, framework-agnostic animation engine for the web. Author scenes in code; render anywhere via a tiny Renderer interface.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","esbuild":"^0.24.0","publint":"^0.2.12","mp4-muxer":"^5.1.3","typescript":"^5.6.3","mathjax-full":"^3.2.2","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.10","@arethetypeswrong/cli":"^0.18.3"},"peerDependencies":{"mp4-muxer":"^5.1.3","mathjax-full":"^3.2.2"},"peerDependenciesMeta":{"mp4-muxer":{"optional":true},"mathjax-full":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/manim-js_0.2.0_1782324187203_0.7554037792138721","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@agarwal29796/manim-js","version":"0.3.0","keywords":["animation","manim","motion-graphics","canvas","svg","math","education","explainer","timeline","whiteboard"],"author":{"name":"Archit Agarwal","email":"archit@mirelz.com"},"license":"Apache-2.0","_id":"@agarwal29796/manim-js@0.3.0","maintainers":[{"name":"agarwal29796","email":"archit29796@gmail.com"}],"homepage":"https://github.com/agarwal29796/manim-js#readme","bugs":{"url":"https://github.com/agarwal29796/manim-js/issues"},"dist":{"shasum":"d82f37e8cd49f1ca9484820df1d0a00652888ba3","tarball":"https://registry.npmjs.org/@agarwal29796/manim-js/-/manim-js-0.3.0.tgz","fileCount":37,"integrity":"sha512-bIuf2z+2jq5WDK0UkT8kTe0rMQFhXhaJKt8+VfnNAeOrtTGZW+Q4wJkmhg2nxp/Naw9GktF/NaYxNsyY2WmsZA==","signatures":[{"sig":"MEYCIQCbX+D06hsAihx6HoXppddhb/9NH0a+bY+lVJIJ2y99+AIhAIiRYgQbdY8nvB01+dzlqFcdxMrUIzc2q97RTpAs6mdS","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":772326},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tex":{"import":{"types":"./dist/tex.d.ts","default":"./dist/tex.js"},"require":{"types":"./dist/tex.d.cts","default":"./dist/tex.cjs"}},"./canvas":{"import":{"types":"./dist/canvas.d.ts","default":"./dist/canvas.js"},"require":{"types":"./dist/canvas.d.cts","default":"./dist/canvas.cjs"}},"./export":{"import":{"types":"./dist/export.d.ts","default":"./dist/export.js"},"require":{"types":"./dist/export.d.cts","default":"./dist/export.cjs"}},"./package.json":"./package.json"},"gitHead":"ce7a7b26484efaae73010bb932fb04a4738239c8","scripts":{"dev":"tsup --watch","lint":"biome check .","site":"npm run build:site && python3 -m http.server -d site 8125","test":"vitest run","build":"tsup","format":"biome format --write .","studio":"npm run studio:bundle && python3 -m http.server -d studio 8123","gallery":"npm run gallery:bundle && python3 -m http.server -d gallery 8124","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"biome check --write .","changeset":"changeset","typecheck":"tsc --noEmit","build:site":"npm run gallery:bundle && npm run studio:bundle && rm -rf site && mkdir -p site/studio && cp gallery/index.html gallery/bundle.js site/ && cp studio/index.html studio/bundle.js site/studio/","test:watch":"vitest","check:exports":"publint --strict && attw --pack . --profile node16","studio:bundle":"esbuild studio/main.ts --bundle --format=iife --outfile=studio/bundle.js","gallery:bundle":"esbuild gallery/main.ts --bundle --format=iife --outfile=gallery/bundle.js","prepublishOnly":"npm run build"},"_npmUser":{"name":"agarwal29796","email":"archit29796@gmail.com"},"repository":{"url":"git+https://github.com/agarwal29796/manim-js.git","type":"git"},"_npmVersion":"10.8.2","description":"Manim.js — a Manim-inspired, framework-agnostic animation engine for the web. Author scenes in code; render anywhere via a tiny Renderer interface.","directories":{},"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","esbuild":"^0.24.0","publint":"^0.2.12","mp4-muxer":"^5.1.3","typescript":"^5.6.3","mathjax-full":"^3.2.2","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.10","@arethetypeswrong/cli":"^0.18.3"},"peerDependencies":{"mp4-muxer":"^5.1.3","mathjax-full":"^3.2.2"},"peerDependenciesMeta":{"mp4-muxer":{"optional":true},"mathjax-full":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/manim-js_0.3.0_1783612018611_0.5053319316291658","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"_id":"@agarwal29796/manim-js@0.3.1","bugs":{"url":"https://github.com/agarwal29796/manim-js/issues"},"dist":{"shasum":"0918518683114abbdd3cc1cba8b10c3fc84ee5df","tarball":"https://registry.npmjs.org/@agarwal29796/manim-js/-/manim-js-0.3.1.tgz","fileCount":37,"integrity":"sha512-zCqHaEwNlXkuVH6GkAxyx4QGu3UtXzGszn3r8NENxsOfbhjSM2ot4Qbx/SYSceRHMlJhvb8NrA8wYoyE2gEkZA==","signatures":[{"sig":"MEUCIF5tyMJDZdRKhx5lYJXD8LhSkDdKdywHLp4lLK7rMfnQAiEAqQitkYaIHKYERy+pHXtVNQOZqXnzhNinSU8NKdAp+/Q=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQD5xeY2hTzf9H0VLRHQp3+LRSD1eJn9s09dXocsG1H/gQIgUODpGnYDuCG98rBRKlXMn0qVDrv40WryJIa6j1vx0C4="}],"unpackedSize":790908},"main":"./dist/index.cjs","name":"@agarwal29796/manim-js","type":"module","types":"./dist/index.d.ts","author":{"name":"Archit Agarwal","email":"archit@mirelz.com"},"module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/index.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/index.cjs"}},"./tex":{"import":{"types":"./dist/tex.d.ts","default":"./dist/tex.js"},"require":{"types":"./dist/tex.d.cts","default":"./dist/tex.cjs"}},"./canvas":{"import":{"types":"./dist/canvas.d.ts","default":"./dist/canvas.js"},"require":{"types":"./dist/canvas.d.cts","default":"./dist/canvas.cjs"}},"./export":{"import":{"types":"./dist/export.d.ts","default":"./dist/export.js"},"require":{"types":"./dist/export.d.cts","default":"./dist/export.cjs"}},"./package.json":"./package.json"},"gitHead":"3a2e1cc893c718d0d4434a21fcf8cff31be9c7e1","license":"Apache-2.0","scripts":{"dev":"tsup --watch","lint":"biome check .","site":"npm run build:site && python3 -m http.server -d site 8125","test":"vitest run","build":"tsup","format":"biome format --write .","studio":"npm run studio:bundle && python3 -m http.server -d studio 8123","gallery":"npm run gallery:bundle && python3 -m http.server -d gallery 8124","release":"npm run build && changeset publish","version":"changeset version","lint:fix":"biome check --write .","changeset":"changeset","typecheck":"tsc --noEmit","build:site":"npm run gallery:bundle && npm run studio:bundle && rm -rf site && mkdir -p site/studio && cp gallery/index.html gallery/bundle.js site/ && cp studio/index.html studio/bundle.js site/studio/","test:watch":"vitest","check:exports":"publint --strict && attw --pack . --profile node16","studio:bundle":"esbuild studio/main.ts --bundle --format=iife --outfile=studio/bundle.js","gallery:bundle":"esbuild gallery/main.ts --bundle --format=iife --outfile=gallery/bundle.js","prepublishOnly":"npm run build"},"version":"0.3.1","_npmUser":{"name":"agarwal29796","email":"archit29796@gmail.com"},"homepage":"https://github.com/agarwal29796/manim-js#readme","keywords":["animation","manim","motion-graphics","canvas","svg","math","education","explainer","timeline","whiteboard"],"repository":{"url":"git+https://github.com/agarwal29796/manim-js.git","type":"git"},"_npmVersion":"10.8.2","description":"Manim.js — a Manim-inspired, framework-agnostic animation engine for the web. Author scenes in code; render anywhere via a tiny Renderer interface.","directories":{},"maintainers":[{"name":"agarwal29796","email":"archit29796@gmail.com"}],"sideEffects":false,"_nodeVersion":"20.20.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","esbuild":"^0.24.0","publint":"^0.2.12","mp4-muxer":"^5.1.3","typescript":"^5.6.3","mathjax-full":"^3.2.2","@biomejs/biome":"^1.9.4","@changesets/cli":"^2.27.10","@arethetypeswrong/cli":"^0.18.3"},"peerDependencies":{"mp4-muxer":"^5.1.3","mathjax-full":"^3.2.2"},"peerDependenciesMeta":{"mp4-muxer":{"optional":true},"mathjax-full":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/manim-js_0.3.1_1789662028533_0.4483370168129488"}}},"time":{"created":"2026-06-21T06:28:06.766Z","modified":"2026-09-17T16:20:28.815Z","0.1.0":"2026-06-21T06:28:07.096Z","0.2.0":"2026-06-24T18:03:07.403Z","0.3.0":"2026-07-09T15:46:58.791Z","0.3.1":"2026-09-17T16:20:28.634Z"},"bugs":{"url":"https://github.com/agarwal29796/manim-js/issues"},"author":{"name":"Archit Agarwal","email":"archit@mirelz.com"},"license":"Apache-2.0","homepage":"https://github.com/agarwal29796/manim-js#readme","keywords":["animation","manim","motion-graphics","canvas","svg","math","education","explainer","timeline","whiteboard"],"repository":{"url":"git+https://github.com/agarwal29796/manim-js.git","type":"git"},"description":"Manim.js — a Manim-inspired, framework-agnostic animation engine for the web. Author scenes in code; render anywhere via a tiny Renderer interface.","maintainers":[{"name":"agarwal29796","email":"archit29796@gmail.com"}],"readme":"# Manim.js\n\n> **Manim-inspired, framework-agnostic animation engine for the web.**\n> Author scenes in code, compile them to a deterministic timeline, and render\n> anywhere through a tiny `Renderer` interface.\n\n[![npm](https://img.shields.io/npm/v/@agarwal29796/manim-js.svg)](https://www.npmjs.com/package/@agarwal29796/manim-js)\n[![license](https://img.shields.io/npm/l/@agarwal29796/manim-js.svg)](./LICENSE)\n\n**🔗 [Live examples & editor →](https://agarwal29796.github.io/manim-js/)**\n\n> Independent project inspired by [Manim](https://www.manim.community/); not\n> affiliated with or endorsed by the Manim Community.\n\n## Why\n\n- **Deterministic.** A scene compiles to a `Timeline` whose `sample(t)` is a\n  pure function of time. Scrubbing, seeking and frame-accurate export all just\n  work — no live state to unwind.\n- **Renderer-agnostic.** The engine (`core/`) has zero dependencies and never\n  touches a canvas. Pixels are someone else's job, behind a 2-method `Renderer`\n  interface. The package ships a Canvas2D renderer; embed your own to draw\n  through an existing pipeline.\n- **Real morphing.** Shapes are point sets, so `transform(circle, square)`\n  interpolates *any* pair of shapes by resampling to a common point count.\n\n## Install\n\n```bash\nnpm i @agarwal29796/manim-js\n```\n\n## Quick start\n\n```ts\nimport { Scene, circle, square, text, create, write, transform } from \"@agarwal29796/manim-js\";\nimport { CanvasRenderer, Player } from \"@agarwal29796/manim-js/canvas\";\n\nconst s = new Scene({ width: 1280, height: 720 });\nconst title = text(\"hello\", { y: -200, size: 80 });\nconst c = circle({ r: 120, stroke: \"#5B5BD6\" });\n\ns.play(write(title));\ns.play(create(c));\ns.play(transform(c, square({ size: 220, stroke: \"#FF6B5B\" })));\n\nconst timeline = s.compile();\nconst renderer = new CanvasRenderer(canvas.getContext(\"2d\")!);\nnew Player(timeline, renderer, 1280, 720).play();\n```\n\n## Authoring vocabulary\n\n`Scene.play(...anims, { run, ease })`, `Scene.wait(s)`, `Scene.seek(t)`, `Scene.add(...)`, `Scene.sound(...)`.\n\n- **Shapes:** `circle`, `square`, `rect` (rounded via `radius`), `polygon`, `line`, `functionGraph`, `numberLine`, `axes`, `text`, `texture`\n- **Animations:** `create`, `write`, `fadeIn`, `fadeOut`, `transform`, `shift`, `scaleBy`, `rotate`, `indicate`, `moveCamera`, `zoomCamera`\n- **Easing:** `linear`, `easeInOut`, `easeOut`, `easeIn`, `easeOutBack`, `thereAndBack`, `spring({ stiffness, damping, mass })`\n- **Style:** `stroke`, `fill`, `opacity`, `strokeWidth`, plus `gradient` (`linearGradient`/`radialGradient`), `shadow` (`softShadow`), `blur`, `blend`, `dash`; text `weight`/`italic`/`letterSpacing`/`lineHeight`\n\n## Two kinds of node, one interface\n\nEverything is a node behind one interface, so `fadeIn`/`shift`/`scale`/`transform` operate on all of them identically:\n\n- **Native (vector)** — shapes, text, LaTeX: geometry sampled at `t`, drawn by the renderer.\n- **Texture (raster)** — `texture(source)`: a rectangle whose *pixels* come from an outside renderer (image, video, rasterised HTML/PDF, webcam). A `TextureSource` gives `frameAt(t)` for live preview and an async `prepare(t)` so seekable sources (video, GIF) export frame-exact.\n\n## Scene IR — declare the objects, script the time\n\nThe serializable, versioned source of truth: id'd declarative `nodes` (what exists) + a scripted `ops` timeline (what happens). Op times can anchor to named **beats** that re-time the whole scene when moved.\n\n```ts\nimport { compileIR } from \"@agarwal29796/manim-js\";\nconst { timeline } = compileIR({\n  version: 1, width: 1280, height: 720,\n  beats: [{ name: \"reveal\", at: 1.5 }],\n  nodes: [\n    { id: \"tri\", type: \"polygon\", props: { points: [[-150,120],[150,120],[150,-80]], fill: \"#5B5BD6\" } },\n    { id: \"eq\",  type: \"text\",    props: { text: \"a²+b²=c²\", y: 240 } },\n  ],\n  ops: [\n    { anim: \"create\", target: \"tri\", at: 0, run: 1 },\n    { anim: \"write\",  target: \"eq\",  at: { beat: \"reveal\" }, run: 1 },\n  ],\n});\n```\n\nThe whiteboard round-trips `nodes` (drag `tri` → patch its props on that id); the AI writes `ops`; both edit one artifact. `serializeIR`/`parseIR`/`validateIR` and a `SceneBuilder` come along.\n\n## The seam (for custom renderers)\n\n```ts\ninterface Renderer {\n  clear(width: number, height: number): void;\n  draw(op: DrawOp): void; // DrawOp = PolyOp | TextOp\n}\n```\n\nThat is the *entire* public contract between engine and pixels. Implement it and\nthe engine runs unchanged. (This is how it renders natively inside other apps.)\n\n## Layout\n\n```\nsrc/core/     engine — mobjects, animations, scene/timeline, IR (zero deps)\nsrc/canvas/   reference Canvas2D renderer + rAF Player\nstudio/       browser playground (npm run studio)\n```\n\n## Develop\n\n```bash\nnpm install\nnpm run build           # tsup -> dist (ESM + CJS + .d.ts)\nnpm run studio          # bundle + serve the live-coding playground at :8123\nnpm test                # vitest\nnpm run check:exports   # publint + are-the-types-wrong\n```\n\n## Roadmap\n\n- [x] LaTeX `Write` — `@agarwal29796/manim-js/tex` (MathJax → SVG paths). `await initTex()`, then `tex(\"E=mc^2\")`.\n- [x] `axes()` / coordinate plane (with `c2p`/`p2c`/`plot`), `brace()`, `vector()`, `dot()`\n- [x] Easing `lag`/stagger in `play` (`play(..., { lag })` and `stagger([...])`)\n- [x] Camera moves — `moveCamera()` / `zoomCamera()`\n- [x] Frame-accurate MP4 export off the timeline — `@agarwal29796/manim-js/export` (`exportMP4`, WebCodecs)\n- [x] Rich style — gradients, shadows, blur, blend, rounded corners, typography, alpha colours\n- [x] Spring easing (`spring()`)\n- [x] Texture (raster) nodes behind the same interface (`texture()`), with exact-seek export\n- [x] Serializable, versioned scene IR (`compileIR`) with re-anchorable **beats**\n- [x] Audio as a first-class timeline citizen (`Scene.sound()`), muxed on export\n- [x] Motion blur / temporal AA + any-resolution export (`subFrames`, `scale`)\n- [ ] More mobjects (matrices, tables), 3D\n\n### Subpath entry points\n\n| Import | What | Extra dep |\n|---|---|---|\n| `@agarwal29796/manim-js` | core engine (scenes, mobjects, animations) | none |\n| `@agarwal29796/manim-js/canvas` | reference Canvas2D renderer + `Player` | none |\n| `@agarwal29796/manim-js/tex` | `initTex`, `tex`, `texGroup` (animated LaTeX) | `mathjax-full` |\n| `@agarwal29796/manim-js/export` | `exportMP4`, `exportFrames` (MP4 off the timeline) | `mp4-muxer` |\n\nThe two heavy deps are **optional peers** — only installed if you use those subpaths; the core stays dependency-free.\n\n## License\n\n[Apache-2.0](./LICENSE) © Archit Agarwal\n","readmeFilename":"README.md"}