montin 0.6.0__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.
- montin-0.6.0/LICENSE +21 -0
- montin-0.6.0/PKG-INFO +173 -0
- montin-0.6.0/README.md +126 -0
- montin-0.6.0/montin/__init__.py +63 -0
- montin-0.6.0/montin/cells/__init__.py +55 -0
- montin-0.6.0/montin/cells/base.py +305 -0
- montin-0.6.0/montin/cells/image.py +56 -0
- montin-0.6.0/montin/cells/image_slider.py +48 -0
- montin-0.6.0/montin/cells/matplotlib.py +88 -0
- montin-0.6.0/montin/cells/misc.py +195 -0
- montin-0.6.0/montin/cells/plotly.py +43 -0
- montin-0.6.0/montin/cells/table.py +46 -0
- montin-0.6.0/montin/cells/tabulator.py +393 -0
- montin-0.6.0/montin/cells/text.py +41 -0
- montin-0.6.0/montin/core/__init__.py +1 -0
- montin-0.6.0/montin/core/assembler.py +402 -0
- montin-0.6.0/montin/core/deck.py +635 -0
- montin-0.6.0/montin/core/plugins.py +140 -0
- montin-0.6.0/montin/core/security.py +112 -0
- montin-0.6.0/montin/core/slide.py +1094 -0
- montin-0.6.0/montin/exceptions.py +54 -0
- montin-0.6.0/montin/py.typed +0 -0
- montin-0.6.0/montin/static/__init__.py +1 -0
- montin-0.6.0/montin/static/js/boot.js +74 -0
- montin-0.6.0/montin/static/js/charts.js +249 -0
- montin-0.6.0/montin/static/js/copy.js +89 -0
- montin-0.6.0/montin/static/js/keyboard.js +39 -0
- montin-0.6.0/montin/static/js/lightbox.js +209 -0
- montin-0.6.0/montin/static/js/navigation.js +85 -0
- montin-0.6.0/montin/static/js/sidebar.js +375 -0
- montin-0.6.0/montin/static/js/slider.js +63 -0
- montin-0.6.0/montin/static/js/stage.js +91 -0
- montin-0.6.0/montin/static/js/state.js +24 -0
- montin-0.6.0/montin/static/js/toolbar.js +34 -0
- montin-0.6.0/montin/static/js/touch.js +110 -0
- montin-0.6.0/montin/static/js/view.js +49 -0
- montin-0.6.0/montin/static/js/zoom.js +54 -0
- montin-0.6.0/montin/static/vendor/UPDATE_LOG.md +7 -0
- montin-0.6.0/montin/static/vendor/highlight/LICENSE +29 -0
- montin-0.6.0/montin/static/vendor/highlight/github-dark.min.css +10 -0
- montin-0.6.0/montin/static/vendor/highlight/github.min.css +10 -0
- montin-0.6.0/montin/static/vendor/highlight/highlight.min.js +1232 -0
- montin-0.6.0/montin/static/vendor/manifest.json +99 -0
- montin-0.6.0/montin/static/vendor/mathjax/LICENSE +202 -0
- montin-0.6.0/montin/static/vendor/mathjax/tex-svg.js +1 -0
- montin-0.6.0/montin/static/vendor/mermaid/LICENSE +21 -0
- montin-0.6.0/montin/static/vendor/mermaid/mermaid.min.js +2314 -0
- montin-0.6.0/montin/static/vendor/plotly/LICENSE +21 -0
- montin-0.6.0/montin/static/vendor/plotly/LICENSE.txt +60 -0
- montin-0.6.0/montin/static/vendor/plotly/plotly.min.js +8 -0
- montin-0.6.0/montin/static/vendor/tabulator/LICENSE +21 -0
- montin-0.6.0/montin/static/vendor/tabulator/tabulator.min.css +2 -0
- montin-0.6.0/montin/static/vendor/tabulator/tabulator.min.js +3 -0
- montin-0.6.0/montin/static/vendor/tabulator/tabulator_midnight.min.css +2 -0
- montin-0.6.0/montin/templates/__init__.py +1 -0
- montin-0.6.0/montin/templates/base.html +301 -0
- montin-0.6.0/montin/templates/cell_code.html +28 -0
- montin-0.6.0/montin/templates/cell_empty.html +8 -0
- montin-0.6.0/montin/templates/cell_html.html +26 -0
- montin-0.6.0/montin/templates/cell_iframe.html +28 -0
- montin-0.6.0/montin/templates/cell_image.html +40 -0
- montin-0.6.0/montin/templates/cell_image_slider.html +49 -0
- montin-0.6.0/montin/templates/cell_list.html +41 -0
- montin-0.6.0/montin/templates/cell_matplotlib.html +40 -0
- montin-0.6.0/montin/templates/cell_matplotlib_svg.html +28 -0
- montin-0.6.0/montin/templates/cell_mermaid.html +28 -0
- montin-0.6.0/montin/templates/cell_metric.html +28 -0
- montin-0.6.0/montin/templates/cell_plotly.html +25 -0
- montin-0.6.0/montin/templates/cell_table.html +46 -0
- montin-0.6.0/montin/templates/cell_tabulator.html +35 -0
- montin-0.6.0/montin/templates/cell_text.html +26 -0
- montin-0.6.0/montin/themes/__init__.py +1 -0
- montin-0.6.0/montin/themes/academic/__init__.py +1 -0
- montin-0.6.0/montin/themes/academic/layout.css +18 -0
- montin-0.6.0/montin/themes/academic/metric.css +11 -0
- montin-0.6.0/montin/themes/academic/slide.css +34 -0
- montin-0.6.0/montin/themes/dark/__init__.py +0 -0
- montin-0.6.0/montin/themes/dark/layout.css +18 -0
- montin-0.6.0/montin/themes/default/__init__.py +1 -0
- montin-0.6.0/montin/themes/default/code.css +89 -0
- montin-0.6.0/montin/themes/default/image.css +238 -0
- montin-0.6.0/montin/themes/default/layout.css +661 -0
- montin-0.6.0/montin/themes/default/list.css +29 -0
- montin-0.6.0/montin/themes/default/metric.css +41 -0
- montin-0.6.0/montin/themes/default/slide.css +205 -0
- montin-0.6.0/montin/themes/default/table.css +38 -0
- montin-0.6.0/montin/themes/default/tabulator.css +129 -0
- montin-0.6.0/montin/themes/default/toc.css +129 -0
- montin-0.6.0/montin/themes/default/toolbar.css +3 -0
- montin-0.6.0/montin/themes/light/__init__.py +0 -0
- montin-0.6.0/montin/themes/light/layout.css +18 -0
- montin-0.6.0/montin/themes/light/metric.css +6 -0
- montin-0.6.0/montin/themes/light-blue/__init__.py +0 -0
- montin-0.6.0/montin/themes/light-blue/layout.css +18 -0
- montin-0.6.0/montin/themes/light-blue/metric.css +6 -0
- montin-0.6.0/montin/themes/sobrio/__init__.py +0 -0
- montin-0.6.0/montin/themes/sobrio/layout.css +18 -0
- montin-0.6.0/montin/themes/sobrio/metric.css +11 -0
- montin-0.6.0/montin/themes/sobrio/slide.css +45 -0
- montin-0.6.0/montin/utils/__init__.py +1 -0
- montin-0.6.0/montin/utils/image_encoder.py +54 -0
- montin-0.6.0/montin/utils/media.py +126 -0
- montin-0.6.0/montin/utils/notebook.py +151 -0
- montin-0.6.0/montin/utils/resource_loader.py +38 -0
- montin-0.6.0/montin/utils/tabular.py +112 -0
- montin-0.6.0/montin/utils/theme_resolver.py +79 -0
- montin-0.6.0/montin/utils/vendor.py +171 -0
- montin-0.6.0/montin.egg-info/PKG-INFO +173 -0
- montin-0.6.0/montin.egg-info/SOURCES.txt +124 -0
- montin-0.6.0/montin.egg-info/dependency_links.txt +1 -0
- montin-0.6.0/montin.egg-info/requires.txt +22 -0
- montin-0.6.0/montin.egg-info/top_level.txt +1 -0
- montin-0.6.0/pyproject.toml +84 -0
- montin-0.6.0/setup.cfg +4 -0
- montin-0.6.0/tests/test_cells.py +353 -0
- montin-0.6.0/tests/test_fontscale.py +116 -0
- montin-0.6.0/tests/test_media.py +84 -0
- montin-0.6.0/tests/test_notebook_unique.py +78 -0
- montin-0.6.0/tests/test_plugins.py +302 -0
- montin-0.6.0/tests/test_preview.py +117 -0
- montin-0.6.0/tests/test_security.py +125 -0
- montin-0.6.0/tests/test_slide.py +168 -0
- montin-0.6.0/tests/test_slides.py +409 -0
- montin-0.6.0/tests/test_tabulator.py +300 -0
- montin-0.6.0/tests/test_themes.py +104 -0
- montin-0.6.0/tests/test_write.py +295 -0
montin-0.6.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 André Rezende Dessimoni Carvalho
|
|
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.
|
montin-0.6.0/PKG-INFO
ADDED
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: montin
|
|
3
|
+
Version: 0.6.0
|
|
4
|
+
Summary: Generate self-contained, interactive HTML reports from data in Python
|
|
5
|
+
Author-email: André Rezende Dessimoni Carvalho <andre.rdc@outlook.com>
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/andre-dessimoni/montin
|
|
8
|
+
Project-URL: Repository, https://github.com/andre-dessimoni/montin
|
|
9
|
+
Project-URL: Issues, https://github.com/andre-dessimoni/montin/issues
|
|
10
|
+
Project-URL: Documentation, https://montin.readthedocs.io/
|
|
11
|
+
Keywords: report,dashboard,html,data,analytics,visualization,plotly,mermaid,self-contained,notebook
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Intended Audience :: Developers
|
|
14
|
+
Classifier: Intended Audience :: Science/Research
|
|
15
|
+
Classifier: Operating System :: OS Independent
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
22
|
+
Classifier: Topic :: Documentation
|
|
23
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
24
|
+
Classifier: Topic :: Text Processing :: Markup :: HTML
|
|
25
|
+
Requires-Python: >=3.9
|
|
26
|
+
Description-Content-Type: text/markdown
|
|
27
|
+
License-File: LICENSE
|
|
28
|
+
Requires-Dist: jinja2>=3.1
|
|
29
|
+
Provides-Extra: markdown
|
|
30
|
+
Requires-Dist: markdown-it-py>=3.0; extra == "markdown"
|
|
31
|
+
Provides-Extra: image
|
|
32
|
+
Requires-Dist: pillow>=9.0; extra == "image"
|
|
33
|
+
Provides-Extra: full
|
|
34
|
+
Requires-Dist: markdown-it-py>=3.0; extra == "full"
|
|
35
|
+
Requires-Dist: pillow>=9.0; extra == "full"
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pytest>=8.0; extra == "dev"
|
|
38
|
+
Requires-Dist: pytest-cov; extra == "dev"
|
|
39
|
+
Requires-Dist: ruff>=0.4; extra == "dev"
|
|
40
|
+
Requires-Dist: mypy>=1.10; extra == "dev"
|
|
41
|
+
Requires-Dist: build; extra == "dev"
|
|
42
|
+
Requires-Dist: twine; extra == "dev"
|
|
43
|
+
Requires-Dist: plotly>=5.0; extra == "dev"
|
|
44
|
+
Requires-Dist: pandas>=1.5; extra == "dev"
|
|
45
|
+
Requires-Dist: matplotlib>=3.5; extra == "dev"
|
|
46
|
+
Dynamic: license-file
|
|
47
|
+
|
|
48
|
+
# Montin
|
|
49
|
+
|
|
50
|
+
> **See the whole.**
|
|
51
|
+
|
|
52
|
+
[](https://github.com/andre-dessimoni/montin/actions/workflows/ci.yml)
|
|
53
|
+
|
|
54
|
+
Build **self-contained, interactive HTML reports** from Python — one file you
|
|
55
|
+
can commit, or serve, with no runtime and no dependencies on the viewer's
|
|
56
|
+
machine. Designed for **batch-generated data and ML output**: loop over your
|
|
57
|
+
experiments, runs, or segments and emit a report per iteration.
|
|
58
|
+
|
|
59
|
+
Content is laid out on a grid of typed cells (charts, tables, metrics, code,
|
|
60
|
+
images, diagrams), and the whole deck embeds into a single `.html`.
|
|
61
|
+
|
|
62
|
+
## Documentation
|
|
63
|
+
|
|
64
|
+
https://montin.readthedocs.io/
|
|
65
|
+
|
|
66
|
+
## Installation
|
|
67
|
+
|
|
68
|
+
```bash
|
|
69
|
+
pip install montin
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
## Quick start
|
|
74
|
+
|
|
75
|
+
```python
|
|
76
|
+
from montin import Deck
|
|
77
|
+
|
|
78
|
+
deck = Deck(
|
|
79
|
+
title="My Report",
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
deck.add_title("My Report", subtitle="Subtitle here")
|
|
83
|
+
deck.add_section("1 — Introduction")
|
|
84
|
+
|
|
85
|
+
slide = deck.add_slide("Results", ncols=2)
|
|
86
|
+
|
|
87
|
+
slide.add_metric(value=98.7, label="Efficiency (%)", delta=+2.3)
|
|
88
|
+
slide.add_text("Text with **markdown** and LaTeX: $E = mc^2$")
|
|
89
|
+
|
|
90
|
+
deck.write("report", open_browser=True)
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Batch generation
|
|
94
|
+
|
|
95
|
+
The core use case — one report per run, generated in a loop:
|
|
96
|
+
|
|
97
|
+
```python
|
|
98
|
+
deck = Deck(title=f"Experiment Results", author="Company name", date="Jun 20th, 2026")
|
|
99
|
+
|
|
100
|
+
for run in experiment_runs:
|
|
101
|
+
|
|
102
|
+
deck.add_section(title=f"Run #{run.id}")
|
|
103
|
+
|
|
104
|
+
slide = deck.add_slide("Metrics", nrows=1, ncols=3)
|
|
105
|
+
|
|
106
|
+
slide.add_metric(value=run.accuracy, label="Accuracy", delta=run.delta)
|
|
107
|
+
slide.add_plotly(run.loss_curve)
|
|
108
|
+
slide.add_table(run.results_table, caption="Results")
|
|
109
|
+
|
|
110
|
+
deck.write("report")
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
## Cell types
|
|
115
|
+
|
|
116
|
+
| Method | Cell | Description |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| `add_text` | TextCell | Markdown + LaTeX (MathJax) |
|
|
119
|
+
| `add_metric` | MetricCell | KPI card with value, label and delta |
|
|
120
|
+
| `add_table` | TableCell | CSV, dict, list or DataFrame |
|
|
121
|
+
| `add_image` | ImageCell | Image with lightbox and zoom/pan |
|
|
122
|
+
| `add_image_slider` | ImageSliderCell | Image carousel |
|
|
123
|
+
| `add_list` | ListCell | Bullet or numbered list |
|
|
124
|
+
| `add_code` | CodeCell | Code with syntax highlighting |
|
|
125
|
+
| `add_plotly` | PlotlyCell | Interactive Plotly chart |
|
|
126
|
+
| `add_mermaid` | MermaidCell | Declarative diagram (flowchart, etc.) |
|
|
127
|
+
| `add_html` | HtmlCell | Raw HTML without escaping |
|
|
128
|
+
| `add_iframe` | IframeCell | Embed external content |
|
|
129
|
+
| `add_empty` | EmptyCell | Reserves space in the grid |
|
|
130
|
+
|
|
131
|
+
## Common cell options
|
|
132
|
+
|
|
133
|
+
All `add_*` methods accept:
|
|
134
|
+
|
|
135
|
+
```python
|
|
136
|
+
slide.add_text(
|
|
137
|
+
"content",
|
|
138
|
+
colspan=2, # spans 2 columns
|
|
139
|
+
rowspan=1,
|
|
140
|
+
caption="Caption",
|
|
141
|
+
overflow=True, # internal scroll
|
|
142
|
+
expand_button=True, # expand to fullscreen button
|
|
143
|
+
copy_button=True, # copy button (CodeCell)
|
|
144
|
+
transparent=True, # hides cell border and background
|
|
145
|
+
)
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
## About the name
|
|
149
|
+
|
|
150
|
+
**Montin** fuses two roots:
|
|
151
|
+
|
|
152
|
+
- **Muntin** — the slender bar that divides a window's panes into one composed
|
|
153
|
+
whole. It maps directly onto the library's **CSS Grid**: the structure that
|
|
154
|
+
organizes cells and panels across a report.
|
|
155
|
+
- **Monte** — a heap of raw data (simulations, DOE iterations, notebooks) waiting
|
|
156
|
+
to be processed and understood.
|
|
157
|
+
|
|
158
|
+
Montin is the structure that turns a heap of data into understanding — and, from
|
|
159
|
+
above, you *see the whole*.
|
|
160
|
+
|
|
161
|
+
### Palette
|
|
162
|
+
|
|
163
|
+
| Name | Hex | Use |
|
|
164
|
+
|---|---|---|
|
|
165
|
+
| Ink | `#0F1F2E` | Primary text, dark background |
|
|
166
|
+
| Slate | `#35546B` | Secondary colour, UI elements |
|
|
167
|
+
| Stone | `#9AA6B2` | Neutral, secondary text |
|
|
168
|
+
| Sand | `#E9ECEF` | Light background, borders |
|
|
169
|
+
| Accent | `#E07A3F` | Highlight (logo sun, CTAs, links) |
|
|
170
|
+
|
|
171
|
+
## License
|
|
172
|
+
|
|
173
|
+
MIT
|
montin-0.6.0/README.md
ADDED
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Montin
|
|
2
|
+
|
|
3
|
+
> **See the whole.**
|
|
4
|
+
|
|
5
|
+
[](https://github.com/andre-dessimoni/montin/actions/workflows/ci.yml)
|
|
6
|
+
|
|
7
|
+
Build **self-contained, interactive HTML reports** from Python — one file you
|
|
8
|
+
can commit, or serve, with no runtime and no dependencies on the viewer's
|
|
9
|
+
machine. Designed for **batch-generated data and ML output**: loop over your
|
|
10
|
+
experiments, runs, or segments and emit a report per iteration.
|
|
11
|
+
|
|
12
|
+
Content is laid out on a grid of typed cells (charts, tables, metrics, code,
|
|
13
|
+
images, diagrams), and the whole deck embeds into a single `.html`.
|
|
14
|
+
|
|
15
|
+
## Documentation
|
|
16
|
+
|
|
17
|
+
https://montin.readthedocs.io/
|
|
18
|
+
|
|
19
|
+
## Installation
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
pip install montin
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
## Quick start
|
|
27
|
+
|
|
28
|
+
```python
|
|
29
|
+
from montin import Deck
|
|
30
|
+
|
|
31
|
+
deck = Deck(
|
|
32
|
+
title="My Report",
|
|
33
|
+
)
|
|
34
|
+
|
|
35
|
+
deck.add_title("My Report", subtitle="Subtitle here")
|
|
36
|
+
deck.add_section("1 — Introduction")
|
|
37
|
+
|
|
38
|
+
slide = deck.add_slide("Results", ncols=2)
|
|
39
|
+
|
|
40
|
+
slide.add_metric(value=98.7, label="Efficiency (%)", delta=+2.3)
|
|
41
|
+
slide.add_text("Text with **markdown** and LaTeX: $E = mc^2$")
|
|
42
|
+
|
|
43
|
+
deck.write("report", open_browser=True)
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
## Batch generation
|
|
47
|
+
|
|
48
|
+
The core use case — one report per run, generated in a loop:
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
deck = Deck(title=f"Experiment Results", author="Company name", date="Jun 20th, 2026")
|
|
52
|
+
|
|
53
|
+
for run in experiment_runs:
|
|
54
|
+
|
|
55
|
+
deck.add_section(title=f"Run #{run.id}")
|
|
56
|
+
|
|
57
|
+
slide = deck.add_slide("Metrics", nrows=1, ncols=3)
|
|
58
|
+
|
|
59
|
+
slide.add_metric(value=run.accuracy, label="Accuracy", delta=run.delta)
|
|
60
|
+
slide.add_plotly(run.loss_curve)
|
|
61
|
+
slide.add_table(run.results_table, caption="Results")
|
|
62
|
+
|
|
63
|
+
deck.write("report")
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
## Cell types
|
|
68
|
+
|
|
69
|
+
| Method | Cell | Description |
|
|
70
|
+
|---|---|---|
|
|
71
|
+
| `add_text` | TextCell | Markdown + LaTeX (MathJax) |
|
|
72
|
+
| `add_metric` | MetricCell | KPI card with value, label and delta |
|
|
73
|
+
| `add_table` | TableCell | CSV, dict, list or DataFrame |
|
|
74
|
+
| `add_image` | ImageCell | Image with lightbox and zoom/pan |
|
|
75
|
+
| `add_image_slider` | ImageSliderCell | Image carousel |
|
|
76
|
+
| `add_list` | ListCell | Bullet or numbered list |
|
|
77
|
+
| `add_code` | CodeCell | Code with syntax highlighting |
|
|
78
|
+
| `add_plotly` | PlotlyCell | Interactive Plotly chart |
|
|
79
|
+
| `add_mermaid` | MermaidCell | Declarative diagram (flowchart, etc.) |
|
|
80
|
+
| `add_html` | HtmlCell | Raw HTML without escaping |
|
|
81
|
+
| `add_iframe` | IframeCell | Embed external content |
|
|
82
|
+
| `add_empty` | EmptyCell | Reserves space in the grid |
|
|
83
|
+
|
|
84
|
+
## Common cell options
|
|
85
|
+
|
|
86
|
+
All `add_*` methods accept:
|
|
87
|
+
|
|
88
|
+
```python
|
|
89
|
+
slide.add_text(
|
|
90
|
+
"content",
|
|
91
|
+
colspan=2, # spans 2 columns
|
|
92
|
+
rowspan=1,
|
|
93
|
+
caption="Caption",
|
|
94
|
+
overflow=True, # internal scroll
|
|
95
|
+
expand_button=True, # expand to fullscreen button
|
|
96
|
+
copy_button=True, # copy button (CodeCell)
|
|
97
|
+
transparent=True, # hides cell border and background
|
|
98
|
+
)
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## About the name
|
|
102
|
+
|
|
103
|
+
**Montin** fuses two roots:
|
|
104
|
+
|
|
105
|
+
- **Muntin** — the slender bar that divides a window's panes into one composed
|
|
106
|
+
whole. It maps directly onto the library's **CSS Grid**: the structure that
|
|
107
|
+
organizes cells and panels across a report.
|
|
108
|
+
- **Monte** — a heap of raw data (simulations, DOE iterations, notebooks) waiting
|
|
109
|
+
to be processed and understood.
|
|
110
|
+
|
|
111
|
+
Montin is the structure that turns a heap of data into understanding — and, from
|
|
112
|
+
above, you *see the whole*.
|
|
113
|
+
|
|
114
|
+
### Palette
|
|
115
|
+
|
|
116
|
+
| Name | Hex | Use |
|
|
117
|
+
|---|---|---|
|
|
118
|
+
| Ink | `#0F1F2E` | Primary text, dark background |
|
|
119
|
+
| Slate | `#35546B` | Secondary colour, UI elements |
|
|
120
|
+
| Stone | `#9AA6B2` | Neutral, secondary text |
|
|
121
|
+
| Sand | `#E9ECEF` | Light background, borders |
|
|
122
|
+
| Accent | `#E07A3F` | Highlight (logo sun, CTAs, links) |
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
MIT
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"""
|
|
2
|
+
montin
|
|
3
|
+
=======
|
|
4
|
+
Python library for generating self-contained, interactive HTML reports
|
|
5
|
+
from data — built for batch-generated ML and analytics output.
|
|
6
|
+
|
|
7
|
+
Basic usage::
|
|
8
|
+
|
|
9
|
+
from montin import Deck, Plugin, SlideDefaults, CellDefaults
|
|
10
|
+
|
|
11
|
+
deck = Deck(title="My Report")
|
|
12
|
+
slide = deck.add_slide("Results", nrows=1, ncols=2)
|
|
13
|
+
slide.add_text("Hello, world!")
|
|
14
|
+
deck.write("my-report")
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from importlib.metadata import PackageNotFoundError, version
|
|
18
|
+
|
|
19
|
+
from montin.core.deck import CellDefaults, Deck, SlideDefaults
|
|
20
|
+
from montin.core.plugins import (
|
|
21
|
+
Highlight,
|
|
22
|
+
MathJax,
|
|
23
|
+
Mermaid,
|
|
24
|
+
Plotly,
|
|
25
|
+
Plugin,
|
|
26
|
+
Plugins,
|
|
27
|
+
Tabulator,
|
|
28
|
+
)
|
|
29
|
+
from montin.core.security import Security
|
|
30
|
+
from montin.exceptions import (
|
|
31
|
+
CellPlacementError,
|
|
32
|
+
MontinError,
|
|
33
|
+
InvalidDataError,
|
|
34
|
+
PluginNotDeclaredError,
|
|
35
|
+
SecurityError,
|
|
36
|
+
ThemeNotFoundError,
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
try:
|
|
40
|
+
__version__ = version("montin")
|
|
41
|
+
except PackageNotFoundError: # running from source without installing
|
|
42
|
+
__version__ = "0.0.0.dev"
|
|
43
|
+
|
|
44
|
+
__all__ = [
|
|
45
|
+
"Deck",
|
|
46
|
+
"Plugin",
|
|
47
|
+
"Plugins",
|
|
48
|
+
"Plotly",
|
|
49
|
+
"Mermaid",
|
|
50
|
+
"Highlight",
|
|
51
|
+
"MathJax",
|
|
52
|
+
"Tabulator",
|
|
53
|
+
"Security",
|
|
54
|
+
"SlideDefaults",
|
|
55
|
+
"CellDefaults",
|
|
56
|
+
"MontinError",
|
|
57
|
+
"CellPlacementError",
|
|
58
|
+
"PluginNotDeclaredError",
|
|
59
|
+
"ThemeNotFoundError",
|
|
60
|
+
"InvalidDataError",
|
|
61
|
+
"SecurityError",
|
|
62
|
+
"__version__",
|
|
63
|
+
]
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""
|
|
2
|
+
montin.cells
|
|
3
|
+
=============
|
|
4
|
+
Sub-package containing all cell types.
|
|
5
|
+
|
|
6
|
+
Import directly from here::
|
|
7
|
+
|
|
8
|
+
from montin.cells import TextCell, TableCell, ImageCell, ...
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from montin.cells.base import (
|
|
12
|
+
_UNSET,
|
|
13
|
+
Cell,
|
|
14
|
+
CellParams,
|
|
15
|
+
cell_method,
|
|
16
|
+
)
|
|
17
|
+
from montin.cells.image import ImageCell
|
|
18
|
+
from montin.cells.image_slider import ImageSliderCell
|
|
19
|
+
from montin.cells.matplotlib import MatplotlibCell
|
|
20
|
+
from montin.cells.misc import (
|
|
21
|
+
CodeCell,
|
|
22
|
+
EmptyCell,
|
|
23
|
+
HtmlCell,
|
|
24
|
+
IframeCell,
|
|
25
|
+
ListCell,
|
|
26
|
+
MermaidCell,
|
|
27
|
+
MetricCell,
|
|
28
|
+
)
|
|
29
|
+
from montin.cells.plotly import PlotlyCell
|
|
30
|
+
from montin.cells.table import TableCell
|
|
31
|
+
from montin.cells.tabulator import TabulatorCell
|
|
32
|
+
from montin.cells.text import TextCell
|
|
33
|
+
|
|
34
|
+
__all__ = [
|
|
35
|
+
# base
|
|
36
|
+
"_UNSET",
|
|
37
|
+
"Cell",
|
|
38
|
+
"CellParams",
|
|
39
|
+
"cell_method",
|
|
40
|
+
# concrete types
|
|
41
|
+
"TextCell",
|
|
42
|
+
"ImageCell",
|
|
43
|
+
"ImageSliderCell",
|
|
44
|
+
"MatplotlibCell",
|
|
45
|
+
"TableCell",
|
|
46
|
+
"TabulatorCell",
|
|
47
|
+
"ListCell",
|
|
48
|
+
"PlotlyCell",
|
|
49
|
+
"CodeCell",
|
|
50
|
+
"MetricCell",
|
|
51
|
+
"MermaidCell",
|
|
52
|
+
"HtmlCell",
|
|
53
|
+
"IframeCell",
|
|
54
|
+
"EmptyCell",
|
|
55
|
+
]
|