simplex-web 0.2.0__tar.gz → 0.2.1__tar.gz

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