simplex-web 0.2.0__py3-none-any.whl
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/README.md +32 -0
- simplex/cli/README.md +13 -0
- simplex/cli/__init__.py +5 -0
- simplex/cli/commands.py +384 -0
- simplex/deck/README.md +19 -0
- simplex/deck/__init__.py +7 -0
- simplex/deck/_template/assets/.gitkeep +0 -0
- simplex/deck/_template/assets/code/.gitkeep +0 -0
- simplex/deck/_template/assets/figures/.gitkeep +0 -0
- simplex/deck/_template/deck.toml +11 -0
- simplex/deck/_template/manim.cfg +3 -0
- simplex/deck/_template/notes.md +27 -0
- simplex/deck/_template/refs.bib +12 -0
- simplex/deck/_template/slides/__init__.py +7 -0
- simplex/deck/_template/slides/intro.py +21 -0
- simplex/deck/config.py +207 -0
- simplex/deck/registry.py +110 -0
- simplex/deck/scaffold.py +86 -0
- simplex/deck/section.py +40 -0
- simplex/engine/README.md +9 -0
- simplex/render/README.md +46 -0
- simplex/render/__init__.py +1 -0
- simplex/render/html.py +132 -0
- simplex/render/pdf.py +32 -0
- simplex/render/pptx.py +32 -0
- simplex/render/reconcile.py +350 -0
- simplex/render/runner.py +116 -0
- simplex/render/thumbnail.py +374 -0
- simplex/slides/README.md +9 -0
- simplex/slides/components/README.md +9 -0
- simplex/theme/README.md +9 -0
- simplex/web/README.md +33 -0
- simplex/web/__init__.py +1 -0
- simplex/web/bibliography.py +248 -0
- simplex/web/bibtex.py +129 -0
- simplex/web/builder.py +321 -0
- simplex/web/callouts.py +134 -0
- simplex/web/citations.py +118 -0
- simplex/web/equations.py +79 -0
- simplex/web/notes.py +135 -0
- simplex/web/refs.py +60 -0
- simplex/web/sidenotes.py +76 -0
- simplex/web/site_config.py +71 -0
- simplex/web/slide_ref.py +54 -0
- simplex/web/static/.gitkeep +0 -0
- simplex/web/static/README.md +23 -0
- simplex/web/static/fonts/lato/lato-latin-400-italic.woff2 +0 -0
- simplex/web/static/fonts/lato/lato-latin-400-normal.woff2 +0 -0
- simplex/web/static/fonts/lato/lato-latin-700-italic.woff2 +0 -0
- simplex/web/static/fonts/lato/lato-latin-700-normal.woff2 +0 -0
- simplex/web/static/fonts/lato/lato-latin-900-normal.woff2 +0 -0
- simplex/web/static/fonts/merriweather/merriweather-latin-400-italic.woff2 +0 -0
- simplex/web/static/fonts/merriweather/merriweather-latin-400-normal.woff2 +0 -0
- simplex/web/static/fonts/merriweather/merriweather-latin-700-italic.woff2 +0 -0
- simplex/web/static/fonts/merriweather/merriweather-latin-700-normal.woff2 +0 -0
- simplex/web/static/fonts/merriweather/merriweather-latin-900-normal.woff2 +0 -0
- simplex/web/static/htmx.min.js +1 -0
- simplex/web/static/katex/auto-render.min.js +1 -0
- simplex/web/static/katex/fonts/KaTeX_AMS-Regular.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Main-Bold.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Main-Regular.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Math-Italic.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Size1-Regular.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Size2-Regular.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Size3-Regular.woff2 +0 -0
- simplex/web/static/katex/fonts/KaTeX_Size4-Regular.woff2 +0 -0
- simplex/web/static/katex/katex.min.css +1 -0
- simplex/web/static/katex/katex.min.js +1 -0
- simplex/web/static/lucide/README.md +7 -0
- simplex/web/static/lucide/lucide.min.js +12 -0
- simplex/web/static/notes.js +68 -0
- simplex/web/static/reveal.js/reset.css +30 -0
- simplex/web/static/reveal.js/reveal.css +8 -0
- simplex/web/static/reveal.js/reveal.js +9 -0
- simplex/web/static/simplex.css +1870 -0
- simplex/web/static/tailwind.js +64 -0
- simplex/web/static/viewer.js +428 -0
- simplex/web/templates/README.md +19 -0
- simplex/web/templates/_carousel.html +117 -0
- simplex/web/templates/base.html +110 -0
- simplex/web/templates/deck.html +149 -0
- simplex/web/templates/index.html +20 -0
- simplex/web/templates/revealjs.html.j2 +374 -0
- simplex/web/templates/section.html +74 -0
- simplex/web/vendor.py +148 -0
- simplex_web-0.2.0.dist-info/METADATA +166 -0
- simplex_web-0.2.0.dist-info/RECORD +91 -0
- simplex_web-0.2.0.dist-info/WHEEL +4 -0
- simplex_web-0.2.0.dist-info/entry_points.txt +2 -0
- simplex_web-0.2.0.dist-info/licenses/LICENSE +21 -0
simplex/web/vendor.py
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"""Fetch vendored runtime assets (tailwind, katex, reveal.js, fonts) into the
|
|
2
|
+
package static dir.
|
|
3
|
+
|
|
4
|
+
Pinned versions are intentional so builds are reproducible. Mirrors
|
|
5
|
+
`scripts/vendor.sh` so Windows users (or anyone without bash) get the same
|
|
6
|
+
assets via plain `uv run simplex build`.
|
|
7
|
+
|
|
8
|
+
Idempotent: files that already exist are not re-downloaded.
|
|
9
|
+
|
|
10
|
+
Fonts come from the ``@fontsource`` packages on jsDelivr -- stable WOFF2
|
|
11
|
+
URLs that ship with semver-pinned releases (unlike Google Fonts' rolling
|
|
12
|
+
``fonts.gstatic.com`` paths). We bundle Lato (UI / headings) and
|
|
13
|
+
Merriweather (body / academic notes) to match the deck-notes academic
|
|
14
|
+
typography stack.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
import warnings
|
|
18
|
+
from pathlib import Path
|
|
19
|
+
from urllib.error import URLError
|
|
20
|
+
from urllib.request import Request, urlopen
|
|
21
|
+
|
|
22
|
+
TAILWIND_VER = "3.4.4"
|
|
23
|
+
KATEX_VER = "0.16.11"
|
|
24
|
+
REVEAL_VER = "5.1.0"
|
|
25
|
+
HTMX_VER = "1.9.12"
|
|
26
|
+
LATO_VER = "5.0.18"
|
|
27
|
+
MERRIWEATHER_VER = "5.0.13"
|
|
28
|
+
LUCIDE_VER = "1.16.0"
|
|
29
|
+
|
|
30
|
+
_UNPKG = "https://unpkg.com"
|
|
31
|
+
_JSDELIVR = "https://cdn.jsdelivr.net/npm"
|
|
32
|
+
_TAILWIND_CDN = "https://cdn.tailwindcss.com"
|
|
33
|
+
|
|
34
|
+
_STALE_PATHS = (
|
|
35
|
+
# Reveal's `black.css` theme used to live here; it `@import`s
|
|
36
|
+
# `fonts/source-sans-pro/source-sans-pro.css` which we don't vendor,
|
|
37
|
+
# producing a 404. The inline <style> block in revealjs.html.j2 supplies
|
|
38
|
+
# every visual we need, so we no longer ship a theme file at all.
|
|
39
|
+
"reveal.js/theme/simplex.css",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
_KATEX_FONTS = (
|
|
43
|
+
"KaTeX_Main-Regular.woff2",
|
|
44
|
+
"KaTeX_Main-Bold.woff2",
|
|
45
|
+
"KaTeX_Math-Italic.woff2",
|
|
46
|
+
"KaTeX_Math-BoldItalic.woff2",
|
|
47
|
+
"KaTeX_AMS-Regular.woff2",
|
|
48
|
+
"KaTeX_Size1-Regular.woff2",
|
|
49
|
+
"KaTeX_Size2-Regular.woff2",
|
|
50
|
+
"KaTeX_Size3-Regular.woff2",
|
|
51
|
+
"KaTeX_Size4-Regular.woff2",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Per @fontsource convention: <pkg>/files/<family>-<subset>-<weight>-<style>.woff2
|
|
55
|
+
# Subset stays `latin` (covers ASCII + Latin-1 + the common punctuation we use).
|
|
56
|
+
_LATO_FACES = (
|
|
57
|
+
("400", "normal"),
|
|
58
|
+
("400", "italic"),
|
|
59
|
+
("700", "normal"),
|
|
60
|
+
("700", "italic"),
|
|
61
|
+
("900", "normal"),
|
|
62
|
+
)
|
|
63
|
+
_MERRIWEATHER_FACES = (
|
|
64
|
+
("400", "normal"),
|
|
65
|
+
("400", "italic"),
|
|
66
|
+
("700", "normal"),
|
|
67
|
+
("700", "italic"),
|
|
68
|
+
("900", "normal"),
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def _assets() -> tuple[tuple[str, str], ...]:
|
|
73
|
+
items: list[tuple[str, str]] = [
|
|
74
|
+
(f"{_TAILWIND_CDN}/{TAILWIND_VER}", "tailwind.js"),
|
|
75
|
+
(f"{_UNPKG}/katex@{KATEX_VER}/dist/katex.min.css", "katex/katex.min.css"),
|
|
76
|
+
(f"{_UNPKG}/katex@{KATEX_VER}/dist/katex.min.js", "katex/katex.min.js"),
|
|
77
|
+
(
|
|
78
|
+
f"{_UNPKG}/katex@{KATEX_VER}/dist/contrib/auto-render.min.js",
|
|
79
|
+
"katex/auto-render.min.js",
|
|
80
|
+
),
|
|
81
|
+
(f"{_UNPKG}/reveal.js@{REVEAL_VER}/dist/reveal.js", "reveal.js/reveal.js"),
|
|
82
|
+
(f"{_UNPKG}/reveal.js@{REVEAL_VER}/dist/reveal.css", "reveal.js/reveal.css"),
|
|
83
|
+
(f"{_UNPKG}/reveal.js@{REVEAL_VER}/dist/reset.css", "reveal.js/reset.css"),
|
|
84
|
+
(f"{_UNPKG}/htmx.org@{HTMX_VER}/dist/htmx.min.js", "htmx.min.js"),
|
|
85
|
+
(f"{_UNPKG}/lucide@{LUCIDE_VER}/dist/umd/lucide.min.js", "lucide/lucide.min.js"),
|
|
86
|
+
]
|
|
87
|
+
items.extend(
|
|
88
|
+
(f"{_UNPKG}/katex@{KATEX_VER}/dist/fonts/{f}", f"katex/fonts/{f}") for f in _KATEX_FONTS
|
|
89
|
+
)
|
|
90
|
+
items.extend(_font_assets("lato", LATO_VER, _LATO_FACES))
|
|
91
|
+
items.extend(_font_assets("merriweather", MERRIWEATHER_VER, _MERRIWEATHER_FACES))
|
|
92
|
+
return tuple(items)
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def _font_assets(
|
|
96
|
+
family: str, version: str, faces: tuple[tuple[str, str], ...]
|
|
97
|
+
) -> list[tuple[str, str]]:
|
|
98
|
+
"""URLs for one ``@fontsource/<family>`` package, latin subset."""
|
|
99
|
+
out: list[tuple[str, str]] = []
|
|
100
|
+
for weight, style in faces:
|
|
101
|
+
filename = f"{family}-latin-{weight}-{style}.woff2"
|
|
102
|
+
url = f"{_JSDELIVR}/@fontsource/{family}@{version}/files/{filename}"
|
|
103
|
+
out.append((url, f"fonts/{family}/{filename}"))
|
|
104
|
+
return out
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
def _download(url: str, dest: Path) -> None:
|
|
108
|
+
if not url.startswith("https://"):
|
|
109
|
+
msg = f"Refusing to fetch non-https URL: {url}"
|
|
110
|
+
raise ValueError(msg)
|
|
111
|
+
dest.parent.mkdir(parents=True, exist_ok=True)
|
|
112
|
+
req = Request(url, headers={"User-Agent": "simplex-vendor/1.0"}) # noqa: S310
|
|
113
|
+
with urlopen(req, timeout=30) as resp: # noqa: S310
|
|
114
|
+
dest.write_bytes(resp.read())
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
def ensure(static_dir: Path) -> list[Path]:
|
|
118
|
+
"""Download any missing vendored assets into `static_dir`.
|
|
119
|
+
|
|
120
|
+
Returns the list of files that were newly fetched (empty on a hot cache).
|
|
121
|
+
Network failures are reported as warnings rather than raised, so an
|
|
122
|
+
offline build still produces HTML (just without those assets).
|
|
123
|
+
"""
|
|
124
|
+
for rel in _STALE_PATHS:
|
|
125
|
+
stale = static_dir / rel
|
|
126
|
+
if stale.exists():
|
|
127
|
+
stale.unlink()
|
|
128
|
+
fetched: list[Path] = []
|
|
129
|
+
failed: list[str] = []
|
|
130
|
+
for url, rel in _assets():
|
|
131
|
+
dest = static_dir / rel
|
|
132
|
+
if dest.exists():
|
|
133
|
+
continue
|
|
134
|
+
try:
|
|
135
|
+
_download(url, dest)
|
|
136
|
+
except (URLError, TimeoutError, OSError) as exc:
|
|
137
|
+
failed.append(f"{rel} ({exc})")
|
|
138
|
+
continue
|
|
139
|
+
fetched.append(dest)
|
|
140
|
+
if failed:
|
|
141
|
+
warnings.warn(
|
|
142
|
+
"simplex: could not vendor "
|
|
143
|
+
+ str(len(failed))
|
|
144
|
+
+ " asset(s); page styles/scripts may be missing: "
|
|
145
|
+
+ "; ".join(failed),
|
|
146
|
+
stacklevel=2,
|
|
147
|
+
)
|
|
148
|
+
return fetched
|
|
@@ -0,0 +1,166 @@
|
|
|
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.
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
simplex/README.md,sha256=9qqxuZBpUBEwfmLJL4adgYXi2fKpQDbj_yOuzvVScng,1788
|
|
2
|
+
simplex/cli/README.md,sha256=ZJjhq9mJ-9QEevMVG7Pxgz5wwQfAGsOCsiabPsvl8VQ,444
|
|
3
|
+
simplex/cli/__init__.py,sha256=ioPkL1yuWFoB5MhWDWpUXttwBNyvk21jOhk8BAO4Dn0,80
|
|
4
|
+
simplex/cli/commands.py,sha256=HN8zrUmrhru1BAhDInKFCQ6AEuo4qhiqNB73dsUidcw,12437
|
|
5
|
+
simplex/deck/README.md,sha256=Z_1sAfbJflRTLWexIqLs3Sd7eoYCqd4NqgPpEF7Jemo,707
|
|
6
|
+
simplex/deck/__init__.py,sha256=T0d5kSGXQKdn6MrIQ_lI9vqlF1m5ywkClPrxSHVwJhc,233
|
|
7
|
+
simplex/deck/config.py,sha256=PT2E57Yh-P9wtXOqijmV1k14U41RrTOC6Dropx8a2Kg,7932
|
|
8
|
+
simplex/deck/registry.py,sha256=8_d359WkbmDRwLaBVSmK-Wh_6AvuS09iFcikVC3il5c,3438
|
|
9
|
+
simplex/deck/scaffold.py,sha256=jXKR4psORNfcuvNGvDAsp6adjjhZqXlIXqfezA0NXbs,2969
|
|
10
|
+
simplex/deck/section.py,sha256=0x_cD1Krj9XT1e3hHKdhVw55CMkN1QHw22zcNvThuwI,1249
|
|
11
|
+
simplex/deck/_template/deck.toml,sha256=3p4ZTIgMygOesVbdUSBRIsOUzC3GdOwQlRHa5bkjtJk,260
|
|
12
|
+
simplex/deck/_template/manim.cfg,sha256=wcXdS0WGV8Pdg8aHAEIMlsWgY2bcHgos6Eqvcjd_JHU,45
|
|
13
|
+
simplex/deck/_template/notes.md,sha256=NAgNIL03njgi0ylPZxLRFfnW7WxWJS563VH0kZFWCzk,1114
|
|
14
|
+
simplex/deck/_template/refs.bib,sha256=_BWw8KuQ4vH61xZluEqmHf5nPvMJaS3Ep-BHr9woKGI,519
|
|
15
|
+
simplex/deck/_template/assets/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
+
simplex/deck/_template/assets/code/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
17
|
+
simplex/deck/_template/assets/figures/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
18
|
+
simplex/deck/_template/slides/__init__.py,sha256=e97vgVjwsOalM_WAPUaE39uFbS07H80ETRPrYvHoFyY,313
|
|
19
|
+
simplex/deck/_template/slides/intro.py,sha256=xCoAGPoD2dKrUtCgxzGO5ljAoQY3cAcfW1iisTOCQwI,674
|
|
20
|
+
simplex/engine/README.md,sha256=97uA3fU8IaRwhf7JyxNNMks-6GslmG5mfzX8om4JZGI,229
|
|
21
|
+
simplex/render/README.md,sha256=iO1SPihzwaJtWmzHFej9uxCnMu7Y0Fm4zmvDNplDHRs,2001
|
|
22
|
+
simplex/render/__init__.py,sha256=1ATzXObdwi86reDt6lxtZxZV6PCPhDuSOGZljwMEGKI,83
|
|
23
|
+
simplex/render/html.py,sha256=v48dSR2RKIxzYHZwEEDkIJ8by86HRcuLY2f1B56vlcY,4303
|
|
24
|
+
simplex/render/pdf.py,sha256=WQpTC1qQ8XEu4sROHpmsl9AfyE6aZC0x5M0Mop44A4E,1138
|
|
25
|
+
simplex/render/pptx.py,sha256=tNDvgmyMiWltuiXxvQ7honQR8EiAmXABwVSEZ05fIao,1129
|
|
26
|
+
simplex/render/reconcile.py,sha256=rwIQAF4jcgSJBNLme9166bK2H9JgYtgWl8rYycWtzRA,13313
|
|
27
|
+
simplex/render/runner.py,sha256=rb3LB2zYlpqLufgGizXCR5_te24b4PQbzZnYYEhQBFY,4274
|
|
28
|
+
simplex/render/thumbnail.py,sha256=Hu0EzcQygjOSbVNBIRRI0WW8ZzjHyFj8kT3GSnhvxHU,13010
|
|
29
|
+
simplex/slides/README.md,sha256=dW1HYTGgT0phWeB40KfnO6XDgiAsFBMw82-7dYMo4Eg,211
|
|
30
|
+
simplex/slides/components/README.md,sha256=rDRrSJ0g456MK25cGbFVbPiELZ9ZuX_TXgQbrIfwFkw,192
|
|
31
|
+
simplex/theme/README.md,sha256=jPFIEUxYjs1xDhPqe3yAObybIupnxFGKAzQ_WRyJcXs,192
|
|
32
|
+
simplex/web/README.md,sha256=tU0TrRtQysJ77LgcgGyd3lpPjk94EEK7KvcJQYeauyw,1683
|
|
33
|
+
simplex/web/__init__.py,sha256=LFAopywmtZApg3zWNKsNlSlEpLH6ej9_Id8gNyXY0ho,58
|
|
34
|
+
simplex/web/bibliography.py,sha256=ik-s1K9RdEa-yqI2-LcurNaSlB8uTE53u8UuFTx5fAQ,8233
|
|
35
|
+
simplex/web/bibtex.py,sha256=kI_ZAkRFCIuItWKC-kCgXdtvlJQ1cbTcQ8zyVnexrVo,4366
|
|
36
|
+
simplex/web/builder.py,sha256=5sT0k5_PYpsQgZW8iS_SJtS8N5skq3XaPAYkOjIit-s,10178
|
|
37
|
+
simplex/web/callouts.py,sha256=rgL-jAQjnIEEg8WnpCOiQPEqgTIpo_3Ol55imwbPLPs,4956
|
|
38
|
+
simplex/web/citations.py,sha256=4aONO0KwR5wF1YoztCFW5QOOMCQjoBDslWlFd172nWw,3866
|
|
39
|
+
simplex/web/equations.py,sha256=NVEcePtEgUizpr8bHOO1qlOB6kSAUEYe48Ia7heevIg,2801
|
|
40
|
+
simplex/web/notes.py,sha256=5hDtICeQ2StUbU8ObXrW04bWALjdbJJk57FjzwJ59uQ,5116
|
|
41
|
+
simplex/web/refs.py,sha256=9PGmTc_jBCrR9NQtjcIg0kTLvqtV0LEZ3BjFd3WMBLw,1884
|
|
42
|
+
simplex/web/sidenotes.py,sha256=l2HAODmWRaRudu9CdlhGWkGniiJKnhLuCNeaclJDGC0,2885
|
|
43
|
+
simplex/web/site_config.py,sha256=QFdrgsGc63sdD8kEcVRL93HOIh3JNtN56ZWofLu9ghk,2454
|
|
44
|
+
simplex/web/slide_ref.py,sha256=GIIKzZhkK0FcZtYyfHK4-gqDmyZFPaW3reWEoOp43DM,2138
|
|
45
|
+
simplex/web/vendor.py,sha256=EY8A36wLKzYomt5mJupLQ4a7qyPfx87A6WjzCY80kWA,5235
|
|
46
|
+
simplex/web/static/.gitkeep,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
47
|
+
simplex/web/static/README.md,sha256=nwaz8KPMmA953XwCWLzExySCeKP3JePbu12F3GjqQ14,897
|
|
48
|
+
simplex/web/static/htmx.min.js,sha256=RJMXreeIHpSVENthSZHhlcOgmcTHkcJNrOxV-fSipFI,48101
|
|
49
|
+
simplex/web/static/notes.js,sha256=8-atdVEjFHlpotD3KgNC1vcCXDXu4o26bxiuL_ng2xc,2393
|
|
50
|
+
simplex/web/static/simplex.css,sha256=gjTkLOTYPzAaj_bayNQH_SJyI_isxB-txDz5qPbOIEw,47161
|
|
51
|
+
simplex/web/static/tailwind.js,sha256=gvEZAJvhPw8-XgKJO4SMJI4YTLhMhecodO80z-_IvFc,410933
|
|
52
|
+
simplex/web/static/viewer.js,sha256=FWxoeBh1bYcuU8eJLo9GZ7uJkzoy01MC0KRyro1U16I,15445
|
|
53
|
+
simplex/web/static/fonts/lato/lato-latin-400-italic.woff2,sha256=vKHYitpUTZyAhy1NonEz-rbTRzYfom6TK0fslVkIj9A,24408
|
|
54
|
+
simplex/web/static/fonts/lato/lato-latin-400-normal.woff2,sha256=kYt9w-Li0BXBbOCLV7y2TSJTuvwXB2WPNh5yhlSY5Tc,23580
|
|
55
|
+
simplex/web/static/fonts/lato/lato-latin-700-italic.woff2,sha256=bIQ0gpbr4uKggww5YusCFWQZ2bx2Nxwura9zKdgn1VA,24448
|
|
56
|
+
simplex/web/static/fonts/lato/lato-latin-700-normal.woff2,sha256=xEfddne0Gdt7Idvfxid8eBapE__adv0uUnAt9TjeDkk,23040
|
|
57
|
+
simplex/web/static/fonts/lato/lato-latin-900-normal.woff2,sha256=CGZIWbqrXtmPC_gY7XfjhGT_GCbcZAbV7L1lFAmvvZI,22504
|
|
58
|
+
simplex/web/static/fonts/merriweather/merriweather-latin-400-italic.woff2,sha256=SZ7FTrKv0QPsN1BeI8ZXD8fYmg1yjd4Z2HoJLkoyYbQ,19780
|
|
59
|
+
simplex/web/static/fonts/merriweather/merriweather-latin-400-normal.woff2,sha256=XC1mLpK8vxpZcLlwQPkBAxKV55qWMU24MC9UkAMCIIc,20028
|
|
60
|
+
simplex/web/static/fonts/merriweather/merriweather-latin-700-italic.woff2,sha256=NkLfEvDZMNWEapZlIICQjrLzg7YCqVz4DR5iJ-ZuHEY,19900
|
|
61
|
+
simplex/web/static/fonts/merriweather/merriweather-latin-700-normal.woff2,sha256=JzyGE83ShS3VMY8iTYBK5tL8cXxI0_HatYe205b7T8g,19740
|
|
62
|
+
simplex/web/static/fonts/merriweather/merriweather-latin-900-normal.woff2,sha256=9rnuuwVGGEB5D8gEtFkDI-8SpX_lr3_N7tLXmOVyhEs,19816
|
|
63
|
+
simplex/web/static/katex/auto-render.min.js,sha256=e1fUJ6xicGd9r42DgN7SzHMzb5FJoWe44f4NbvZmBK4,3481
|
|
64
|
+
simplex/web/static/katex/katex.min.css,sha256=cXvJrnhTth8PdkVd3fDs1PUnp4P0LeKsJGhImcHEYlg,23335
|
|
65
|
+
simplex/web/static/katex/katex.min.js,sha256=5r_l3uvUx8zScgVbq2O9OrLHO5B7bmoi01J0CoE4H9Q,275414
|
|
66
|
+
simplex/web/static/katex/fonts/KaTeX_AMS-Regular.woff2,sha256=DN04fJWQoan5eUVgAi27WWVKfYbxh6oMgUla1C06cwg,28076
|
|
67
|
+
simplex/web/static/katex/fonts/KaTeX_Main-Bold.woff2,sha256=D2DRuJeTjskYyM4HMJJBG6-UOPZzlGVpP_GLD50gsCE,25324
|
|
68
|
+
simplex/web/static/katex/fonts/KaTeX_Main-Regular.woff2,sha256=wjQs2Lhp4BdSqTIdwXIT_EDU0Ex5aIwdQ_LPMWq9eGY,26272
|
|
69
|
+
simplex/web/static/katex/fonts/KaTeX_Math-BoldItalic.woff2,sha256=3Ec0TbtstbZVyEYNVh9N9fUBuQyAStPGzsZf4yI1GrE,16400
|
|
70
|
+
simplex/web/static/katex/fonts/KaTeX_Math-Italic.woff2,sha256=evWMXsjxMqLd3pAnxteBTezOTTuCKhEZKkKiDi6XMmQ,16440
|
|
71
|
+
simplex/web/static/katex/fonts/KaTeX_Size1-Regular.woff2,sha256=a0fEAWa22-IaXfyncYQT8hR_0jmb4bpgXYrTnO3yXf4,5468
|
|
72
|
+
simplex/web/static/katex/fonts/KaTeX_Size2-Regular.woff2,sha256=0ExUIZ-ersbU1P1C37KHhZdaR5TWsvxx5Wa5zW24Qt0,5208
|
|
73
|
+
simplex/web/static/katex/fonts/KaTeX_Size3-Regular.woff2,sha256=c9WRJxsWBJYMsQu5D-4CFnCvcpcBfg6YSAszLRH1GZU,3624
|
|
74
|
+
simplex/web/static/katex/fonts/KaTeX_Size4-Regular.woff2,sha256=pK99QURAocF5CCXPtwDPnPQ7DyxLBPDrxSMBGtmFPsA,4928
|
|
75
|
+
simplex/web/static/lucide/README.md,sha256=IeB9RHYzCDV9OxvbwjVhf0znL5nOHVENiekuA43NA50,152
|
|
76
|
+
simplex/web/static/lucide/lucide.min.js,sha256=GHp1ZiXFznSZwgfRsNHPThq5Xj9mbH4M0Pr8PmhC0EA,401894
|
|
77
|
+
simplex/web/static/reveal.js/reset.css,sha256=GqjoTJyry_5NlbGYef5IucLF5tVFdMvmebwi7bn-ErY,871
|
|
78
|
+
simplex/web/static/reveal.js/reveal.css,sha256=nLxQgnl9k48O54Ayh5ChMa49e8XAnBdud5J8F08p5go,52279
|
|
79
|
+
simplex/web/static/reveal.js/reveal.js,sha256=lza_PYkY45HowHyFxTdzgA1ABNwl-UiRbjGco3HKiBo,107670
|
|
80
|
+
simplex/web/templates/README.md,sha256=VtnMzW9M5qZxQKZcjMgTl1A8TRWYpFS1dVm8XsXVwi8,673
|
|
81
|
+
simplex/web/templates/_carousel.html,sha256=dgdyON6G9akHJqD4rrq2uZR_O3TcLPh6eHgiDa5cKaA,3970
|
|
82
|
+
simplex/web/templates/base.html,sha256=R0Un3roGTtr4NTefRgk-1Ks7V4_Eitclk1pgECIsYCE,4458
|
|
83
|
+
simplex/web/templates/deck.html,sha256=WfGbT_BMfQHBjdn2mt3RUA6ejM5ScLLM1qFCz_eVSqw,5747
|
|
84
|
+
simplex/web/templates/index.html,sha256=Zc0WqWmZdCyesXgHWm6OQsIKq5ncNlXT0K88zrR-6rg,574
|
|
85
|
+
simplex/web/templates/revealjs.html.j2,sha256=bxAWa5JZ8v4Sv5EuCCbElRp3F0Zk7LpLN2kmICobj_I,13715
|
|
86
|
+
simplex/web/templates/section.html,sha256=VXJ_FpQeoRDCNQy-nidt3qllJyIDpZWOBRnjm-vWaEM,2379
|
|
87
|
+
simplex_web-0.2.0.dist-info/METADATA,sha256=G2Cwanu7EDu4UJdrK9PLtYff1EPqadyQVXky4Y245AA,6386
|
|
88
|
+
simplex_web-0.2.0.dist-info/WHEEL,sha256=QccIxa26bgl1E6uMy58deGWi-0aeIkkangHcxk2kWfw,87
|
|
89
|
+
simplex_web-0.2.0.dist-info/entry_points.txt,sha256=ooR5SK2_ligzPYs0z_bNDQ9Z1EufjlX5jIlDYybepSI,53
|
|
90
|
+
simplex_web-0.2.0.dist-info/licenses/LICENSE,sha256=nl59bQ87NqHIcm_46xQjWvu0Nv630wsBOK4I1-ou9SY,1070
|
|
91
|
+
simplex_web-0.2.0.dist-info/RECORD,,
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Shlomi Perles
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|