simplex-web 0.2.0__tar.gz → 0.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- simplex_web-0.2.1/PKG-INFO +276 -0
- simplex_web-0.2.1/README.md +231 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/pyproject.toml +1 -1
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/deck.toml +5 -6
- simplex_web-0.2.0/PKG-INFO +0 -166
- simplex_web-0.2.0/README.md +0 -121
- {simplex_web-0.2.0 → simplex_web-0.2.1}/.gitignore +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/LICENSE +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/cli/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/cli/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/cli/commands.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/assets/.gitkeep +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/assets/code/.gitkeep +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/assets/figures/.gitkeep +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/manim.cfg +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/notes.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/refs.bib +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/slides/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/_template/slides/intro.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/config.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/registry.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/scaffold.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/deck/section.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/engine/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/html.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/pdf.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/pptx.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/reconcile.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/runner.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/render/thumbnail.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/slides/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/slides/components/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/theme/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/bibliography.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/bibtex.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/builder.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/callouts.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/citations.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/equations.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/notes.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/refs.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/sidenotes.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/site_config.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/slide_ref.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/.gitkeep +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/lato/lato-latin-400-italic.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/lato/lato-latin-400-normal.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/lato/lato-latin-700-italic.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/lato/lato-latin-700-normal.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/lato/lato-latin-900-normal.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/merriweather/merriweather-latin-400-italic.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/merriweather/merriweather-latin-400-normal.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/merriweather/merriweather-latin-700-italic.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/merriweather/merriweather-latin-700-normal.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/fonts/merriweather/merriweather-latin-900-normal.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/htmx.min.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/auto-render.min.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/katex.min.css +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/katex/katex.min.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/lucide/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/lucide/lucide.min.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/notes.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/reveal.js/reset.css +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/reveal.js/reveal.css +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/reveal.js/reveal.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/simplex.css +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/tailwind.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/static/viewer.js +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/_carousel.html +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/base.html +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/deck.html +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/index.html +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/revealjs.html.j2 +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/templates/section.html +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/src/simplex/web/vendor.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/cli/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/cli/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/cli/test_help.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/cli/test_new.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/cli/test_render.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/deck/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/deck/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/deck/test_config.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/deck/test_registry.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/deck/test_scaffold.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/deck/test_section.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/engine/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/render/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/render/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/render/test_html.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/render/test_reconcile.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/render/test_runner.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/render/test_thumbnail.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/theme/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/README.md +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/__init__.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_bibliography.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_builder.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_callouts.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_citations.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_equations.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_notes.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_sidenotes.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_site_config.py +0 -0
- {simplex_web-0.2.0 → simplex_web-0.2.1}/tests/web/test_slide_ref.py +0 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: simplex-web
|
|
3
|
+
Version: 0.2.1
|
|
4
|
+
Summary: Manim-slides presentation framework with a generated web portal.
|
|
5
|
+
Project-URL: Homepage, https://github.com/shlomi-perles/simplex
|
|
6
|
+
Project-URL: Issues, https://github.com/shlomi-perles/simplex/issues
|
|
7
|
+
Project-URL: Repository, https://github.com/shlomi-perles/simplex
|
|
8
|
+
Author: Shlomi Perles
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: animation,computer-science,education,lecture,manim,manim-slides,math,presentation,static-site
|
|
12
|
+
Classifier: Development Status :: 4 - Beta
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: Education
|
|
15
|
+
Classifier: Intended Audience :: Science/Research
|
|
16
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
+
Classifier: Operating System :: OS Independent
|
|
18
|
+
Classifier: Programming Language :: Python :: 3
|
|
19
|
+
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
+
Classifier: Topic :: Education
|
|
22
|
+
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
23
|
+
Classifier: Topic :: Multimedia :: Graphics
|
|
24
|
+
Classifier: Topic :: Multimedia :: Video
|
|
25
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
26
|
+
Classifier: Typing :: Typed
|
|
27
|
+
Requires-Python: >=3.13
|
|
28
|
+
Requires-Dist: av>=15.0
|
|
29
|
+
Requires-Dist: jinja2>=3.1
|
|
30
|
+
Requires-Dist: manim-simplex>=0.2.0
|
|
31
|
+
Requires-Dist: manim-slides>=5.1.7
|
|
32
|
+
Requires-Dist: markdown-it-py>=3.0
|
|
33
|
+
Requires-Dist: mdit-py-plugins>=0.4
|
|
34
|
+
Requires-Dist: pillow>=11.0
|
|
35
|
+
Requires-Dist: platformdirs>=4.2
|
|
36
|
+
Requires-Dist: pydantic-settings>=2.3
|
|
37
|
+
Requires-Dist: pydantic>=2.7
|
|
38
|
+
Requires-Dist: pygments>=2.18
|
|
39
|
+
Requires-Dist: rich>=13.7
|
|
40
|
+
Requires-Dist: structlog>=24.1
|
|
41
|
+
Requires-Dist: tomli-w>=1.0
|
|
42
|
+
Requires-Dist: typer>=0.12
|
|
43
|
+
Requires-Dist: watchfiles>=0.24
|
|
44
|
+
Description-Content-Type: text/markdown
|
|
45
|
+
|
|
46
|
+
# Simplex
|
|
47
|
+
|
|
48
|
+
[](https://pypi.org/project/simplex-web/)
|
|
49
|
+
[](https://pypi.org/project/simplex-web/)
|
|
50
|
+
[](https://github.com/shlomi-perles/simplex/actions/workflows/ci.yml)
|
|
51
|
+
[](https://github.com/shlomi-perles/simplex/blob/main/LICENSE)
|
|
52
|
+
|
|
53
|
+
Simplex is a Manim presentation workflow with a generated static web portal.
|
|
54
|
+
Write normal Manim scenes, mark slide boundaries with `manim-slides`, and let
|
|
55
|
+
Simplex render the deck, reconcile slide metadata, build thumbnails, render
|
|
56
|
+
notes, and publish a browsable site.
|
|
57
|
+
|
|
58
|
+
The PyPI distribution is `simplex-web`. It installs the `simplex` command and
|
|
59
|
+
imports into the `simplex.*` namespace.
|
|
60
|
+
|
|
61
|
+
## Why Simplex?
|
|
62
|
+
|
|
63
|
+
- Author scenes with standard Manim objects such as `MathTex`, `VGroup`,
|
|
64
|
+
`Axes`, and `Animation`.
|
|
65
|
+
- Use `manim-simplex` slide bases, layout regions, theme tokens, and mobjects.
|
|
66
|
+
- Organize decks under `decks/` with a small `deck.toml`.
|
|
67
|
+
- Build a static portal with deck pages, notes, citations, math rendering,
|
|
68
|
+
thumbnails, RevealJS playback, and optional live reload.
|
|
69
|
+
- Keep the rendered video frames clean; navigation chrome lives in the web
|
|
70
|
+
viewer where it can be changed without re-rendering videos.
|
|
71
|
+
|
|
72
|
+
## Packages
|
|
73
|
+
|
|
74
|
+
Simplex is split into a small toolkit:
|
|
75
|
+
|
|
76
|
+
| Repository | PyPI | Purpose |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| [`manim-simplex`](https://github.com/shlomi-perles/manim-simplex) | `manim-simplex` | Manim plugin, themes, slide bases, mobjects, and manifest schema. |
|
|
79
|
+
| [`simplex`](https://github.com/shlomi-perles/simplex) | `simplex-web` | CLI, deck discovery, render orchestration, static portal builder. |
|
|
80
|
+
| [`simplex-lectures-template`](https://github.com/shlomi-perles/simplex-lectures-template) | - | Starter lectures repository. |
|
|
81
|
+
|
|
82
|
+
The import namespace is still `simplex`. Both `manim-simplex` and
|
|
83
|
+
`simplex-web` intentionally use a PEP 420 namespace package so their modules
|
|
84
|
+
merge at runtime.
|
|
85
|
+
|
|
86
|
+
## Requirements
|
|
87
|
+
|
|
88
|
+
- Python 3.13 or newer
|
|
89
|
+
- FFmpeg
|
|
90
|
+
- A LaTeX distribution
|
|
91
|
+
- Manim's native dependencies, including Cairo and Pango on Linux
|
|
92
|
+
|
|
93
|
+
Typical system packages:
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# Ubuntu / Debian
|
|
97
|
+
sudo apt-get install texlive-latex-extra texlive-fonts-recommended ffmpeg \
|
|
98
|
+
libcairo2-dev libpango1.0-dev
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
```powershell
|
|
102
|
+
# Windows
|
|
103
|
+
winget install MiKTeX.MiKTeX
|
|
104
|
+
winget install Gyan.FFmpeg
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
After installation, run:
|
|
108
|
+
|
|
109
|
+
```bash
|
|
110
|
+
simplex doctor
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Install
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
pip install simplex-web
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
With `uv`:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
uv add simplex-web
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
For local development in this repository:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
uv sync
|
|
129
|
+
uv run simplex doctor
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Quick Start
|
|
133
|
+
|
|
134
|
+
Create a new deck in an existing project:
|
|
135
|
+
|
|
136
|
+
```bash
|
|
137
|
+
simplex new algorithms/hash-tables
|
|
138
|
+
simplex render hash-tables
|
|
139
|
+
simplex build
|
|
140
|
+
simplex serve
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
Then open:
|
|
144
|
+
|
|
145
|
+
```text
|
|
146
|
+
http://localhost:8000
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
To start from the GitHub template instead:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
simplex init my-lectures
|
|
153
|
+
cd my-lectures
|
|
154
|
+
simplex new first-deck
|
|
155
|
+
simplex build
|
|
156
|
+
simplex serve
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Deck Layout
|
|
160
|
+
|
|
161
|
+
`simplex new hash-tables` creates a deck like this:
|
|
162
|
+
|
|
163
|
+
```text
|
|
164
|
+
decks/hash-tables/
|
|
165
|
+
|-- deck.toml
|
|
166
|
+
|-- manim.cfg
|
|
167
|
+
|-- notes.md
|
|
168
|
+
|-- refs.bib
|
|
169
|
+
|-- assets/
|
|
170
|
+
`-- slides/
|
|
171
|
+
|-- __init__.py
|
|
172
|
+
`-- intro.py
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
The important fields in `deck.toml` are:
|
|
176
|
+
|
|
177
|
+
```toml
|
|
178
|
+
slug = "hash-tables"
|
|
179
|
+
title = "Hash Tables"
|
|
180
|
+
summary = "A one-line deck summary."
|
|
181
|
+
theme = "dastimator_dark"
|
|
182
|
+
quality = "high_quality"
|
|
183
|
+
entrypoints = ["slides.intro:Intro"]
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
`entrypoints` points to scene classes inside the deck directory. Legacy
|
|
187
|
+
`scenes = ["Intro"]` is still accepted for single-file `slides.py` decks, but
|
|
188
|
+
`entrypoints` is the preferred layout.
|
|
189
|
+
|
|
190
|
+
## Authoring Slides
|
|
191
|
+
|
|
192
|
+
A scene is ordinary Manim plus the Simplex slide base:
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
from manim import DOWN, ORIGIN, Tex, Write
|
|
196
|
+
|
|
197
|
+
from simplex.slides import BaseSlide
|
|
198
|
+
from simplex.theme.context import get_active_theme
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
class Intro(BaseSlide):
|
|
202
|
+
def construct(self) -> None:
|
|
203
|
+
theme = get_active_theme()
|
|
204
|
+
|
|
205
|
+
title = Tex("Hello, Simplex", font_size=theme.typography.h1)
|
|
206
|
+
self.region.place(title, ORIGIN)
|
|
207
|
+
|
|
208
|
+
subtitle = Tex(r"$e^{i\pi} + 1 = 0$", font_size=theme.typography.h2)
|
|
209
|
+
subtitle.next_to(title, DOWN, buff=0.4)
|
|
210
|
+
|
|
211
|
+
self.play(Write(title), Write(subtitle))
|
|
212
|
+
self.next_slide()
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
`BaseSlide` comes from `manim-simplex`. It provides the default theme,
|
|
216
|
+
bounded layout region, slide lifecycle helpers, and section metadata used by
|
|
217
|
+
the web builder.
|
|
218
|
+
|
|
219
|
+
## Notes And Site
|
|
220
|
+
|
|
221
|
+
Each deck can include `notes.md`. The site builder renders Markdown notes,
|
|
222
|
+
inline math, display math, citations from `refs.bib`, and slide references.
|
|
223
|
+
|
|
224
|
+
Site-wide options live in `site.toml`:
|
|
225
|
+
|
|
226
|
+
```toml
|
|
227
|
+
brand = "Simplex"
|
|
228
|
+
tagline = "Manim presentations, rendered."
|
|
229
|
+
|
|
230
|
+
nav = [
|
|
231
|
+
{ label = "Decks", href = "/" },
|
|
232
|
+
{ label = "GitHub", href = "https://github.com/shlomi-perles/simplex" },
|
|
233
|
+
]
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
Deployment-only settings are read from environment variables:
|
|
237
|
+
|
|
238
|
+
- `SIMPLEX_BASE_URL`
|
|
239
|
+
- `SIMPLEX_GA_TAG`
|
|
240
|
+
- `SIMPLEX_BRAND`
|
|
241
|
+
- `SIMPLEX_PREVIEW`
|
|
242
|
+
|
|
243
|
+
## CLI
|
|
244
|
+
|
|
245
|
+
| Command | Purpose |
|
|
246
|
+
|---|---|
|
|
247
|
+
| `simplex new <slug>` | Create `decks/<slug>/` from the bundled template. |
|
|
248
|
+
| `simplex new <section>/<slug>` | Create a deck inside a named section. |
|
|
249
|
+
| `simplex init [dir]` | Create a lectures repo from the GitHub template. |
|
|
250
|
+
| `simplex render <slug>` | Render one deck into `site/decks/<slug>/`. |
|
|
251
|
+
| `simplex render <slug>::<Scene>` | Render one scene from a deck. |
|
|
252
|
+
| `simplex build` | Render decks and build the static portal under `site/`. |
|
|
253
|
+
| `simplex build --no-render` | Rebuild portal HTML from existing render output. |
|
|
254
|
+
| `simplex serve [--watch]` | Serve `site/` locally, optionally with live reload. |
|
|
255
|
+
| `simplex test` | Smoke-render decks by rendering only the first animation. |
|
|
256
|
+
| `simplex clean` | Remove generated `site/` and `media/` output. |
|
|
257
|
+
| `simplex doctor` | Check required binaries on `PATH`. |
|
|
258
|
+
|
|
259
|
+
## Development
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
git clone https://github.com/shlomi-perles/simplex.git
|
|
263
|
+
cd simplex
|
|
264
|
+
uv sync
|
|
265
|
+
uv run ruff check .
|
|
266
|
+
uv run ruff format --check .
|
|
267
|
+
uv run basedpyright
|
|
268
|
+
uv run pytest -q
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
The release workflow uses GitHub Actions Trusted Publishing to upload
|
|
272
|
+
`simplex-web` to PyPI. No PyPI API token is stored in the repository.
|
|
273
|
+
|
|
274
|
+
## License
|
|
275
|
+
|
|
276
|
+
MIT.
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# Simplex
|
|
2
|
+
|
|
3
|
+
[](https://pypi.org/project/simplex-web/)
|
|
4
|
+
[](https://pypi.org/project/simplex-web/)
|
|
5
|
+
[](https://github.com/shlomi-perles/simplex/actions/workflows/ci.yml)
|
|
6
|
+
[](https://github.com/shlomi-perles/simplex/blob/main/LICENSE)
|
|
7
|
+
|
|
8
|
+
Simplex is a Manim presentation workflow with a generated static web portal.
|
|
9
|
+
Write normal Manim scenes, mark slide boundaries with `manim-slides`, and let
|
|
10
|
+
Simplex render the deck, reconcile slide metadata, build thumbnails, render
|
|
11
|
+
notes, and publish a browsable site.
|
|
12
|
+
|
|
13
|
+
The PyPI distribution is `simplex-web`. It installs the `simplex` command and
|
|
14
|
+
imports into the `simplex.*` namespace.
|
|
15
|
+
|
|
16
|
+
## Why Simplex?
|
|
17
|
+
|
|
18
|
+
- Author scenes with standard Manim objects such as `MathTex`, `VGroup`,
|
|
19
|
+
`Axes`, and `Animation`.
|
|
20
|
+
- Use `manim-simplex` slide bases, layout regions, theme tokens, and mobjects.
|
|
21
|
+
- Organize decks under `decks/` with a small `deck.toml`.
|
|
22
|
+
- Build a static portal with deck pages, notes, citations, math rendering,
|
|
23
|
+
thumbnails, RevealJS playback, and optional live reload.
|
|
24
|
+
- Keep the rendered video frames clean; navigation chrome lives in the web
|
|
25
|
+
viewer where it can be changed without re-rendering videos.
|
|
26
|
+
|
|
27
|
+
## Packages
|
|
28
|
+
|
|
29
|
+
Simplex is split into a small toolkit:
|
|
30
|
+
|
|
31
|
+
| Repository | PyPI | Purpose |
|
|
32
|
+
|---|---|---|
|
|
33
|
+
| [`manim-simplex`](https://github.com/shlomi-perles/manim-simplex) | `manim-simplex` | Manim plugin, themes, slide bases, mobjects, and manifest schema. |
|
|
34
|
+
| [`simplex`](https://github.com/shlomi-perles/simplex) | `simplex-web` | CLI, deck discovery, render orchestration, static portal builder. |
|
|
35
|
+
| [`simplex-lectures-template`](https://github.com/shlomi-perles/simplex-lectures-template) | - | Starter lectures repository. |
|
|
36
|
+
|
|
37
|
+
The import namespace is still `simplex`. Both `manim-simplex` and
|
|
38
|
+
`simplex-web` intentionally use a PEP 420 namespace package so their modules
|
|
39
|
+
merge at runtime.
|
|
40
|
+
|
|
41
|
+
## Requirements
|
|
42
|
+
|
|
43
|
+
- Python 3.13 or newer
|
|
44
|
+
- FFmpeg
|
|
45
|
+
- A LaTeX distribution
|
|
46
|
+
- Manim's native dependencies, including Cairo and Pango on Linux
|
|
47
|
+
|
|
48
|
+
Typical system packages:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
# Ubuntu / Debian
|
|
52
|
+
sudo apt-get install texlive-latex-extra texlive-fonts-recommended ffmpeg \
|
|
53
|
+
libcairo2-dev libpango1.0-dev
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
```powershell
|
|
57
|
+
# Windows
|
|
58
|
+
winget install MiKTeX.MiKTeX
|
|
59
|
+
winget install Gyan.FFmpeg
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
After installation, run:
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
simplex doctor
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Install
|
|
69
|
+
|
|
70
|
+
```bash
|
|
71
|
+
pip install simplex-web
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
With `uv`:
|
|
75
|
+
|
|
76
|
+
```bash
|
|
77
|
+
uv add simplex-web
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
For local development in this repository:
|
|
81
|
+
|
|
82
|
+
```bash
|
|
83
|
+
uv sync
|
|
84
|
+
uv run simplex doctor
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Quick Start
|
|
88
|
+
|
|
89
|
+
Create a new deck in an existing project:
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
simplex new algorithms/hash-tables
|
|
93
|
+
simplex render hash-tables
|
|
94
|
+
simplex build
|
|
95
|
+
simplex serve
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Then open:
|
|
99
|
+
|
|
100
|
+
```text
|
|
101
|
+
http://localhost:8000
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
To start from the GitHub template instead:
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
simplex init my-lectures
|
|
108
|
+
cd my-lectures
|
|
109
|
+
simplex new first-deck
|
|
110
|
+
simplex build
|
|
111
|
+
simplex serve
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
## Deck Layout
|
|
115
|
+
|
|
116
|
+
`simplex new hash-tables` creates a deck like this:
|
|
117
|
+
|
|
118
|
+
```text
|
|
119
|
+
decks/hash-tables/
|
|
120
|
+
|-- deck.toml
|
|
121
|
+
|-- manim.cfg
|
|
122
|
+
|-- notes.md
|
|
123
|
+
|-- refs.bib
|
|
124
|
+
|-- assets/
|
|
125
|
+
`-- slides/
|
|
126
|
+
|-- __init__.py
|
|
127
|
+
`-- intro.py
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The important fields in `deck.toml` are:
|
|
131
|
+
|
|
132
|
+
```toml
|
|
133
|
+
slug = "hash-tables"
|
|
134
|
+
title = "Hash Tables"
|
|
135
|
+
summary = "A one-line deck summary."
|
|
136
|
+
theme = "dastimator_dark"
|
|
137
|
+
quality = "high_quality"
|
|
138
|
+
entrypoints = ["slides.intro:Intro"]
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
`entrypoints` points to scene classes inside the deck directory. Legacy
|
|
142
|
+
`scenes = ["Intro"]` is still accepted for single-file `slides.py` decks, but
|
|
143
|
+
`entrypoints` is the preferred layout.
|
|
144
|
+
|
|
145
|
+
## Authoring Slides
|
|
146
|
+
|
|
147
|
+
A scene is ordinary Manim plus the Simplex slide base:
|
|
148
|
+
|
|
149
|
+
```python
|
|
150
|
+
from manim import DOWN, ORIGIN, Tex, Write
|
|
151
|
+
|
|
152
|
+
from simplex.slides import BaseSlide
|
|
153
|
+
from simplex.theme.context import get_active_theme
|
|
154
|
+
|
|
155
|
+
|
|
156
|
+
class Intro(BaseSlide):
|
|
157
|
+
def construct(self) -> None:
|
|
158
|
+
theme = get_active_theme()
|
|
159
|
+
|
|
160
|
+
title = Tex("Hello, Simplex", font_size=theme.typography.h1)
|
|
161
|
+
self.region.place(title, ORIGIN)
|
|
162
|
+
|
|
163
|
+
subtitle = Tex(r"$e^{i\pi} + 1 = 0$", font_size=theme.typography.h2)
|
|
164
|
+
subtitle.next_to(title, DOWN, buff=0.4)
|
|
165
|
+
|
|
166
|
+
self.play(Write(title), Write(subtitle))
|
|
167
|
+
self.next_slide()
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
`BaseSlide` comes from `manim-simplex`. It provides the default theme,
|
|
171
|
+
bounded layout region, slide lifecycle helpers, and section metadata used by
|
|
172
|
+
the web builder.
|
|
173
|
+
|
|
174
|
+
## Notes And Site
|
|
175
|
+
|
|
176
|
+
Each deck can include `notes.md`. The site builder renders Markdown notes,
|
|
177
|
+
inline math, display math, citations from `refs.bib`, and slide references.
|
|
178
|
+
|
|
179
|
+
Site-wide options live in `site.toml`:
|
|
180
|
+
|
|
181
|
+
```toml
|
|
182
|
+
brand = "Simplex"
|
|
183
|
+
tagline = "Manim presentations, rendered."
|
|
184
|
+
|
|
185
|
+
nav = [
|
|
186
|
+
{ label = "Decks", href = "/" },
|
|
187
|
+
{ label = "GitHub", href = "https://github.com/shlomi-perles/simplex" },
|
|
188
|
+
]
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
Deployment-only settings are read from environment variables:
|
|
192
|
+
|
|
193
|
+
- `SIMPLEX_BASE_URL`
|
|
194
|
+
- `SIMPLEX_GA_TAG`
|
|
195
|
+
- `SIMPLEX_BRAND`
|
|
196
|
+
- `SIMPLEX_PREVIEW`
|
|
197
|
+
|
|
198
|
+
## CLI
|
|
199
|
+
|
|
200
|
+
| Command | Purpose |
|
|
201
|
+
|---|---|
|
|
202
|
+
| `simplex new <slug>` | Create `decks/<slug>/` from the bundled template. |
|
|
203
|
+
| `simplex new <section>/<slug>` | Create a deck inside a named section. |
|
|
204
|
+
| `simplex init [dir]` | Create a lectures repo from the GitHub template. |
|
|
205
|
+
| `simplex render <slug>` | Render one deck into `site/decks/<slug>/`. |
|
|
206
|
+
| `simplex render <slug>::<Scene>` | Render one scene from a deck. |
|
|
207
|
+
| `simplex build` | Render decks and build the static portal under `site/`. |
|
|
208
|
+
| `simplex build --no-render` | Rebuild portal HTML from existing render output. |
|
|
209
|
+
| `simplex serve [--watch]` | Serve `site/` locally, optionally with live reload. |
|
|
210
|
+
| `simplex test` | Smoke-render decks by rendering only the first animation. |
|
|
211
|
+
| `simplex clean` | Remove generated `site/` and `media/` output. |
|
|
212
|
+
| `simplex doctor` | Check required binaries on `PATH`. |
|
|
213
|
+
|
|
214
|
+
## Development
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
git clone https://github.com/shlomi-perles/simplex.git
|
|
218
|
+
cd simplex
|
|
219
|
+
uv sync
|
|
220
|
+
uv run ruff check .
|
|
221
|
+
uv run ruff format --check .
|
|
222
|
+
uv run basedpyright
|
|
223
|
+
uv run pytest -q
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
The release workflow uses GitHub Actions Trusted Publishing to upload
|
|
227
|
+
`simplex-web` to PyPI. No PyPI API token is stored in the repository.
|
|
228
|
+
|
|
229
|
+
## License
|
|
230
|
+
|
|
231
|
+
MIT.
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
+
created_at = "__CREATED_AT__"
|
|
2
|
+
entrypoints = ["slides.intro:Intro"]
|
|
3
|
+
order = 1000
|
|
4
|
+
quality = "high_quality"
|
|
1
5
|
slug = "__SLUG__"
|
|
2
|
-
title = "__TITLE__"
|
|
3
6
|
summary = "Replace with a one-line description."
|
|
4
7
|
tags = []
|
|
5
8
|
theme = "dastimator_dark"
|
|
6
|
-
|
|
9
|
+
title = "__TITLE__"
|
|
7
10
|
voiceover = false
|
|
8
|
-
category = ""
|
|
9
|
-
created_at = "__CREATED_AT__"
|
|
10
|
-
order = 1000
|
|
11
|
-
entrypoints = ["slides.intro:Intro"]
|
simplex_web-0.2.0/PKG-INFO
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.4
|
|
2
|
-
Name: simplex-web
|
|
3
|
-
Version: 0.2.0
|
|
4
|
-
Summary: Manim-slides presentation framework with a generated web portal.
|
|
5
|
-
Project-URL: Homepage, https://github.com/shlomi-perles/simplex
|
|
6
|
-
Project-URL: Issues, https://github.com/shlomi-perles/simplex/issues
|
|
7
|
-
Project-URL: Repository, https://github.com/shlomi-perles/simplex
|
|
8
|
-
Author: Shlomi Perles
|
|
9
|
-
License-Expression: MIT
|
|
10
|
-
License-File: LICENSE
|
|
11
|
-
Keywords: animation,computer-science,education,lecture,manim,manim-slides,math,presentation,static-site
|
|
12
|
-
Classifier: Development Status :: 4 - Beta
|
|
13
|
-
Classifier: Environment :: Console
|
|
14
|
-
Classifier: Intended Audience :: Education
|
|
15
|
-
Classifier: Intended Audience :: Science/Research
|
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
17
|
-
Classifier: Operating System :: OS Independent
|
|
18
|
-
Classifier: Programming Language :: Python :: 3
|
|
19
|
-
Classifier: Programming Language :: Python :: 3 :: Only
|
|
20
|
-
Classifier: Programming Language :: Python :: 3.13
|
|
21
|
-
Classifier: Topic :: Education
|
|
22
|
-
Classifier: Topic :: Internet :: WWW/HTTP :: Site Management
|
|
23
|
-
Classifier: Topic :: Multimedia :: Graphics
|
|
24
|
-
Classifier: Topic :: Multimedia :: Video
|
|
25
|
-
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
26
|
-
Classifier: Typing :: Typed
|
|
27
|
-
Requires-Python: >=3.13
|
|
28
|
-
Requires-Dist: av>=15.0
|
|
29
|
-
Requires-Dist: jinja2>=3.1
|
|
30
|
-
Requires-Dist: manim-simplex>=0.2.0
|
|
31
|
-
Requires-Dist: manim-slides>=5.1.7
|
|
32
|
-
Requires-Dist: markdown-it-py>=3.0
|
|
33
|
-
Requires-Dist: mdit-py-plugins>=0.4
|
|
34
|
-
Requires-Dist: pillow>=11.0
|
|
35
|
-
Requires-Dist: platformdirs>=4.2
|
|
36
|
-
Requires-Dist: pydantic-settings>=2.3
|
|
37
|
-
Requires-Dist: pydantic>=2.7
|
|
38
|
-
Requires-Dist: pygments>=2.18
|
|
39
|
-
Requires-Dist: rich>=13.7
|
|
40
|
-
Requires-Dist: structlog>=24.1
|
|
41
|
-
Requires-Dist: tomli-w>=1.0
|
|
42
|
-
Requires-Dist: typer>=0.12
|
|
43
|
-
Requires-Dist: watchfiles>=0.24
|
|
44
|
-
Description-Content-Type: text/markdown
|
|
45
|
-
|
|
46
|
-
# Simplex
|
|
47
|
-
|
|
48
|
-
A Manim-slides presentation framework with a generated web portal.
|
|
49
|
-
|
|
50
|
-
Authors write **vanilla Manim** (`MathTex(...)`, `VGroup(...).arrange(RIGHT)`); Simplex configures defaults underneath via frozen theme tokens. A `simplex new` command scaffolds a new deck; `simplex build` renders every deck and produces a static portal for GitHub Pages.
|
|
51
|
-
|
|
52
|
-
## The three repos
|
|
53
|
-
|
|
54
|
-
`simplex` is one of three packages that together make up the v0.2.0 toolkit:
|
|
55
|
-
|
|
56
|
-
| Repo | PyPI | Role |
|
|
57
|
-
|---|---|---|
|
|
58
|
-
| [`manim-simplex`](https://github.com/shlomi-perles/manim-simplex) | `manim-simplex` | The manim plugin: mobjects, theme, `BaseSlide`, the `manim.plugins` entry-point. |
|
|
59
|
-
| [`simplex`](https://github.com/shlomi-perles/simplex) | `simplex-web` | The platform: CLI, deck discovery, render orchestration, web builder. Depends on `manim-simplex`. |
|
|
60
|
-
| [`simplex-lectures-template`](https://github.com/shlomi-perles/simplex-lectures-template) | -- | GitHub Template. Pre-wired user lectures repo. |
|
|
61
|
-
|
|
62
|
-
The PyPI slot `simplex` was already taken by an unrelated project, and PyPI's
|
|
63
|
-
name-similarity guard rejects short variants, so this distribution publishes
|
|
64
|
-
as `simplex-web`. The *import* name is still
|
|
65
|
-
`simplex` -- both wheels ship `src/simplex/` **without** `__init__.py` and
|
|
66
|
-
Python's PEP 420 implicit namespace packages merge them at import time, so
|
|
67
|
-
`from simplex.engine import Remove` and `from simplex.cli.commands import app`
|
|
68
|
-
resolve regardless of which wheel ships the module.
|
|
69
|
-
|
|
70
|
-
## Quick start
|
|
71
|
-
|
|
72
|
-
```bash
|
|
73
|
-
# Install from PyPI:
|
|
74
|
-
pip install simplex-web
|
|
75
|
-
|
|
76
|
-
# Bootstrap a fresh checkout (Linux / macOS):
|
|
77
|
-
./scripts/bootstrap.sh
|
|
78
|
-
|
|
79
|
-
# Or on Windows:
|
|
80
|
-
.\\scripts\\bootstrap.ps1
|
|
81
|
-
|
|
82
|
-
# Scaffold a new deck and render it:
|
|
83
|
-
uv run simplex new my-first-deck
|
|
84
|
-
uv run simplex render my-first-deck
|
|
85
|
-
|
|
86
|
-
# Generate the portal and preview it locally:
|
|
87
|
-
uv run simplex build
|
|
88
|
-
uv run simplex serve
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
## Repository layout
|
|
92
|
-
|
|
93
|
-
```
|
|
94
|
-
simplex/
|
|
95
|
-
|-- src/simplex/ (no __init__.py -- PEP 420 namespace)
|
|
96
|
-
| |-- deck/ DeckConfig, discovery, scaffolder
|
|
97
|
-
| |-- render/ runner, reconcile, html/pdf/pptx, thumbnail
|
|
98
|
-
| |-- web/ markdown notes + Jinja portal + SSE reload
|
|
99
|
-
| `-- cli/ Typer entry point
|
|
100
|
-
|-- decks/ author content (one directory per deck)
|
|
101
|
-
`-- tests/
|
|
102
|
-
|
|
103
|
-
# Plugin half (mobjects, theme, slide bases) lives in manim-simplex.
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Every directory ships a short `README.md` (<=50 lines) covering *scope*, *public surface*, and *don'ts*. Only this root README is long-form.
|
|
107
|
-
|
|
108
|
-
## Authoring a deck
|
|
109
|
-
|
|
110
|
-
A deck is three files plus optional assets:
|
|
111
|
-
|
|
112
|
-
```
|
|
113
|
-
decks/my-deck/
|
|
114
|
-
|-- deck.toml slug, title, summary, tags, theme, scenes, quality
|
|
115
|
-
|-- slides.py vanilla Manim, subclassing simplex.slides.*
|
|
116
|
-
|-- notes.md English notes rendered into the portal
|
|
117
|
-
`-- assets/
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
Inside `slides.py` you write plain Manim -- the framework's only contribution is the base class plus a pure `make_chrome` factory:
|
|
121
|
-
|
|
122
|
-
```python
|
|
123
|
-
from manim import MathTex, ORIGIN, Write
|
|
124
|
-
from simplex.slides import BaseSlide, make_chrome
|
|
125
|
-
from simplex.theme.context import get_active_theme
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
class FermatLittleTheorem(BaseSlide):
|
|
129
|
-
def setup(self) -> None:
|
|
130
|
-
super().setup()
|
|
131
|
-
chrome = make_chrome(get_active_theme(), self.region, header="Fermat's little theorem")
|
|
132
|
-
self.add_to_canvas(**chrome.mobjects)
|
|
133
|
-
self.region = chrome.body_region
|
|
134
|
-
|
|
135
|
-
def construct(self) -> None:
|
|
136
|
-
eq = MathTex(r"a^{p-1} \equiv 1 \pmod p")
|
|
137
|
-
self.region.place(eq, ORIGIN)
|
|
138
|
-
self.play(Write(eq))
|
|
139
|
-
self.next_slide() # bare first call -> MAIN named "Fermat Little Theorem"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
No factories, no wrappers, no anti-corruption wall. The theme provides defaults, `self.region` provides bounded layout, and `clear_scene(exclude=...)` provides bulk fade-outs. Slide numbering / wall clock live in the RevealJS host (toggle via `[web]` in `deck.toml`), not the rendered frames.
|
|
143
|
-
|
|
144
|
-
## Theme tokens
|
|
145
|
-
|
|
146
|
-
Presets are frozen `Theme` instances, not subclasses, so swapping the visual identity at runtime is one assignment:
|
|
147
|
-
|
|
148
|
-
```python
|
|
149
|
-
from simplex.theme import active_theme, presets
|
|
150
|
-
|
|
151
|
-
with active_theme(presets.ACADEMIC_LIGHT):
|
|
152
|
-
# all slides constructed here pick up the light palette
|
|
153
|
-
...
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
LaTeX preamble lives on `theme.latex.preamble`. Fixed-width prose blocks use the `TexPage` mobject (default 20 cm, override via `width_cm=…` kwarg or a class attribute on a subclass).
|
|
157
|
-
|
|
158
|
-
## Style + tooling
|
|
159
|
-
|
|
160
|
-
- Python **3.13+**, env + lockfile via **uv**, lint + format via **ruff**, types via **basedpyright --strict**.
|
|
161
|
-
- Configuration through frozen **Pydantic v2** models. No bare `dict[str, Any]`.
|
|
162
|
-
- See `STYLE.md` for the full rule set.
|
|
163
|
-
|
|
164
|
-
## License
|
|
165
|
-
|
|
166
|
-
MIT.
|