manim-simplex 0.2.2__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.2 → manim_simplex-0.2.3}/CHANGELOG.md +12 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/PKG-INFO +20 -22
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/README.md +19 -21
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/examples/hello_slide.py +2 -3
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/examples/outline_slide.py +1 -2
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/examples/theme_demo.py +2 -3
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/pyproject.toml +1 -1
- manim_simplex-0.2.3/src/simplex/__init__.py +137 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/code.py +1 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/mobjects/array.py +1 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/mobjects/graph.py +1 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/plugin.py +3 -3
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/README.md +2 -2
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/__init__.py +2 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/context.py +3 -3
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/presets.py +4 -4
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/pygments_style.py +1 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_text.py +7 -7
- {manim_simplex-0.2.2 → 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.2 → manim_simplex-0.2.3}/tests/theme/README.md +1 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/theme/test_tokens.py +11 -11
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/uv.lock +1 -1
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/.gitignore +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/.pre-commit-config.yaml +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/.python-version +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/LICENSE +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/examples/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/examples/glyph_map_demo.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/examples/manim.cfg +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/ruff.toml +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/animations.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/debug.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/defaults.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/dynamics.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/geometry.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/ghost_fade.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/glyph_map.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/region.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/scaling.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/engine/text.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/manifest.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/mobjects/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/mobjects/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/mobjects/outline.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/mobjects/paper.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/py.typed +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/section.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/slides/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/slides/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/slides/base.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/slides/chrome.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/slides/outline.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/tokens.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/src/simplex/theme/web_css.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_animations.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_code.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_debug.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_dynamics.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_geometry.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_ghost_fade.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_glyph_map.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_region.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/engine/test_scaling.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/mobjects/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/mobjects/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/mobjects/test_graph.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/mobjects/test_outline.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/mobjects/test_paper.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/slides/README.md +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/slides/__init__.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/slides/test_base.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/slides/test_outline.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/test_manifest.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/test_section.py +0 -0
- {manim_simplex-0.2.2 → manim_simplex-0.2.3}/tests/theme/__init__.py +0 -0
- {manim_simplex-0.2.2 → 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
|
|
@@ -36,14 +36,14 @@ Description-Content-Type: text/markdown
|
|
|
36
36
|
[](https://pypi.org/project/manim-simplex/)
|
|
37
37
|
[](https://pypi.org/project/manim-simplex/)
|
|
38
38
|
[](https://github.com/shlomi-perles/manim-simplex/actions/workflows/ci.yml)
|
|
39
|
-
[](https://github.com/shlomi-perles/manim-simplex/blob/main/LICENSE)
|
|
40
40
|
|
|
41
41
|
`manim-simplex` is the Manim plugin layer for Simplex: theme tokens,
|
|
42
42
|
slide bases, reusable mobjects, animation helpers, and the shared deck
|
|
43
43
|
manifest schema used by the Simplex web builder.
|
|
44
44
|
|
|
45
|
-
It is published as `manim-simplex` and exposes
|
|
46
|
-
|
|
45
|
+
It is published as `manim-simplex` and exposes the `simplex` Manim authoring
|
|
46
|
+
API.
|
|
47
47
|
|
|
48
48
|
## Requirements
|
|
49
49
|
|
|
@@ -94,15 +94,14 @@ color, and enables section JSON output.
|
|
|
94
94
|
```python
|
|
95
95
|
from manim import ORIGIN, MathTex, Write
|
|
96
96
|
|
|
97
|
-
from simplex
|
|
98
|
-
from simplex.theme import presets
|
|
97
|
+
from simplex import BaseSlide, make_chrome, presets
|
|
99
98
|
|
|
100
99
|
|
|
101
100
|
class HelloSlide(BaseSlide):
|
|
102
101
|
def setup(self) -> None:
|
|
103
102
|
super().setup()
|
|
104
103
|
chrome = make_chrome(
|
|
105
|
-
presets.
|
|
104
|
+
presets.SIMPLEX_DARK,
|
|
106
105
|
self.region,
|
|
107
106
|
header="Hello, Simplex",
|
|
108
107
|
)
|
|
@@ -142,10 +141,10 @@ uv run manim-slides present HelloSlide
|
|
|
142
141
|
| `simplex.plugin` | `activate()` entry point used by Manim. |
|
|
143
142
|
| `simplex.slides` | `BaseSlide`, `OutlineScene`, `OutlinePart`, `Chrome`, `make_chrome`. |
|
|
144
143
|
| `simplex.engine` | `Region`, `Remove`, `clear_scene`, `exit_for`, `register_exit`, `set_exit_animation`, `HighlightResult`, `apply_theme_defaults`. |
|
|
145
|
-
| `simplex.mobjects` | `Node`, `Edge`, `ArrayMob`, `ArrayEntry`, `ArrayPointer`, `OutlineProgressBar`. |
|
|
144
|
+
| `simplex.mobjects` | `Node`, `Edge`, `ArrayMob`, `ArrayEntry`, `ArrayPointer`, `OutlineProgressBar`, `Paper`, `ShowPaper`, `DismissPaper`, `PickPage`. |
|
|
146
145
|
| `simplex.theme` | `Theme`, `Palette`, `Typography`, `Spacing`, `Motion`, `LatexProfile`, `WebPalette`, `active_theme`, `get_active_theme`, `presets`, `render_web_css`. |
|
|
147
146
|
| `simplex.section` | `SimplexSectionType`, the section strings written into Manim section JSON. |
|
|
148
|
-
| `simplex.manifest` | `DeckManifest`, `MainSlide`, `Subsection`, the Pydantic schema shared with `simplex-
|
|
147
|
+
| `simplex.manifest` | `DeckManifest`, `MainSlide`, `Subsection`, the Pydantic schema shared with `simplex-web`. |
|
|
149
148
|
|
|
150
149
|
Additional focused helpers live in submodules such as
|
|
151
150
|
`simplex.engine.glyph_map`, `simplex.engine.code`,
|
|
@@ -155,7 +154,7 @@ Additional focused helpers live in submodules such as
|
|
|
155
154
|
## Slide Hierarchy
|
|
156
155
|
|
|
157
156
|
`BaseSlide.next_slide` writes Simplex section types into Manim's native
|
|
158
|
-
section JSON. The `simplex-
|
|
157
|
+
section JSON. The `simplex-web` builder later reconciles those
|
|
159
158
|
sections with manim-slides metadata.
|
|
160
159
|
|
|
161
160
|
```python
|
|
@@ -178,15 +177,14 @@ web portal.
|
|
|
178
177
|
```python
|
|
179
178
|
from manim import Tex
|
|
180
179
|
|
|
181
|
-
from simplex
|
|
182
|
-
from simplex.theme.context import active_theme
|
|
180
|
+
from simplex import active_theme, presets
|
|
183
181
|
|
|
184
182
|
|
|
185
183
|
with active_theme(presets.ACADEMIC_LIGHT):
|
|
186
184
|
label = Tex("This Tex uses the academic light palette.")
|
|
187
185
|
```
|
|
188
186
|
|
|
189
|
-
Available presets include `
|
|
187
|
+
Available presets include `SIMPLEX_DARK` and `ACADEMIC_LIGHT`.
|
|
190
188
|
|
|
191
189
|
## Outline Slides
|
|
192
190
|
|
|
@@ -196,8 +194,7 @@ slide with progress indicators.
|
|
|
196
194
|
```python
|
|
197
195
|
from manim import Circle, Square, Tex
|
|
198
196
|
|
|
199
|
-
from simplex
|
|
200
|
-
from simplex.slides import OutlinePart, OutlineScene
|
|
197
|
+
from simplex import Caption, OutlinePart, OutlineScene
|
|
201
198
|
|
|
202
199
|
|
|
203
200
|
class Outline(OutlineScene):
|
|
@@ -226,21 +223,22 @@ uv run manim-slides render examples/outline_slide.py OutlineDemo
|
|
|
226
223
|
The examples directory has its own `manim.cfg`, so the Simplex plugin is
|
|
227
224
|
enabled when commands are run from the repository root.
|
|
228
225
|
|
|
229
|
-
## Relationship To `simplex-
|
|
226
|
+
## Relationship To `simplex-web`
|
|
230
227
|
|
|
231
228
|
Simplex is split into two PyPI distributions:
|
|
232
229
|
|
|
233
230
|
| Distribution | Import namespace | Purpose |
|
|
234
231
|
| --- | --- | --- |
|
|
235
232
|
| `manim-simplex` | `simplex.*` | Manim plugin, slide bases, theme, mobjects, manifest schema. |
|
|
236
|
-
| `simplex-
|
|
233
|
+
| `simplex-web` | `simplex.*` | CLI, deck discovery, render orchestration, and static web portal. |
|
|
237
234
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
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.
|
|
241
239
|
|
|
242
240
|
Install only `manim-simplex` if you want to render scenes and slides.
|
|
243
|
-
Install `simplex-
|
|
241
|
+
Install `simplex-web` later when you want the full lecture portal and CLI.
|
|
244
242
|
|
|
245
243
|
## Development
|
|
246
244
|
|
|
@@ -277,7 +275,7 @@ Publishing. To release a new version:
|
|
|
277
275
|
1. Update `version` in `pyproject.toml`.
|
|
278
276
|
2. Move changelog entries under a dated release heading.
|
|
279
277
|
3. Commit the release prep.
|
|
280
|
-
4. Push an annotated tag such as `v0.2.
|
|
278
|
+
4. Push an annotated tag such as `v0.2.3`.
|
|
281
279
|
|
|
282
280
|
The `Publish to PyPI` workflow builds an sdist and wheel, checks both
|
|
283
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")
|
|
@@ -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
|
|
@@ -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
|
"""
|
|
@@ -25,7 +25,7 @@ Theme selection priority:
|
|
|
25
25
|
2. ``SIMPLEX_THEME`` environment variable -- the deck.toml ``theme`` name
|
|
26
26
|
propagated across the ``manim-slides render`` subprocess by
|
|
27
27
|
``simplex.render.runner``.
|
|
28
|
-
3. ``
|
|
28
|
+
3. ``SIMPLEX_DARK`` -- the package default.
|
|
29
29
|
"""
|
|
30
30
|
|
|
31
31
|
from __future__ import annotations
|
|
@@ -36,7 +36,7 @@ import os
|
|
|
36
36
|
def _resolve_theme(): # type: ignore[no-untyped-def]
|
|
37
37
|
"""Pick the theme that should drive Manim defaults for this process."""
|
|
38
38
|
from simplex.theme.context import _active
|
|
39
|
-
from simplex.theme.presets import
|
|
39
|
+
from simplex.theme.presets import PRESETS, SIMPLEX_DARK
|
|
40
40
|
|
|
41
41
|
# In-process context (a parent that did ``with active_theme(t): ...``)
|
|
42
42
|
# wins; env-var fallback handles cross-process propagation.
|
|
@@ -45,7 +45,7 @@ def _resolve_theme(): # type: ignore[no-untyped-def]
|
|
|
45
45
|
env_name = os.environ.get("SIMPLEX_THEME")
|
|
46
46
|
if env_name and env_name in PRESETS:
|
|
47
47
|
return PRESETS[env_name]
|
|
48
|
-
return
|
|
48
|
+
return SIMPLEX_DARK
|
|
49
49
|
|
|
50
50
|
|
|
51
51
|
def activate() -> None:
|
|
@@ -6,9 +6,9 @@ palette) plus a ContextVar-based active-theme registry.
|
|
|
6
6
|
## Public surface
|
|
7
7
|
|
|
8
8
|
- `Theme`, `Palette`, `Typography`, `Spacing`, `Motion`, `LatexProfile`, `WebPalette`
|
|
9
|
-
- `presets.
|
|
9
|
+
- `presets.SIMPLEX_DARK`, `presets.ACADEMIC_LIGHT`, `presets.get(name)`
|
|
10
10
|
- `active_theme(theme)` -- context manager
|
|
11
|
-
- `get_active_theme()` -- read the current theme (falls back to `
|
|
11
|
+
- `get_active_theme()` -- read the current theme (falls back to `SIMPLEX_DARK`)
|
|
12
12
|
- `render_web_css(palette)` -- emits a `:root { --simplex-* }` block for the portal and RevealJS pages
|
|
13
13
|
- `pygments_style.DarculaStyle`, `register_darcula(name="darcula")`
|
|
14
14
|
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from simplex.theme import presets
|
|
4
4
|
from simplex.theme.context import active_theme, get_active_theme
|
|
5
|
+
from simplex.theme.presets import SIMPLEX_DARK
|
|
5
6
|
from simplex.theme.tokens import (
|
|
6
7
|
LatexProfile,
|
|
7
8
|
Motion,
|
|
@@ -14,6 +15,7 @@ from simplex.theme.tokens import (
|
|
|
14
15
|
from simplex.theme.web_css import render_web_css
|
|
15
16
|
|
|
16
17
|
__all__ = [
|
|
18
|
+
"SIMPLEX_DARK",
|
|
17
19
|
"LatexProfile",
|
|
18
20
|
"Motion",
|
|
19
21
|
"Palette",
|
|
@@ -20,10 +20,10 @@ def active_theme(theme: Theme) -> Generator[Theme]:
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def get_active_theme() -> Theme:
|
|
23
|
-
"""Return the active theme, falling back to
|
|
23
|
+
"""Return the active theme, falling back to SIMPLEX_DARK."""
|
|
24
24
|
theme = _active.get()
|
|
25
25
|
if theme is None:
|
|
26
|
-
from simplex.theme.presets import
|
|
26
|
+
from simplex.theme.presets import SIMPLEX_DARK
|
|
27
27
|
|
|
28
|
-
return
|
|
28
|
+
return SIMPLEX_DARK
|
|
29
29
|
return theme
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Preset
|
|
1
|
+
"""Preset Simplex theme instances."""
|
|
2
2
|
|
|
3
3
|
from simplex.theme.tokens import LatexProfile, Palette, Theme, Typography, WebPalette
|
|
4
4
|
|
|
@@ -13,8 +13,8 @@ _COMPACT_DISPLAY_PREAMBLE = (
|
|
|
13
13
|
"\n"
|
|
14
14
|
)
|
|
15
15
|
|
|
16
|
-
|
|
17
|
-
name="
|
|
16
|
+
SIMPLEX_DARK: Theme = Theme(
|
|
17
|
+
name="simplex_dark",
|
|
18
18
|
palette=Palette(
|
|
19
19
|
background="#242424",
|
|
20
20
|
font="#FFFFFF",
|
|
@@ -74,7 +74,7 @@ ACADEMIC_LIGHT: Theme = Theme(
|
|
|
74
74
|
)
|
|
75
75
|
|
|
76
76
|
PRESETS: dict[str, Theme] = {
|
|
77
|
-
|
|
77
|
+
SIMPLEX_DARK.name: SIMPLEX_DARK,
|
|
78
78
|
ACADEMIC_LIGHT.name: ACADEMIC_LIGHT,
|
|
79
79
|
}
|
|
80
80
|
|
|
@@ -29,7 +29,7 @@ def register_darcula(style_name: str = "darcula") -> None:
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
class DarculaStyle(Style):
|
|
32
|
-
"""Pygments scheme inspired by JetBrains Darcula, ported from
|
|
32
|
+
"""Pygments scheme inspired by JetBrains Darcula, ported from Simplex."""
|
|
33
33
|
|
|
34
34
|
background_color = "#111111"
|
|
35
35
|
highlight_color = "#333333"
|
|
@@ -11,19 +11,19 @@ from simplex.theme.context import active_theme
|
|
|
11
11
|
|
|
12
12
|
|
|
13
13
|
def test_caption_uses_caption_font_size() -> None:
|
|
14
|
-
with active_theme(presets.
|
|
14
|
+
with active_theme(presets.SIMPLEX_DARK) as theme:
|
|
15
15
|
mob = Caption("hi")
|
|
16
16
|
assert mob.font_size == theme.typography.caption
|
|
17
17
|
|
|
18
18
|
|
|
19
19
|
def test_tex_page_default_width_is_20cm() -> None:
|
|
20
|
-
with active_theme(presets.
|
|
20
|
+
with active_theme(presets.SIMPLEX_DARK):
|
|
21
21
|
mob = TexPage("body")
|
|
22
22
|
assert mob.tex_environment == "{minipage}{20.0cm}"
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def test_tex_page_width_cm_kwarg_overrides_default() -> None:
|
|
26
|
-
with active_theme(presets.
|
|
26
|
+
with active_theme(presets.SIMPLEX_DARK):
|
|
27
27
|
mob = TexPage("body", width_cm=10.5)
|
|
28
28
|
assert mob.tex_environment == "{minipage}{10.5cm}"
|
|
29
29
|
|
|
@@ -32,7 +32,7 @@ def test_tex_page_subclass_class_attr_overrides_default() -> None:
|
|
|
32
32
|
class WidePage(TexPage):
|
|
33
33
|
width_cm = 12.0
|
|
34
34
|
|
|
35
|
-
with active_theme(presets.
|
|
35
|
+
with active_theme(presets.SIMPLEX_DARK):
|
|
36
36
|
mob = WidePage("body")
|
|
37
37
|
assert mob.tex_environment == "{minipage}{12.0cm}"
|
|
38
38
|
|
|
@@ -41,7 +41,7 @@ def test_tex_page_kwarg_wins_over_subclass_attr() -> None:
|
|
|
41
41
|
class WidePage(TexPage):
|
|
42
42
|
width_cm = 12.0
|
|
43
43
|
|
|
44
|
-
with active_theme(presets.
|
|
44
|
+
with active_theme(presets.SIMPLEX_DARK):
|
|
45
45
|
mob = WidePage("body", width_cm=6.5)
|
|
46
46
|
assert mob.tex_environment == "{minipage}{6.5cm}"
|
|
47
47
|
|
|
@@ -55,13 +55,13 @@ def test_plain_tex_picks_up_body_font_size_after_apply_defaults() -> None:
|
|
|
55
55
|
"""
|
|
56
56
|
from manim import Tex
|
|
57
57
|
|
|
58
|
-
with active_theme(presets.
|
|
58
|
+
with active_theme(presets.SIMPLEX_DARK) as theme:
|
|
59
59
|
apply_theme_defaults(theme)
|
|
60
60
|
mob = Tex("hi")
|
|
61
61
|
assert mob.font_size == theme.typography.body
|
|
62
62
|
|
|
63
63
|
|
|
64
64
|
def test_explicit_font_size_wins_over_theme_default() -> None:
|
|
65
|
-
with active_theme(presets.
|
|
65
|
+
with active_theme(presets.SIMPLEX_DARK):
|
|
66
66
|
mob = Caption("hi", font_size=12)
|
|
67
67
|
assert mob.font_size == 12
|
|
@@ -11,7 +11,7 @@ from simplex.theme import presets
|
|
|
11
11
|
|
|
12
12
|
def test_chrome_with_header_only() -> None:
|
|
13
13
|
region = Region.full_frame()
|
|
14
|
-
chrome = make_chrome(presets.
|
|
14
|
+
chrome = make_chrome(presets.SIMPLEX_DARK, region, header="Title")
|
|
15
15
|
assert isinstance(chrome, Chrome)
|
|
16
16
|
assert "header" in chrome.mobjects
|
|
17
17
|
assert "footer" not in chrome.mobjects
|
|
@@ -20,29 +20,29 @@ def test_chrome_with_header_only() -> None:
|
|
|
20
20
|
def test_chrome_does_not_mutate_input_region() -> None:
|
|
21
21
|
region = Region.full_frame()
|
|
22
22
|
original = (region.top, region.bottom, region.left, region.right)
|
|
23
|
-
make_chrome(presets.
|
|
23
|
+
make_chrome(presets.SIMPLEX_DARK, region, header="Title", footer="Footer")
|
|
24
24
|
assert (region.top, region.bottom, region.left, region.right) == original
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
def test_chrome_body_region_is_shrunk_below_header() -> None:
|
|
28
28
|
region = Region.full_frame()
|
|
29
|
-
chrome = make_chrome(presets.
|
|
30
|
-
expected_top = region.top - presets.
|
|
29
|
+
chrome = make_chrome(presets.SIMPLEX_DARK, region, header="Title")
|
|
30
|
+
expected_top = region.top - presets.SIMPLEX_DARK.spacing.header_height
|
|
31
31
|
assert chrome.body_region.top == pytest.approx(expected_top)
|
|
32
32
|
assert chrome.body_region.bottom == pytest.approx(region.bottom)
|
|
33
33
|
|
|
34
34
|
|
|
35
35
|
def test_chrome_body_region_is_shrunk_above_footer() -> None:
|
|
36
36
|
region = Region.full_frame()
|
|
37
|
-
chrome = make_chrome(presets.
|
|
38
|
-
expected_bottom = region.bottom + presets.
|
|
37
|
+
chrome = make_chrome(presets.SIMPLEX_DARK, region, footer="cite")
|
|
38
|
+
expected_bottom = region.bottom + presets.SIMPLEX_DARK.spacing.footer_height
|
|
39
39
|
assert chrome.body_region.bottom == pytest.approx(expected_bottom)
|
|
40
40
|
assert chrome.body_region.top == pytest.approx(region.top)
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def test_chrome_empty_call_yields_no_mobjects_and_unchanged_region() -> None:
|
|
44
44
|
region = Region.full_frame()
|
|
45
|
-
chrome = make_chrome(presets.
|
|
45
|
+
chrome = make_chrome(presets.SIMPLEX_DARK, region)
|
|
46
46
|
assert chrome.mobjects == {}
|
|
47
47
|
assert chrome.body_region.top == pytest.approx(region.top)
|
|
48
48
|
assert chrome.body_region.bottom == pytest.approx(region.bottom)
|
|
@@ -50,6 +50,6 @@ def test_chrome_empty_call_yields_no_mobjects_and_unchanged_region() -> None:
|
|
|
50
50
|
|
|
51
51
|
def test_chrome_unpacks_as_namedtuple() -> None:
|
|
52
52
|
region = Region.full_frame()
|
|
53
|
-
mobs, body = make_chrome(presets.
|
|
53
|
+
mobs, body = make_chrome(presets.SIMPLEX_DARK, region, header="t")
|
|
54
54
|
assert "header" in mobs
|
|
55
55
|
assert body.top < region.top
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"""Top-level authoring imports."""
|
|
2
|
+
|
|
3
|
+
from simplex import SIMPLEX_DARK, BaseSlide, Caption, Paper, ShowPaper, make_chrome, presets
|
|
4
|
+
from simplex.slides import BaseSlide as BaseSlideFromSlides
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def test_top_level_authoring_imports() -> None:
|
|
8
|
+
assert BaseSlide is BaseSlideFromSlides
|
|
9
|
+
assert Caption.__name__ == "Caption"
|
|
10
|
+
assert Paper.__name__ == "Paper"
|
|
11
|
+
assert ShowPaper.__name__ == "ShowPaper"
|
|
12
|
+
assert SIMPLEX_DARK is presets.SIMPLEX_DARK
|
|
13
|
+
assert callable(make_chrome)
|
|
@@ -7,44 +7,44 @@ from simplex.theme import presets
|
|
|
7
7
|
from simplex.theme.context import active_theme, get_active_theme
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
def
|
|
11
|
-
assert presets.
|
|
10
|
+
def test_simplex_palette_background() -> None:
|
|
11
|
+
assert presets.SIMPLEX_DARK.palette.background == "#242424"
|
|
12
12
|
|
|
13
13
|
|
|
14
|
-
def
|
|
14
|
+
def test_simplex_latex_has_no_legacy_environments() -> None:
|
|
15
15
|
"""The ``{minipage}{20cm}`` env moved from the theme into ``TexPage`` --
|
|
16
16
|
the LaTeX profile no longer carries it. Tests guard against regression
|
|
17
17
|
that would split the same magic string across multiple sources again.
|
|
18
18
|
"""
|
|
19
|
-
assert "definition" not in presets.
|
|
19
|
+
assert "definition" not in presets.SIMPLEX_DARK.latex.environments
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def test_chrome_buffs_have_sensible_defaults() -> None:
|
|
23
|
-
assert presets.
|
|
24
|
-
assert presets.
|
|
23
|
+
assert presets.SIMPLEX_DARK.spacing.header_buff > 0
|
|
24
|
+
assert presets.SIMPLEX_DARK.spacing.footer_buff > 0
|
|
25
25
|
|
|
26
26
|
|
|
27
27
|
def test_preamble_contains_compact_display() -> None:
|
|
28
|
-
preamble = presets.
|
|
28
|
+
preamble = presets.SIMPLEX_DARK.latex.preamble
|
|
29
29
|
assert "abovedisplayskip" in preamble
|
|
30
30
|
assert "belowdisplayskip" in preamble
|
|
31
31
|
|
|
32
32
|
|
|
33
33
|
def test_palette_frozen() -> None:
|
|
34
34
|
with pytest.raises(ValidationError):
|
|
35
|
-
presets.
|
|
35
|
+
presets.SIMPLEX_DARK.palette.background = "#000000" # type: ignore[misc]
|
|
36
36
|
|
|
37
37
|
|
|
38
38
|
def test_theme_frozen() -> None:
|
|
39
39
|
with pytest.raises(ValidationError):
|
|
40
|
-
presets.
|
|
40
|
+
presets.SIMPLEX_DARK.name = "other" # type: ignore[misc]
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
def test_context_push_pop_restores_default() -> None:
|
|
44
|
-
assert get_active_theme() is presets.
|
|
44
|
+
assert get_active_theme() is presets.SIMPLEX_DARK
|
|
45
45
|
with active_theme(presets.ACADEMIC_LIGHT) as t:
|
|
46
46
|
assert get_active_theme() is t
|
|
47
|
-
assert get_active_theme() is presets.
|
|
47
|
+
assert get_active_theme() is presets.SIMPLEX_DARK
|
|
48
48
|
|
|
49
49
|
|
|
50
50
|
def test_presets_get_unknown_raises() -> None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|