├── .config ├── eslint.mjs ├── tsconfig.json └── tsconfig.tests.json ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── feature_request.md ├── actions │ └── changed_files │ │ └── action.yml └── workflows │ ├── linter.yml │ ├── publish.yml │ └── tests.yml ├── .gitignore ├── .markdownlint.jsonc ├── .vscode ├── extensions.json ├── launch.json ├── settings.json └── tasks.json ├── .vscodeignore ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE.txt ├── README.md ├── assets ├── manim-notebook-logo.png └── walkthrough │ ├── commands.svg │ ├── manim-installation.md │ ├── preview-cell.svg │ ├── sample_scene.py │ ├── settings.svg │ ├── shortcuts.svg │ └── wiki.svg ├── esbuild.js ├── package-lock.json ├── package.json ├── src ├── export.ts ├── extension.ts ├── logger.ts ├── manimCell.ts ├── manimShell.ts ├── manimVersion.ts ├── patches │ ├── applyPatches.ts │ └── install_windows_paste_patch.py ├── previewCode.ts ├── pythonParsing.ts ├── startStopScene.ts ├── utils │ ├── fileUtil.ts │ ├── multiStepQuickPickUtil.ts │ ├── terminal.ts │ ├── testing.ts │ └── venv.ts └── walkthrough.ts └── tests ├── activation.test.ts ├── cellRanges.test.ts ├── fixtures ├── basic.py ├── crazy.py ├── detection_basic.py ├── detection_class_definition.py ├── detection_inside_construct.py ├── detection_multiple_inheritance.py ├── detection_multiple_methods.py ├── detection_syntax.py └── laggy.py ├── main.ts ├── preview.test.ts ├── scripts └── setTestEntryPoint.js └── utils ├── editor.ts ├── installManim.ts ├── manimCaller.ts ├── manimInstaller.ts ├── prototype.ts ├── terminal.ts └── testRunner.ts /.config/eslint.mjs: -------------------------------------------------------------------------------- 1 | import parserTs from "@typescript-eslint/parser"; 2 | import stylistic from "@stylistic/eslint-plugin"; 3 | import globals from "globals"; 4 | 5 | export default [ 6 | { 7 | // Globally ignore the following paths 8 | ignores: [ 9 | "node_modules/", 10 | ], 11 | }, 12 | { 13 | files: ["**/*.ts", "**/*.js", "**/*.mjs"], 14 | plugins: { 15 | "@stylistic": stylistic, 16 | }, 17 | rules: { 18 | ...stylistic.configs.customize({ 19 | "indent": 2, 20 | "jsx": false, 21 | "quote-props": "always", 22 | "semi": true, 23 | }).rules, 24 | "@stylistic/brace-style": ["error", "1tbs"], 25 | "@stylistic/max-len": ["error", { 26 | code: 100, comments: 80, ignoreUrls: true, ignoreRegExpLiterals: true }], 27 | "@stylistic/quotes": ["error", "double", { avoidEscape: true }], 28 | "no-unused-vars": ["warn", { argsIgnorePattern: "^_" }], 29 | }, 30 | languageOptions: { 31 | ecmaVersion: "latest", 32 | parser: parserTs, 33 | sourceType: "module", 34 | globals: { 35 | ...globals.node, 36 | }, 37 | }, 38 | }, 39 | ]; 40 | -------------------------------------------------------------------------------- /.config/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "module": "nodenext", 4 | "target": "ES2024", 5 | "lib": [ 6 | "ES2024" 7 | ], 8 | "sourceMap": true, 9 | "strict": true, 10 | "noFallthroughCasesInSwitch": true, 11 | "removeComments": true, 12 | "outDir": "../out/", 13 | "rootDir": "../" 14 | }, 15 | "include": [ 16 | "../src/**/*.ts", 17 | ], 18 | } -------------------------------------------------------------------------------- /.config/tsconfig.tests.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "include": [ 4 | "../tests/**/*.ts", 5 | ], 6 | } -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: When you encounter bugs related to the extension 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 12 | 13 | 14 | Make sure you have the latest [Manim release](https://github.com/3b1b/manim/releases) installed or a commit from the [Manim `master` branch](https://github.com/3b1b/manim) that is even newer. Some system information is recorded in the log file, see down below. 15 | 16 | ## ⭕ Description 17 | 18 | - Be clear and concise and describe what is not working for you in proper English sentences. 19 | - Hopefully, you can reproduce your issue in a reliable way. If this is the case, note down the steps here. 20 | - What is the expected behavior? 21 | - If you want to cut turnaround times, please provide a screen recording for us to better understand what you mean. 22 | 23 | ## 🧾 Logs 24 | 25 | Please always attach a log file even if you cannot reproduce an error since the log will include some information about your system like the Manim Notebook version you're using. It takes just a few clicks to create a log file, see the [Wiki here](https://github.com/Manim-Notebook/manim-notebook/wiki/%F0%9F%A4%A2-Troubleshooting#-record-log-file). Then just drag and drop the file here. 26 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for a new Manim Notebook feature 4 | title: '' 5 | labels: feature request 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | 12 | 13 | 14 | ## 🎈 Motivation 15 | 16 | Thanks for proposing a new feature to Manim Notebook. Before describing the feature, we need to know *what problem* it solves in the first place. Don't shy away from giving context and background information. What is the current state that you don't like and why? Maybe even include some code snippets or a screen recording. 17 | 18 | ## 💠 Feature 19 | 20 | Now, how could a new feature solve this? How would it look like? Be as precise as possible. Maybe even include some UI mockup? 21 | 22 | ## ♻ Workaround 23 | 24 | Maybe you found an alternative way to solve your problem in the meantime. Describe it here such that other users can profit from it until we might implement your desired feature. 25 | 26 | 27 | -------------------------------------------------------------------------------- /.github/actions/changed_files/action.yml: -------------------------------------------------------------------------------- 1 | # Why is this file in a subdirectory? Because GitHub Actions requires it to be :( 2 | # see: https://github.com/orgs/community/discussions/26245#discussioncomment-5962450 3 | name: "Get changed files" 4 | description: "Checks out the code and returns the filenames of files that have changed in the pull request" 5 | 6 | inputs: 7 | file-extensions: 8 | # for example: "\.rb$" or something like "\.js$|\.js.erb$" 9 | description: "Regex expressions for grep to filter for specific files" 10 | required: true 11 | 12 | outputs: 13 | changed-files: 14 | description: "A space-separated list of the files that have changed in the pull request" 15 | value: ${{ steps.get-changed-files.outputs.files }} 16 | 17 | runs: 18 | using: "composite" 19 | steps: 20 | # This has to be done in the main workflow, not in the action, because 21 | # otherwise this reusable action is not available in the workflow. 22 | # - name: "Checkout code (on a PR branch)" 23 | # uses: actions/checkout@v4 24 | # with: 25 | # fetch-depth: 2 # to also fetch parent of PR 26 | 27 | # Adapted from this great comment [1]. Git diff adapted from [2]. 28 | # "|| test $? = 1;" is used to ignore the exit code of grep when no files 29 | # are found matching the pattern. For the "three dots" ... syntax, see [3]. 30 | # 31 | # Resources: 32 | # number [1] being most important 33 | # [1] https://github.com/actions/checkout/issues/520#issuecomment-1167205721 34 | # [2] https://robertfaldo.medium.com/commands-to-run-rubocop-and-specs-you-changed-in-your-branch-e6d2f2e4110b 35 | # [3] https://community.atlassian.com/t5/Bitbucket-questions/Git-diff-show-different-files-than-PR-Pull-Request/qaq-p/2331786 36 | - name: Get changed files 37 | shell: bash 38 | id: get-changed-files 39 | run: | 40 | files_pretty=$(git diff --name-only --diff-filter=ACMR -r HEAD^1...HEAD | egrep '${{inputs.file-extensions}}' || test $? = 1;) 41 | printf "🎴 Changed files: \n$files_pretty" 42 | echo "files=$(echo ${files_pretty} | xargs)" >> $GITHUB_OUTPUT 43 | -------------------------------------------------------------------------------- /.github/workflows/linter.yml: -------------------------------------------------------------------------------- 1 | name: Linting 2 | 3 | # Trigger each time HEAD branch is updated in a pull request 4 | # see https://github.com/orgs/community/discussions/26366 5 | on: 6 | pull_request: 7 | types: [opened, reopened, synchronize, ready_for_review] 8 | 9 | jobs: 10 | 11 | eslint: 12 | name: ESLint (JS) 13 | runs-on: ubuntu-latest 14 | steps: 15 | - name: Checkout code 16 | uses: actions/checkout@v4 17 | with: 18 | fetch-depth: 2 # to also fetch parent of PR (used to get changed files) 19 | 20 | - name: Get changed files 21 | id: ts-changed 22 | uses: ./.github/actions/changed_files/ 23 | with: 24 | file-extensions: \.js$|\.mjs$|\.ts$ 25 | 26 | - name: Setup Node.js 27 | if: ${{ steps.ts-changed.outputs.changed-files != ''}} 28 | uses: actions/setup-node@v4 29 | with: 30 | node-version: '20' # End of Life (EOL): April 2026 31 | cache: 'npm' 32 | 33 | - name: Install dependencies 34 | if: ${{ steps.ts-changed.outputs.changed-files != ''}} 35 | run: npm install 36 | 37 | # with ESLint v9 --ignore-path does not exist anymore 38 | # see [1] for the PR. However, my feeling for this is totally reflected 39 | # by [2]. Hopefully, it will come back in future versions. 40 | # [1] https://github.com/eslint/eslint/pull/16355 41 | # [2] https://github.com/eslint/eslint/issues/16264#issuecomment-1292858747 42 | - name: Run ESLint 43 | if: ${{ steps.ts-changed.outputs.changed-files != ''}} 44 | run: | 45 | echo "🚨 Running ESLint version: $(npx --quiet eslint --version)" 46 | npx eslint --config ./.config/eslint.mjs --max-warnings 0 --no-warn-ignored ${{ steps.ts-changed.outputs.changed-files }} 47 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | on: 2 | release: 3 | types: 4 | - created 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Checkout 11 | uses: actions/checkout@v4 12 | 13 | - name: Install Node.js 14 | uses: actions/setup-node@v4 15 | with: 16 | node-version: 22 17 | 18 | - name: Install dependencies 19 | run: npm install 20 | 21 | - name: Package extension 22 | run: npm run package-vsce 23 | 24 | - name: Upload VSIX artifact to GitHub Release notes 25 | if: startsWith(github.ref, 'refs/tags/') 26 | uses: actions/upload-artifact@v4 27 | with: 28 | name: manim-notebook.vsix 29 | path: manim-notebook-*.vsix 30 | if-no-files-found: error 31 | 32 | - name: Publish 33 | if: startsWith(github.ref, 'refs/tags/') 34 | run: npm run deploy 35 | env: 36 | VSCE_PAT: ${{ secrets.VSCE_PAT }} 37 | -------------------------------------------------------------------------------- /.github/workflows/tests.yml: -------------------------------------------------------------------------------- 1 | name: Testing 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | # Trigger each time HEAD branch is updated in a pull request 8 | # see https://github.com/orgs/community/discussions/26366 9 | pull_request: 10 | types: [opened, reopened, synchronize, ready_for_review] 11 | 12 | jobs: 13 | 14 | test: 15 | # Adapted from: 16 | # https://code.visualstudio.com/api/working-with-extensions/continuous-integration#github-actions 17 | name: Integration tests 18 | environment: testing 19 | 20 | strategy: 21 | fail-fast: false 22 | matrix: 23 | os: [macos-latest, ubuntu-latest, windows-latest] 24 | runs-on: ${{ matrix.os }} 25 | 26 | steps: 27 | - name: Checkout 28 | uses: actions/checkout@v4 29 | - name: Install Node.js 30 | uses: actions/setup-node@v4 31 | with: 32 | node-version: 22.x # LTS until Oct 2025 33 | - run: npm install 34 | - name: Setup Python 35 | uses: actions/setup-python@v5 36 | with: 37 | python-version: '3.13' # end of support: 2029-10 38 | # hopefully, this can be cached in the future 39 | # see: https://github.com/actions/setup-python/issues/991 40 | 41 | - name: Install Mesa (Linux) 42 | if: runner.os == 'Linux' 43 | run: | 44 | # Install OpenGL Mesa Utils 45 | # https://idroot.us/install-mesa-drivers-ubuntu-24-04/ 46 | sudo add-apt-repository ppa:kisak/kisak-mesa 47 | sudo apt-get update 48 | sudo apt-get install mesa-utils -y 49 | 50 | # Install Pango 51 | sudo apt-get install libpango1.0-dev -y 52 | 53 | # Work around 'NoneType' object has no attribute 'glGetError' 54 | # https://github.com/MPI-IS/mesh/issues/23#issuecomment-607784234 55 | sudo apt-get install python3-opengl 56 | 57 | # Install copy-paste mechanism to avoid ClipboardUnavailable errors 58 | # (python pyperclip makes use of xclip on Linux) 59 | sudo apt-get install xclip -y 60 | 61 | - name: Install Mesa (MinGW, Windows) 62 | if: runner.os == 'Windows' 63 | run: | 64 | # Install OpenGL pre-built Mesa binaries from mesa-dist-win 65 | Invoke-WebRequest -Uri https://github.com/pal1000/mesa-dist-win/releases/download/24.3.2/mesa3d-24.3.2-release-mingw.7z -OutFile mesa3d.7z 66 | 67 | # Extract (on purpose no space between -o and mesa3d) 68 | 7z x mesa3d.7z -omesa3d 69 | 70 | # Install system-wide (option 1: core desktop OpenGL drivers) 71 | .\mesa3d\systemwidedeploy.cmd 1 72 | 73 | - name: Test OpenGL 74 | run: | 75 | if [ "$RUNNER_OS" == "Linux" ]; then 76 | xvfb-run -a glxinfo | grep "OpenGL version" 77 | elif [ "$RUNNER_OS" == "macOS" ]; then 78 | echo "We don't know a way to install the glxinfo command on macOS," 79 | echo "so we can't check the OpenGL version :(" 80 | elif [ "$RUNNER_OS" == "Windows" ]; then 81 | # Download wglinfo (analogous to glxinfo) 82 | curl -L -O https://github.com/gkv311/wglinfo/releases/latest/download/wglinfo64.exe 83 | chmod +x wglinfo64.exe 84 | ./wglinfo64.exe | grep "OpenGL version" 85 | else 86 | echo "Unknown OS" 87 | exit 1 88 | fi 89 | shell: bash 90 | 91 | - name: Install Manim (pretest) 92 | run: | 93 | if [ "$RUNNER_OS" == "Linux" ]; then 94 | xvfb-run -a npm run pretest 95 | else 96 | npm run pretest 97 | fi 98 | shell: bash 99 | 100 | - name: Run tests 101 | run: | 102 | if [ "$RUNNER_OS" == "Linux" ]; then 103 | # Start an X virtual framebuffer (Xvfb) server, which emulates a 104 | # display server without requiring a physical display. 105 | xvfb-run -a npm run test-without-pre-or-posttest 106 | else 107 | npm run test-without-pre-or-posttest 108 | fi 109 | shell: bash 110 | 111 | - name: Run posttest 112 | run: npm run posttest 113 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | tmp/ 2 | *.log 3 | *.mp4 4 | .DS_Store 5 | out 6 | out-test 7 | dist 8 | node_modules 9 | _debug_scenes/ 10 | .vscode-test/ 11 | *.vsix 12 | *.code-workspace 13 | *.pyc 14 | **/__pycache__/**/* 15 | -------------------------------------------------------------------------------- /.markdownlint.jsonc: -------------------------------------------------------------------------------- 1 | { 2 | "default": true, 3 | "MD033": false, // Inline HTML 4 | "MD041": false, // first line header 5 | "MD013": false // line length 6 | } -------------------------------------------------------------------------------- /.vscode/extensions.json: -------------------------------------------------------------------------------- 1 | { 2 | // See http://go.microsoft.com/fwlink/?LinkId=827846 3 | // for the documentation about the extensions.json format 4 | "recommendations": [ 5 | "dbaeumer.vscode-eslint", 6 | "streetsidesoftware.code-spell-checker", 7 | "connor4312.esbuild-problem-matchers" 8 | ] 9 | } 10 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | // A launch configuration that compiles the extension and then opens it inside a new window 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | { 6 | "version": "0.2.0", 7 | "configurations": [ 8 | { 9 | "name": "Run Extension", 10 | "type": "extensionHost", 11 | "request": "launch", 12 | "args": [ 13 | "--extensionDevelopmentPath=${workspaceFolder}" 14 | ], 15 | "outFiles": [ 16 | "${workspaceFolder}/dist/**/*.js" 17 | ], 18 | "preLaunchTask": "Watch (Default)", 19 | "sourceMaps": true 20 | }, 21 | { 22 | "name": "Test Extension", 23 | "type": "extensionHost", 24 | "request": "launch", 25 | "runtimeExecutable": "${execPath}", 26 | "args": [ 27 | "${workspaceFolder}/tests/fixtures", 28 | "--disable-extensions", 29 | "--extensionDevelopmentPath=${workspaceFolder}", 30 | "--extensionTestsPath=${workspaceFolder}/out-test/tests/utils/testRunner.js" 31 | ], 32 | "outFiles": [ 33 | "${workspaceFolder}/out-test/tests/**/*.js" 34 | ], 35 | "preLaunchTask": "Prepare For Tests", 36 | "sourceMaps": true, 37 | "env": { 38 | // also see tests/main.ts 39 | "IS_TESTING": "true", 40 | "TEST_BASE_PATH": "${workspaceFolder}" 41 | } 42 | } 43 | ] 44 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | ////////////////////////////////////// 3 | // Linting (TS with ESLint) 4 | ////////////////////////////////////// 5 | "editor.formatOnSave": false, // it still autosaves with the options below 6 | // https://eslint.style/guide/faq#how-to-auto-format-on-save 7 | // https://github.com/microsoft/vscode-eslint#settings-options 8 | "[typescript]": { 9 | "editor.formatOnSave": false, // to avoid formatting twice (ESLint + VSCode) 10 | "editor.defaultFormatter": "dbaeumer.vscode-eslint" 11 | }, 12 | "[javascript]": { 13 | "editor.formatOnSave": false, // to avoid formatting twice (ESLint + VSCode) 14 | "editor.defaultFormatter": "dbaeumer.vscode-eslint" 15 | }, 16 | "editor.codeActionsOnSave": { 17 | "source.fixAll.eslint": "explicit" 18 | }, 19 | // this disables VSCode built-in formatter (instead we want to use ESLint) 20 | "typescript.validate.enable": false, 21 | "javascript.validate.enable": false, 22 | "eslint.format.enable": true, // use ESLint as formatter 23 | "eslint.options": { 24 | "overrideConfigFile": ".config/eslint.mjs" 25 | }, 26 | ////////////////////////////////////// 27 | // TypeScript 28 | ////////////////////////////////////// 29 | // Turn off tsc task auto detection since we have the necessary tasks as npm scripts 30 | "typescript.tsc.autoDetect": "off", 31 | ////////////////////////////////////// 32 | // Files & Folders 33 | ////////////////////////////////////// 34 | "files.exclude": { 35 | "out": false, 36 | "node_modules": true, 37 | ".vscode-test": true 38 | }, 39 | "search.exclude": { 40 | "out": true // set this to false to include "out" folder in search results 41 | }, 42 | ////////////////////////////////////// 43 | // Testing 44 | ////////////////////////////////////// 45 | // https://github.com/microsoft/vscode-extension-test-runner/issues/57 46 | // "extension-test-runner.debugOptions": { 47 | // "preLaunchTask": "Watch test files" 48 | // }, 49 | ////////////////////////////////////// 50 | // Editor 51 | ////////////////////////////////////// 52 | "editor.indentSize": 2, 53 | "editor.tabSize": 2, 54 | "[python]": { 55 | "editor.indentSize": 4, 56 | "editor.tabSize": 4 57 | }, 58 | "editor.insertSpaces": true, 59 | "editor.detectIndentation": false, 60 | "editor.renderFinalNewline": "on", 61 | "editor.wordWrap": "wordWrapColumn", 62 | "editor.wordWrapColumn": 100, // toggle via Alt + Z shortcut 63 | "editor.mouseWheelZoom": true, 64 | "editor.rulers": [ 65 | { 66 | "column": 80, // soft limit 67 | "color": "#e5e5e5" 68 | }, 69 | { 70 | "column": 100, // hard limit 71 | "color": "#c9c9c9" 72 | } 73 | ], 74 | ////////////////////////////////////// 75 | // Git 76 | ////////////////////////////////////// 77 | "git.inputValidation": true, 78 | "git.inputValidationSubjectLength": 50, 79 | "git.inputValidationLength": 72, 80 | ////////////////////////////////////// 81 | // Spell Checker 82 | ////////////////////////////////////// 83 | "cSpell.words": [ 84 | "ansi", 85 | "Ansi", 86 | "audioop", 87 | "autoplay", 88 | "autoreload", 89 | "cmds", 90 | "elif", 91 | "ensurepip", 92 | "github", 93 | "glxinfo", 94 | "importlib", 95 | "ipython", 96 | "Keybord", 97 | "kisak", 98 | "laggy", 99 | "libglut", 100 | "libpango", 101 | "logfile", 102 | "Logfile", 103 | "manim", 104 | "Manim", 105 | "MANIM", 106 | "manimgl", 107 | "manimlib", 108 | "Millis", 109 | "MSVC", 110 | "nodenext", 111 | "opengl", 112 | "Pango", 113 | "posttest", 114 | "prerun", 115 | "pycache", 116 | "Pyglet", 117 | "pyperclip", 118 | "Redetects", 119 | "Sanderson", 120 | "Sanderson's", 121 | "setuptools", 122 | "systemwidedeploy", 123 | "trippy", 124 | "venv", 125 | "virtualenvs", 126 | "wglinfo", 127 | "xclip", 128 | "youtube", 129 | "ZINK" 130 | ] 131 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | // See https://go.microsoft.com/fwlink/?LinkId=733558 2 | // for the documentation about the tasks.json format 3 | { 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "Watch (Default)", 8 | "dependsOn": [ 9 | "npm: watch:tsc", 10 | "npm: watch:esbuild" 11 | ], 12 | "presentation": { 13 | "reveal": "never" 14 | }, 15 | "group": { 16 | "kind": "build", 17 | "isDefault": true 18 | } 19 | }, 20 | { 21 | "type": "npm", 22 | "script": "watch:tsc", 23 | "group": "build", 24 | "problemMatcher": "$tsc-watch", 25 | "isBackground": true, 26 | "label": "npm: watch:tsc", 27 | "presentation": { 28 | "group": "watch", 29 | "reveal": "never" 30 | } 31 | }, 32 | { 33 | "type": "npm", 34 | "script": "watch:esbuild", 35 | "group": "build", 36 | "problemMatcher": "$esbuild-watch", 37 | "isBackground": true, 38 | "label": "npm: watch:esbuild", 39 | "presentation": { 40 | "group": "watch", 41 | "reveal": "never" 42 | } 43 | }, 44 | { 45 | "type": "npm", 46 | "script": "watch:tests", 47 | "group": "build", 48 | "problemMatcher": "$tsc-watch", 49 | "isBackground": true, 50 | "label": "npm: watch:tests", 51 | "presentation": { 52 | "group": "watch", 53 | "reveal": "never" 54 | } 55 | }, 56 | { 57 | "label": "Install Manim", 58 | "type": "npm", 59 | "script": "install-manim", 60 | "presentation": { 61 | "reveal": "always" 62 | }, 63 | "group": { 64 | "kind": "build" 65 | } 66 | }, 67 | { 68 | "label": "Prepare For Tests", 69 | "dependsOrder": "sequence", 70 | "dependsOn": [ 71 | "npm: watch:tsc", 72 | "npm: watch:esbuild", 73 | "npm: watch:tests", 74 | "Install Manim" 75 | ], 76 | "presentation": { 77 | "reveal": "never" 78 | }, 79 | "group": { 80 | "kind": "build", 81 | "isDefault": true 82 | } 83 | }, 84 | ] 85 | } -------------------------------------------------------------------------------- /.vscodeignore: -------------------------------------------------------------------------------- 1 | .github/** 2 | .config/** 3 | .vscode/** 4 | .vscode-test/** 5 | src/** 6 | tests/** 7 | tmp/** 8 | out-test/** 9 | .gitignore 10 | **/eslint.config.mjs 11 | **/*.map 12 | **/*.ts 13 | **/.vscode-test.* 14 | CHANGELOG.md 15 | CONTRIBUTING.md 16 | .markdownlint.jsonc 17 | node_modules/** 18 | esbuild.js -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | Our [Releases section](https://github.com/Manim-Notebook/manim-notebook/releases) documents all changes made to the Manim Notebook extension. This includes new features, bug fixes, and other improvements. 4 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing 2 | 3 | See the [Developing Guide](https://github.com/Manim-Notebook/manim-notebook/wiki/Developing) in our Wiki. 4 | -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024-2025 Manim Notebook Contributors 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
9 | VSCode extension to interactively preview your Manim animations 10 |
11 |11 | Your extension to interactively preview Manim animations 12 | | GitHub 13 |
14 |(
167 | { title, step, totalSteps, value, prompt, validate,
168 | buttons, ignoreFocusOut, placeholder, shouldResume }: P) {
169 | const disposables: Disposable[] = [];
170 | try {
171 | return await
172 | new Promise