manim-simplex 0.2.1__tar.gz → 0.2.3__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.
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/CHANGELOG.md +12 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/PKG-INFO +21 -22
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/README.md +19 -21
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/examples/hello_slide.py +2 -3
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/examples/outline_slide.py +1 -2
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/examples/theme_demo.py +2 -3
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/pyproject.toml +2 -1
- manim_simplex-0.2.3/src/simplex/__init__.py +137 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/animations.py +6 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/code.py +1 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/mobjects/__init__.py +13 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/mobjects/array.py +1 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/mobjects/graph.py +1 -1
- manim_simplex-0.2.3/src/simplex/mobjects/paper.py +456 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/plugin.py +3 -3
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/README.md +2 -2
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/__init__.py +2 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/context.py +3 -3
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/presets.py +4 -4
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/pygments_style.py +1 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_text.py +7 -7
- manim_simplex-0.2.3/tests/mobjects/test_paper.py +136 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/slides/test_chrome.py +8 -8
- manim_simplex-0.2.3/tests/test_public_api.py +13 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/theme/README.md +1 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/theme/test_tokens.py +11 -11
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/uv.lock +19 -1
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/.gitignore +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/.pre-commit-config.yaml +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/.python-version +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/LICENSE +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/examples/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/examples/glyph_map_demo.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/examples/manim.cfg +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/ruff.toml +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/debug.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/defaults.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/dynamics.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/geometry.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/ghost_fade.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/glyph_map.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/region.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/scaling.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/engine/text.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/manifest.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/mobjects/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/mobjects/outline.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/py.typed +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/section.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/slides/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/slides/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/slides/base.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/slides/chrome.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/slides/outline.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/tokens.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/src/simplex/theme/web_css.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_animations.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_code.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_debug.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_dynamics.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_geometry.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_ghost_fade.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_glyph_map.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_region.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/engine/test_scaling.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/mobjects/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/mobjects/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/mobjects/test_graph.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/mobjects/test_outline.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/slides/README.md +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/slides/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/slides/test_base.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/slides/test_outline.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/test_manifest.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/test_section.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/theme/__init__.py +0 -0
- {manim_simplex-0.2.1 → manim_simplex-0.2.3}/tests/theme/test_web_css.py +0 -0
|
@@ -6,6 +6,17 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.2.3] - 2026-05-25
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- Top-level authoring imports such as `from simplex import BaseSlide, Caption`.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- Rename the default theme from `dastimator_dark` / `DASTIMATOR_DARK` to
|
|
18
|
+
`simplex_dark` / `SIMPLEX_DARK`.
|
|
19
|
+
|
|
9
20
|
## [0.2.1] - 2026-05-24
|
|
10
21
|
|
|
11
22
|
### Changed
|
|
@@ -111,7 +122,7 @@ this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
|
|
|
111
122
|
- ``make_chrome(..., page=…)`` parameter and the corresponding ``page``
|
|
112
123
|
entry in ``Chrome.mobjects``. Slide numbering moves to the web layer.
|
|
113
124
|
- ``LatexProfile.environments["definition"]`` entries from
|
|
114
|
-
``
|
|
125
|
+
``SIMPLEX_DARK`` and ``ACADEMIC_LIGHT``: ``TexPage`` is now the
|
|
115
126
|
single owner of the ``{minipage}{<width>cm}`` literal.
|
|
116
127
|
- `simplex.engine.section_types` module (replaced by `simplex.section`).
|
|
117
128
|
- `simplex.slides.components` subpackage (replaced by `simplex.mobjects`).
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: manim-simplex
|
|
3
|
-
Version: 0.2.
|
|
3
|
+
Version: 0.2.3
|
|
4
4
|
Summary: Manim plugin: theme tokens, mobjects, slide hierarchy, deck manifest schema.
|
|
5
5
|
Project-URL: Changelog, https://github.com/shlomi-perles/manim-simplex/blob/main/CHANGELOG.md
|
|
6
6
|
Project-URL: Homepage, https://github.com/shlomi-perles/manim-simplex
|
|
@@ -28,6 +28,7 @@ Requires-Dist: manim-slides>=5.1.7
|
|
|
28
28
|
Requires-Dist: manim>=0.20.1
|
|
29
29
|
Requires-Dist: pydantic>=2.7
|
|
30
30
|
Requires-Dist: pygments>=2.18
|
|
31
|
+
Requires-Dist: pymupdf>=1.27.2.3
|
|
31
32
|
Description-Content-Type: text/markdown
|
|
32
33
|
|
|
33
34
|
# manim-simplex
|
|
@@ -35,14 +36,14 @@ Description-Content-Type: text/markdown
|
|
|
35
36
|
[](https://pypi.org/project/manim-simplex/)
|
|
36
37
|
[](https://pypi.org/project/manim-simplex/)
|
|
37
38
|
[](https://github.com/shlomi-perles/manim-simplex/actions/workflows/ci.yml)
|
|
38
|
-
[](https://github.com/shlomi-perles/manim-simplex/blob/main/LICENSE)
|
|
39
40
|
|
|
40
41
|
`manim-simplex` is the Manim plugin layer for Simplex: theme tokens,
|
|
41
42
|
slide bases, reusable mobjects, animation helpers, and the shared deck
|
|
42
43
|
manifest schema used by the Simplex web builder.
|
|
43
44
|
|
|
44
|
-
It is published as `manim-simplex` and exposes
|
|
45
|
-
|
|
45
|
+
It is published as `manim-simplex` and exposes the `simplex` Manim authoring
|
|
46
|
+
API.
|
|
46
47
|
|
|
47
48
|
## Requirements
|
|
48
49
|
|
|
@@ -93,15 +94,14 @@ color, and enables section JSON output.
|
|
|
93
94
|
```python
|
|
94
95
|
from manim import ORIGIN, MathTex, Write
|
|
95
96
|
|
|
96
|
-
from simplex
|
|
97
|
-
from simplex.theme import presets
|
|
97
|
+
from simplex import BaseSlide, make_chrome, presets
|
|
98
98
|
|
|
99
99
|
|
|
100
100
|
class HelloSlide(BaseSlide):
|
|
101
101
|
def setup(self) -> None:
|
|
102
102
|
super().setup()
|
|
103
103
|
chrome = make_chrome(
|
|
104
|
-
presets.
|
|
104
|
+
presets.SIMPLEX_DARK,
|
|
105
105
|
self.region,
|
|
106
106
|
header="Hello, Simplex",
|
|
107
107
|
)
|
|
@@ -141,10 +141,10 @@ uv run manim-slides present HelloSlide
|
|
|
141
141
|
| `simplex.plugin` | `activate()` entry point used by Manim. |
|
|
142
142
|
| `simplex.slides` | `BaseSlide`, `OutlineScene`, `OutlinePart`, `Chrome`, `make_chrome`. |
|
|
143
143
|
| `simplex.engine` | `Region`, `Remove`, `clear_scene`, `exit_for`, `register_exit`, `set_exit_animation`, `HighlightResult`, `apply_theme_defaults`. |
|
|
144
|
-
| `simplex.mobjects` | `Node`, `Edge`, `ArrayMob`, `ArrayEntry`, `ArrayPointer`, `OutlineProgressBar`. |
|
|
144
|
+
| `simplex.mobjects` | `Node`, `Edge`, `ArrayMob`, `ArrayEntry`, `ArrayPointer`, `OutlineProgressBar`, `Paper`, `ShowPaper`, `DismissPaper`, `PickPage`. |
|
|
145
145
|
| `simplex.theme` | `Theme`, `Palette`, `Typography`, `Spacing`, `Motion`, `LatexProfile`, `WebPalette`, `active_theme`, `get_active_theme`, `presets`, `render_web_css`. |
|
|
146
146
|
| `simplex.section` | `SimplexSectionType`, the section strings written into Manim section JSON. |
|
|
147
|
-
| `simplex.manifest` | `DeckManifest`, `MainSlide`, `Subsection`, the Pydantic schema shared with `simplex-
|
|
147
|
+
| `simplex.manifest` | `DeckManifest`, `MainSlide`, `Subsection`, the Pydantic schema shared with `simplex-web`. |
|
|
148
148
|
|
|
149
149
|
Additional focused helpers live in submodules such as
|
|
150
150
|
`simplex.engine.glyph_map`, `simplex.engine.code`,
|
|
@@ -154,7 +154,7 @@ Additional focused helpers live in submodules such as
|
|
|
154
154
|
## Slide Hierarchy
|
|
155
155
|
|
|
156
156
|
`BaseSlide.next_slide` writes Simplex section types into Manim's native
|
|
157
|
-
section JSON. The `simplex-
|
|
157
|
+
section JSON. The `simplex-web` builder later reconciles those
|
|
158
158
|
sections with manim-slides metadata.
|
|
159
159
|
|
|
160
160
|
```python
|
|
@@ -177,15 +177,14 @@ web portal.
|
|
|
177
177
|
```python
|
|
178
178
|
from manim import Tex
|
|
179
179
|
|
|
180
|
-
from simplex
|
|
181
|
-
from simplex.theme.context import active_theme
|
|
180
|
+
from simplex import active_theme, presets
|
|
182
181
|
|
|
183
182
|
|
|
184
183
|
with active_theme(presets.ACADEMIC_LIGHT):
|
|
185
184
|
label = Tex("This Tex uses the academic light palette.")
|
|
186
185
|
```
|
|
187
186
|
|
|
188
|
-
Available presets include `
|
|
187
|
+
Available presets include `SIMPLEX_DARK` and `ACADEMIC_LIGHT`.
|
|
189
188
|
|
|
190
189
|
## Outline Slides
|
|
191
190
|
|
|
@@ -195,8 +194,7 @@ slide with progress indicators.
|
|
|
195
194
|
```python
|
|
196
195
|
from manim import Circle, Square, Tex
|
|
197
196
|
|
|
198
|
-
from simplex
|
|
199
|
-
from simplex.slides import OutlinePart, OutlineScene
|
|
197
|
+
from simplex import Caption, OutlinePart, OutlineScene
|
|
200
198
|
|
|
201
199
|
|
|
202
200
|
class Outline(OutlineScene):
|
|
@@ -225,21 +223,22 @@ uv run manim-slides render examples/outline_slide.py OutlineDemo
|
|
|
225
223
|
The examples directory has its own `manim.cfg`, so the Simplex plugin is
|
|
226
224
|
enabled when commands are run from the repository root.
|
|
227
225
|
|
|
228
|
-
## Relationship To `simplex-
|
|
226
|
+
## Relationship To `simplex-web`
|
|
229
227
|
|
|
230
228
|
Simplex is split into two PyPI distributions:
|
|
231
229
|
|
|
232
230
|
| Distribution | Import namespace | Purpose |
|
|
233
231
|
| --- | --- | --- |
|
|
234
232
|
| `manim-simplex` | `simplex.*` | Manim plugin, slide bases, theme, mobjects, manifest schema. |
|
|
235
|
-
| `simplex-
|
|
233
|
+
| `simplex-web` | `simplex.*` | CLI, deck discovery, render orchestration, and static web portal. |
|
|
236
234
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
235
|
+
`manim-simplex` provides a lightweight `simplex.__init__` facade so deck
|
|
236
|
+
authors can write imports such as `from simplex import BaseSlide, Caption`.
|
|
237
|
+
The facade extends the package path for `simplex-web`, so `simplex.web`,
|
|
238
|
+
`simplex.deck`, and the CLI-side modules continue to compose with it.
|
|
240
239
|
|
|
241
240
|
Install only `manim-simplex` if you want to render scenes and slides.
|
|
242
|
-
Install `simplex-
|
|
241
|
+
Install `simplex-web` later when you want the full lecture portal and CLI.
|
|
243
242
|
|
|
244
243
|
## Development
|
|
245
244
|
|
|
@@ -276,7 +275,7 @@ Publishing. To release a new version:
|
|
|
276
275
|
1. Update `version` in `pyproject.toml`.
|
|
277
276
|
2. Move changelog entries under a dated release heading.
|
|
278
277
|
3. Commit the release prep.
|
|
279
|
-
4. Push an annotated tag such as `v0.2.
|
|
278
|
+
4. Push an annotated tag such as `v0.2.3`.
|
|
280
279
|
|
|
281
280
|
The `Publish to PyPI` workflow builds an sdist and wheel, checks both
|
|
282
281
|
with Twine, uploads them as a GitHub artifact, and publishes to PyPI via
|
|
@@ -3,14 +3,14 @@
|
|
|
3
3
|
[](https://pypi.org/project/manim-simplex/)
|
|
4
4
|
[](https://pypi.org/project/manim-simplex/)
|
|
5
5
|
[](https://github.com/shlomi-perles/manim-simplex/actions/workflows/ci.yml)
|
|
6
|
-
[](https://github.com/shlomi-perles/manim-simplex/blob/main/LICENSE)
|
|
7
7
|
|
|
8
8
|
`manim-simplex` is the Manim plugin layer for Simplex: theme tokens,
|
|
9
9
|
slide bases, reusable mobjects, animation helpers, and the shared deck
|
|
10
10
|
manifest schema used by the Simplex web builder.
|
|
11
11
|
|
|
12
|
-
It is published as `manim-simplex` and exposes
|
|
13
|
-
|
|
12
|
+
It is published as `manim-simplex` and exposes the `simplex` Manim authoring
|
|
13
|
+
API.
|
|
14
14
|
|
|
15
15
|
## Requirements
|
|
16
16
|
|
|
@@ -61,15 +61,14 @@ color, and enables section JSON output.
|
|
|
61
61
|
```python
|
|
62
62
|
from manim import ORIGIN, MathTex, Write
|
|
63
63
|
|
|
64
|
-
from simplex
|
|
65
|
-
from simplex.theme import presets
|
|
64
|
+
from simplex import BaseSlide, make_chrome, presets
|
|
66
65
|
|
|
67
66
|
|
|
68
67
|
class HelloSlide(BaseSlide):
|
|
69
68
|
def setup(self) -> None:
|
|
70
69
|
super().setup()
|
|
71
70
|
chrome = make_chrome(
|
|
72
|
-
presets.
|
|
71
|
+
presets.SIMPLEX_DARK,
|
|
73
72
|
self.region,
|
|
74
73
|
header="Hello, Simplex",
|
|
75
74
|
)
|
|
@@ -109,10 +108,10 @@ uv run manim-slides present HelloSlide
|
|
|
109
108
|
| `simplex.plugin` | `activate()` entry point used by Manim. |
|
|
110
109
|
| `simplex.slides` | `BaseSlide`, `OutlineScene`, `OutlinePart`, `Chrome`, `make_chrome`. |
|
|
111
110
|
| `simplex.engine` | `Region`, `Remove`, `clear_scene`, `exit_for`, `register_exit`, `set_exit_animation`, `HighlightResult`, `apply_theme_defaults`. |
|
|
112
|
-
| `simplex.mobjects` | `Node`, `Edge`, `ArrayMob`, `ArrayEntry`, `ArrayPointer`, `OutlineProgressBar`. |
|
|
111
|
+
| `simplex.mobjects` | `Node`, `Edge`, `ArrayMob`, `ArrayEntry`, `ArrayPointer`, `OutlineProgressBar`, `Paper`, `ShowPaper`, `DismissPaper`, `PickPage`. |
|
|
113
112
|
| `simplex.theme` | `Theme`, `Palette`, `Typography`, `Spacing`, `Motion`, `LatexProfile`, `WebPalette`, `active_theme`, `get_active_theme`, `presets`, `render_web_css`. |
|
|
114
113
|
| `simplex.section` | `SimplexSectionType`, the section strings written into Manim section JSON. |
|
|
115
|
-
| `simplex.manifest` | `DeckManifest`, `MainSlide`, `Subsection`, the Pydantic schema shared with `simplex-
|
|
114
|
+
| `simplex.manifest` | `DeckManifest`, `MainSlide`, `Subsection`, the Pydantic schema shared with `simplex-web`. |
|
|
116
115
|
|
|
117
116
|
Additional focused helpers live in submodules such as
|
|
118
117
|
`simplex.engine.glyph_map`, `simplex.engine.code`,
|
|
@@ -122,7 +121,7 @@ Additional focused helpers live in submodules such as
|
|
|
122
121
|
## Slide Hierarchy
|
|
123
122
|
|
|
124
123
|
`BaseSlide.next_slide` writes Simplex section types into Manim's native
|
|
125
|
-
section JSON. The `simplex-
|
|
124
|
+
section JSON. The `simplex-web` builder later reconciles those
|
|
126
125
|
sections with manim-slides metadata.
|
|
127
126
|
|
|
128
127
|
```python
|
|
@@ -145,15 +144,14 @@ web portal.
|
|
|
145
144
|
```python
|
|
146
145
|
from manim import Tex
|
|
147
146
|
|
|
148
|
-
from simplex
|
|
149
|
-
from simplex.theme.context import active_theme
|
|
147
|
+
from simplex import active_theme, presets
|
|
150
148
|
|
|
151
149
|
|
|
152
150
|
with active_theme(presets.ACADEMIC_LIGHT):
|
|
153
151
|
label = Tex("This Tex uses the academic light palette.")
|
|
154
152
|
```
|
|
155
153
|
|
|
156
|
-
Available presets include `
|
|
154
|
+
Available presets include `SIMPLEX_DARK` and `ACADEMIC_LIGHT`.
|
|
157
155
|
|
|
158
156
|
## Outline Slides
|
|
159
157
|
|
|
@@ -163,8 +161,7 @@ slide with progress indicators.
|
|
|
163
161
|
```python
|
|
164
162
|
from manim import Circle, Square, Tex
|
|
165
163
|
|
|
166
|
-
from simplex
|
|
167
|
-
from simplex.slides import OutlinePart, OutlineScene
|
|
164
|
+
from simplex import Caption, OutlinePart, OutlineScene
|
|
168
165
|
|
|
169
166
|
|
|
170
167
|
class Outline(OutlineScene):
|
|
@@ -193,21 +190,22 @@ uv run manim-slides render examples/outline_slide.py OutlineDemo
|
|
|
193
190
|
The examples directory has its own `manim.cfg`, so the Simplex plugin is
|
|
194
191
|
enabled when commands are run from the repository root.
|
|
195
192
|
|
|
196
|
-
## Relationship To `simplex-
|
|
193
|
+
## Relationship To `simplex-web`
|
|
197
194
|
|
|
198
195
|
Simplex is split into two PyPI distributions:
|
|
199
196
|
|
|
200
197
|
| Distribution | Import namespace | Purpose |
|
|
201
198
|
| --- | --- | --- |
|
|
202
199
|
| `manim-simplex` | `simplex.*` | Manim plugin, slide bases, theme, mobjects, manifest schema. |
|
|
203
|
-
| `simplex-
|
|
200
|
+
| `simplex-web` | `simplex.*` | CLI, deck discovery, render orchestration, and static web portal. |
|
|
204
201
|
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
202
|
+
`manim-simplex` provides a lightweight `simplex.__init__` facade so deck
|
|
203
|
+
authors can write imports such as `from simplex import BaseSlide, Caption`.
|
|
204
|
+
The facade extends the package path for `simplex-web`, so `simplex.web`,
|
|
205
|
+
`simplex.deck`, and the CLI-side modules continue to compose with it.
|
|
208
206
|
|
|
209
207
|
Install only `manim-simplex` if you want to render scenes and slides.
|
|
210
|
-
Install `simplex-
|
|
208
|
+
Install `simplex-web` later when you want the full lecture portal and CLI.
|
|
211
209
|
|
|
212
210
|
## Development
|
|
213
211
|
|
|
@@ -244,7 +242,7 @@ Publishing. To release a new version:
|
|
|
244
242
|
1. Update `version` in `pyproject.toml`.
|
|
245
243
|
2. Move changelog entries under a dated release heading.
|
|
246
244
|
3. Commit the release prep.
|
|
247
|
-
4. Push an annotated tag such as `v0.2.
|
|
245
|
+
4. Push an annotated tag such as `v0.2.3`.
|
|
248
246
|
|
|
249
247
|
The `Publish to PyPI` workflow builds an sdist and wheel, checks both
|
|
250
248
|
with Twine, uploads them as a GitHub artifact, and publishes to PyPI via
|
|
@@ -13,14 +13,13 @@ Demonstrates:
|
|
|
13
13
|
|
|
14
14
|
from manim import ORIGIN, MathTex, Write
|
|
15
15
|
|
|
16
|
-
from simplex
|
|
17
|
-
from simplex.theme import presets
|
|
16
|
+
from simplex import BaseSlide, make_chrome, presets
|
|
18
17
|
|
|
19
18
|
|
|
20
19
|
class HelloSlide(BaseSlide):
|
|
21
20
|
def setup(self) -> None:
|
|
22
21
|
super().setup()
|
|
23
|
-
chrome = make_chrome(presets.
|
|
22
|
+
chrome = make_chrome(presets.SIMPLEX_DARK, self.region, header="Hello, Simplex")
|
|
24
23
|
self.add_to_canvas(**chrome.mobjects)
|
|
25
24
|
self.region = chrome.body_region
|
|
26
25
|
|
|
@@ -8,13 +8,12 @@ proof).
|
|
|
8
8
|
|
|
9
9
|
from manim import FadeIn, Scene, Tex
|
|
10
10
|
|
|
11
|
-
from simplex
|
|
12
|
-
from simplex.theme.context import active_theme
|
|
11
|
+
from simplex import active_theme, presets
|
|
13
12
|
|
|
14
13
|
|
|
15
14
|
class ThemeDemo(Scene):
|
|
16
15
|
def construct(self) -> None:
|
|
17
|
-
with active_theme(presets.
|
|
16
|
+
with active_theme(presets.SIMPLEX_DARK):
|
|
18
17
|
dark_label = Tex("dark theme")
|
|
19
18
|
with active_theme(presets.ACADEMIC_LIGHT):
|
|
20
19
|
light_label = Tex("light theme")
|
|
@@ -33,6 +33,7 @@ dependencies = [
|
|
|
33
33
|
"manim-slides>=5.1.7",
|
|
34
34
|
"pydantic>=2.7",
|
|
35
35
|
"pygments>=2.18",
|
|
36
|
+
"pymupdf>=1.27.2.3",
|
|
36
37
|
]
|
|
37
38
|
description = "Manim plugin: theme tokens, mobjects, slide hierarchy, deck manifest schema."
|
|
38
39
|
keywords = [
|
|
@@ -50,7 +51,7 @@ license-files = ["LICENSE"]
|
|
|
50
51
|
name = "manim-simplex"
|
|
51
52
|
readme = "README.md"
|
|
52
53
|
requires-python = ">=3.13"
|
|
53
|
-
version = "0.2.
|
|
54
|
+
version = "0.2.3"
|
|
54
55
|
|
|
55
56
|
[project.entry-points."manim.plugins"]
|
|
56
57
|
simplex = "simplex.plugin:activate"
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"""Convenience imports for the Manim Simplex authoring API.
|
|
2
|
+
|
|
3
|
+
The package also participates in the shared ``simplex.*`` namespace used by
|
|
4
|
+
``simplex-web``. Keep this module light: exported objects are loaded lazily so
|
|
5
|
+
``import simplex.web`` does not eagerly import Manim.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
# ruff: noqa: F401
|
|
9
|
+
# pyright: reportUnsupportedDunderAll=false, reportUnusedImport=false
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
from importlib import import_module
|
|
14
|
+
from pkgutil import extend_path
|
|
15
|
+
from typing import TYPE_CHECKING, Any
|
|
16
|
+
|
|
17
|
+
__path__ = extend_path(__path__, __name__) # type: ignore[name-defined]
|
|
18
|
+
|
|
19
|
+
_EXPORTS: dict[str, str] = {
|
|
20
|
+
"ArrayEntry": "simplex.mobjects",
|
|
21
|
+
"ArrayMob": "simplex.mobjects",
|
|
22
|
+
"ArrayPointer": "simplex.mobjects",
|
|
23
|
+
"BaseSlide": "simplex.slides",
|
|
24
|
+
"Caption": "simplex.engine.text",
|
|
25
|
+
"Chrome": "simplex.slides",
|
|
26
|
+
"DN": "simplex.engine.dynamics",
|
|
27
|
+
"DeckManifest": "simplex.manifest",
|
|
28
|
+
"DismissPaper": "simplex.mobjects",
|
|
29
|
+
"Edge": "simplex.mobjects",
|
|
30
|
+
"GhostSlideFade": "simplex.engine.ghost_fade",
|
|
31
|
+
"HighlightResult": "simplex.engine",
|
|
32
|
+
"MainSlide": "simplex.manifest",
|
|
33
|
+
"Node": "simplex.mobjects",
|
|
34
|
+
"OutlinePart": "simplex.slides",
|
|
35
|
+
"OutlineProgressBar": "simplex.mobjects",
|
|
36
|
+
"OutlineScene": "simplex.slides",
|
|
37
|
+
"Paper": "simplex.mobjects",
|
|
38
|
+
"PickPage": "simplex.mobjects",
|
|
39
|
+
"Region": "simplex.engine",
|
|
40
|
+
"Remove": "simplex.engine",
|
|
41
|
+
"SIMPLEX_DARK": "simplex.theme.presets",
|
|
42
|
+
"ShowPaper": "simplex.mobjects",
|
|
43
|
+
"SimplexSectionType": "simplex.section",
|
|
44
|
+
"Subsection": "simplex.manifest",
|
|
45
|
+
"TexPage": "simplex.engine.text",
|
|
46
|
+
"TransformByGlyphMap": "simplex.engine.glyph_map",
|
|
47
|
+
"VT": "simplex.engine.dynamics",
|
|
48
|
+
"active_theme": "simplex.theme",
|
|
49
|
+
"apply_theme_defaults": "simplex.engine",
|
|
50
|
+
"bounding_box": "simplex.engine.debug",
|
|
51
|
+
"clear_scene": "simplex.engine",
|
|
52
|
+
"code_block": "simplex.engine.code",
|
|
53
|
+
"code_explain": "simplex.engine.code",
|
|
54
|
+
"code_with_math": "simplex.engine.code",
|
|
55
|
+
"color_tex": "simplex.engine.text",
|
|
56
|
+
"debug_glyph": "simplex.engine.debug",
|
|
57
|
+
"debug_glyphs": "simplex.engine.debug",
|
|
58
|
+
"exit_for": "simplex.engine",
|
|
59
|
+
"get_active_theme": "simplex.theme",
|
|
60
|
+
"get_convex_hull_polygon": "simplex.engine.geometry",
|
|
61
|
+
"get_frame_center": "simplex.engine.geometry",
|
|
62
|
+
"get_surrounding_rectangle": "simplex.engine.geometry",
|
|
63
|
+
"highlight_code_lines": "simplex.engine.code",
|
|
64
|
+
"indexx_labels": "simplex.engine.debug",
|
|
65
|
+
"keep_orientation": "simplex.engine.dynamics",
|
|
66
|
+
"maintain_apparent_stroke_width": "simplex.engine.dynamics",
|
|
67
|
+
"make_chrome": "simplex.slides",
|
|
68
|
+
"presets": "simplex.theme",
|
|
69
|
+
"register_exit": "simplex.engine",
|
|
70
|
+
"scale_to_fit": "simplex.engine.scaling",
|
|
71
|
+
"scale_to_fit_mobject": "simplex.engine.scaling",
|
|
72
|
+
"scale_with_stroke_width": "simplex.engine.scaling",
|
|
73
|
+
"search_shape_in_text": "simplex.engine.text",
|
|
74
|
+
"set_exit_animation": "simplex.engine",
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
__all__ = sorted(_EXPORTS)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def __getattr__(name: str) -> Any:
|
|
81
|
+
if name not in _EXPORTS:
|
|
82
|
+
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
83
|
+
module = import_module(_EXPORTS[name])
|
|
84
|
+
value = getattr(module, name)
|
|
85
|
+
globals()[name] = value
|
|
86
|
+
return value
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def __dir__() -> list[str]:
|
|
90
|
+
return sorted(set(globals()) | set(__all__))
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
if TYPE_CHECKING:
|
|
94
|
+
from simplex.engine import (
|
|
95
|
+
HighlightResult,
|
|
96
|
+
Region,
|
|
97
|
+
Remove,
|
|
98
|
+
apply_theme_defaults,
|
|
99
|
+
clear_scene,
|
|
100
|
+
exit_for,
|
|
101
|
+
register_exit,
|
|
102
|
+
set_exit_animation,
|
|
103
|
+
)
|
|
104
|
+
from simplex.engine.code import (
|
|
105
|
+
code_block,
|
|
106
|
+
code_explain,
|
|
107
|
+
code_with_math,
|
|
108
|
+
highlight_code_lines,
|
|
109
|
+
)
|
|
110
|
+
from simplex.engine.debug import bounding_box, debug_glyph, debug_glyphs, indexx_labels
|
|
111
|
+
from simplex.engine.dynamics import DN, VT, keep_orientation, maintain_apparent_stroke_width
|
|
112
|
+
from simplex.engine.geometry import (
|
|
113
|
+
get_convex_hull_polygon,
|
|
114
|
+
get_frame_center,
|
|
115
|
+
get_surrounding_rectangle,
|
|
116
|
+
)
|
|
117
|
+
from simplex.engine.ghost_fade import GhostSlideFade
|
|
118
|
+
from simplex.engine.glyph_map import TransformByGlyphMap
|
|
119
|
+
from simplex.engine.scaling import scale_to_fit, scale_to_fit_mobject, scale_with_stroke_width
|
|
120
|
+
from simplex.engine.text import Caption, TexPage, color_tex, search_shape_in_text
|
|
121
|
+
from simplex.manifest import DeckManifest, MainSlide, Subsection
|
|
122
|
+
from simplex.mobjects import (
|
|
123
|
+
ArrayEntry,
|
|
124
|
+
ArrayMob,
|
|
125
|
+
ArrayPointer,
|
|
126
|
+
DismissPaper,
|
|
127
|
+
Edge,
|
|
128
|
+
Node,
|
|
129
|
+
OutlineProgressBar,
|
|
130
|
+
Paper,
|
|
131
|
+
PickPage,
|
|
132
|
+
ShowPaper,
|
|
133
|
+
)
|
|
134
|
+
from simplex.section import SimplexSectionType
|
|
135
|
+
from simplex.slides import BaseSlide, Chrome, OutlinePart, OutlineScene, make_chrome
|
|
136
|
+
from simplex.theme import active_theme, get_active_theme, presets
|
|
137
|
+
from simplex.theme.presets import SIMPLEX_DARK
|
|
@@ -66,10 +66,16 @@ class _DefaultRegistry:
|
|
|
66
66
|
VMobject,
|
|
67
67
|
)
|
|
68
68
|
|
|
69
|
+
from simplex.mobjects.paper import DismissPaper, Paper
|
|
70
|
+
|
|
69
71
|
def fade_with_drift(m: Any, **kw: Any) -> Any:
|
|
70
72
|
return FadeOut(m, shift=0.1 * DOWN, **kw)
|
|
71
73
|
|
|
74
|
+
def paper_exit(m: Any, **kw: Any) -> Any:
|
|
75
|
+
return DismissPaper(m, **kw)
|
|
76
|
+
|
|
72
77
|
return {
|
|
78
|
+
Paper: paper_exit,
|
|
73
79
|
Tex: Unwrite,
|
|
74
80
|
MathTex: Unwrite,
|
|
75
81
|
Text: Unwrite,
|
|
@@ -6,7 +6,7 @@ Wraps :class:`manim.Code` (the Pygments-backed listing) and exposes its
|
|
|
6
6
|
``inline_math_in_code`` / ``code_with_math`` rewrite ``$...$`` regions in
|
|
7
7
|
each line into rendered ``MathTex`` glyphs after Pygments has already
|
|
8
8
|
highlighted the surrounding code. This is the modern replacement for the
|
|
9
|
-
old
|
|
9
|
+
old Simplex ``compile_code_tex`` helper -- it relies on Manim
|
|
10
10
|
0.20.x's ``Code.code_lines`` glyph order and reflows each line so the
|
|
11
11
|
math width drives the final layout.
|
|
12
12
|
"""
|
|
@@ -9,5 +9,17 @@ slide system.
|
|
|
9
9
|
from simplex.mobjects.array import ArrayEntry, ArrayMob, ArrayPointer
|
|
10
10
|
from simplex.mobjects.graph import Edge, Node
|
|
11
11
|
from simplex.mobjects.outline import OutlineProgressBar
|
|
12
|
+
from simplex.mobjects.paper import DismissPaper, Paper, PickPage, ShowPaper
|
|
12
13
|
|
|
13
|
-
__all__ = [
|
|
14
|
+
__all__ = [
|
|
15
|
+
"ArrayEntry",
|
|
16
|
+
"ArrayMob",
|
|
17
|
+
"ArrayPointer",
|
|
18
|
+
"DismissPaper",
|
|
19
|
+
"Edge",
|
|
20
|
+
"Node",
|
|
21
|
+
"OutlineProgressBar",
|
|
22
|
+
"Paper",
|
|
23
|
+
"PickPage",
|
|
24
|
+
"ShowPaper",
|
|
25
|
+
]
|