jupypress 0.1.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.
Files changed (83) hide show
  1. jupypress-0.1.0/.eslintrc.json +28 -0
  2. jupypress-0.1.0/.gitignore +90 -0
  3. jupypress-0.1.0/.prettierrc +10 -0
  4. jupypress-0.1.0/.yarnrc.yml +1 -0
  5. jupypress-0.1.0/CHANGELOG.md +12 -0
  6. jupypress-0.1.0/CODE_OF_CONDUCT.md +23 -0
  7. jupypress-0.1.0/CONTRIBUTING.md +126 -0
  8. jupypress-0.1.0/LICENSE +28 -0
  9. jupypress-0.1.0/MANIFEST.in +10 -0
  10. jupypress-0.1.0/PKG-INFO +178 -0
  11. jupypress-0.1.0/README.md +105 -0
  12. jupypress-0.1.0/SECURITY.md +19 -0
  13. jupypress-0.1.0/docs/AGENTS.md +298 -0
  14. jupypress-0.1.0/docs/BACKEND_STRUCTURE.md +495 -0
  15. jupypress-0.1.0/docs/DEVELOPMENT.md +191 -0
  16. jupypress-0.1.0/docs/FRONTEND_STRUCTURE.md +314 -0
  17. jupypress-0.1.0/docs/RELEASE.md +52 -0
  18. jupypress-0.1.0/docs/TEST.md +82 -0
  19. jupypress-0.1.0/docs/images/README.md +8 -0
  20. jupypress-0.1.0/docs/images/editor.png +0 -0
  21. jupypress-0.1.0/docs/images/export-html.png +0 -0
  22. jupypress-0.1.0/docs/images/launch.png +0 -0
  23. jupypress-0.1.0/docs/images/present-livecode.png +0 -0
  24. jupypress-0.1.0/docs/theming.md +89 -0
  25. jupypress-0.1.0/install.json +5 -0
  26. jupypress-0.1.0/jest.config.js +46 -0
  27. jupypress-0.1.0/jupypress/__init__.py +19 -0
  28. jupypress-0.1.0/jupypress/_version.py +5 -0
  29. jupypress-0.1.0/jupypress/cell_renderer.py +164 -0
  30. jupypress-0.1.0/jupypress/exporter.py +220 -0
  31. jupypress-0.1.0/jupypress/extension.py +16 -0
  32. jupypress-0.1.0/jupypress/handlers.py +208 -0
  33. jupypress-0.1.0/jupypress/metadata_utils.py +55 -0
  34. jupypress-0.1.0/jupypress/slide_builder.py +104 -0
  35. jupypress-0.1.0/jupypress/templates/.gitkeep +1 -0
  36. jupypress-0.1.0/jupypress/templates/deck.html.j2 +119 -0
  37. jupypress-0.1.0/jupypress/templates/static/css/base.css +693 -0
  38. jupypress-0.1.0/jupypress/templates/static/js/navigation.js +524 -0
  39. jupypress-0.1.0/jupypress/templates/themes/default/theme.css +388 -0
  40. jupypress-0.1.0/jupypress/templates/themes/jupyterlab/theme.css +139 -0
  41. jupypress-0.1.0/jupyter-config/jupyter_server_config.d/jupypress.json +7 -0
  42. jupypress-0.1.0/package.json +90 -0
  43. jupypress-0.1.0/pyproject.toml +141 -0
  44. jupypress-0.1.0/schema/plugin.json +23 -0
  45. jupypress-0.1.0/src/commands.ts +228 -0
  46. jupypress-0.1.0/src/components/CellAssigner.tsx +154 -0
  47. jupypress-0.1.0/src/components/CellPickerModal.tsx +237 -0
  48. jupypress-0.1.0/src/components/DocsModal.tsx +93 -0
  49. jupypress-0.1.0/src/components/JupyterLabPresentation.tsx +1595 -0
  50. jupypress-0.1.0/src/components/LayoutSelector.tsx +144 -0
  51. jupypress-0.1.0/src/components/SlideEditorPanel.tsx +381 -0
  52. jupypress-0.1.0/src/components/SlideItem.tsx +164 -0
  53. jupypress-0.1.0/src/components/SlideList.tsx +217 -0
  54. jupypress-0.1.0/src/components/ThemeEditor.tsx +283 -0
  55. jupypress-0.1.0/src/components/icons/Icons.tsx +82 -0
  56. jupypress-0.1.0/src/components/index.ts +11 -0
  57. jupypress-0.1.0/src/hooks/useNotebookModel.ts +160 -0
  58. jupypress-0.1.0/src/index.ts +66 -0
  59. jupypress-0.1.0/src/service.ts +111 -0
  60. jupypress-0.1.0/src/tokens.ts +50 -0
  61. jupypress-0.1.0/src/toolbar.ts +24 -0
  62. jupypress-0.1.0/src/utils/css/base.css.ts +701 -0
  63. jupypress-0.1.0/src/utils/css/theme.css.ts +389 -0
  64. jupypress-0.1.0/src/utils/htmlBuilder.ts +480 -0
  65. jupypress-0.1.0/src/utils/js/navigation.js.ts +535 -0
  66. jupypress-0.1.0/src/utils/kernelExecutor.ts +181 -0
  67. jupypress-0.1.0/src/utils/metadata.ts +77 -0
  68. jupypress-0.1.0/src/utils/outputRenderer.ts +119 -0
  69. jupypress-0.1.0/src/utils/slideMapper.ts +73 -0
  70. jupypress-0.1.0/style/index.css +2060 -0
  71. jupypress-0.1.0/tests/js/htmlBuilder.test.ts +285 -0
  72. jupypress-0.1.0/tests/js/kernelExecutor.test.ts +105 -0
  73. jupypress-0.1.0/tests/js/metadata.test.ts +91 -0
  74. jupypress-0.1.0/tests/js/outputRenderer.test.ts +56 -0
  75. jupypress-0.1.0/tests/js/slideMapper.test.ts +87 -0
  76. jupypress-0.1.0/tests/python/conftest.py +81 -0
  77. jupypress-0.1.0/tests/python/notebooks/sample.ipynb +57 -0
  78. jupypress-0.1.0/tests/python/test_cell_renderer.py +72 -0
  79. jupypress-0.1.0/tests/python/test_exporter.py +51 -0
  80. jupypress-0.1.0/tests/python/test_handlers.py +28 -0
  81. jupypress-0.1.0/tests/python/test_slide_builder.py +53 -0
  82. jupypress-0.1.0/tsconfig.json +29 -0
  83. jupypress-0.1.0/yarn.lock +8771 -0
@@ -0,0 +1,28 @@
1
+ {
2
+ "parser": "@typescript-eslint/parser",
3
+ "parserOptions": {
4
+ "ecmaVersion": 2020,
5
+ "sourceType": "module",
6
+ "ecmaFeatures": {
7
+ "jsx": true
8
+ }
9
+ },
10
+ "extends": [
11
+ "eslint:recommended",
12
+ "plugin:@typescript-eslint/recommended"
13
+ ],
14
+ "rules": {
15
+ "no-unused-vars": "off",
16
+ "no-useless-escape": "off",
17
+ "no-control-regex": "off",
18
+ "@typescript-eslint/no-namespace": "off",
19
+ "@typescript-eslint/no-unused-vars": [
20
+ "error",
21
+ {
22
+ "argsIgnorePattern": "^_"
23
+ }
24
+ ],
25
+ "@typescript-eslint/explicit-module-boundary-types": "off",
26
+ "@typescript-eslint/no-explicit-any": "warn"
27
+ }
28
+ }
@@ -0,0 +1,90 @@
1
+ # .gitignore for jupypress
2
+
3
+ # Python
4
+ __pycache__/
5
+ *.py[cod]
6
+ *$py.class
7
+ *.so
8
+ .Python
9
+ build/
10
+ develop-eggs/
11
+ dist/
12
+ downloads/
13
+ eggs/
14
+ .eggs/
15
+ lib64/
16
+ parts/
17
+ sdist/
18
+ var/
19
+ wheels/
20
+ *.egg-info/
21
+ .installed.cfg
22
+ *.egg
23
+ pip-wheel-metadata/
24
+ __pypackages__/
25
+
26
+ # Virtual environments
27
+ venv/
28
+ ENV/
29
+ env/
30
+ .venv/
31
+
32
+ # IDEs
33
+ .vscode/
34
+ .idea/
35
+ *.swp
36
+ *.swo
37
+ *~
38
+
39
+ # Jupyter
40
+ .ipynb_checkpoints/
41
+
42
+ # Node/JS
43
+ node_modules/
44
+ .yarn/
45
+ *.tsbuildinfo
46
+ *.d.ts
47
+ npm-debug.log*
48
+ yarn-debug.log*
49
+ yarn-error.log*
50
+ .pnp/
51
+ .pnp.js
52
+ .package-lock.json # because we use jlpm (yarn instead of npm)
53
+
54
+ # TypeScript build output
55
+ lib/
56
+
57
+ # Hatch
58
+ .hatch/
59
+
60
+ # pytest
61
+ .pytest_cache/
62
+ .ruff_cache/
63
+ htmlcov/
64
+ .coverage
65
+
66
+ # Jest coverage
67
+ coverage/
68
+
69
+ # OS
70
+ .DS_Store
71
+ .env
72
+ .env.*
73
+ .cache/
74
+
75
+ # Local tools (act binary)
76
+ bin/
77
+
78
+ # Local AI/agent tooling state
79
+ .agents/
80
+ .codex/
81
+ .playwright-mcp/
82
+
83
+ # Prompts (local dev only)
84
+ .github/prompts/
85
+
86
+ # Compiled labextensions and static assets
87
+ jupypress/labextension/
88
+
89
+ # Reference
90
+ reference/
@@ -0,0 +1,10 @@
1
+ {
2
+ "printWidth": 100,
3
+ "tabWidth": 2,
4
+ "useTabs": false,
5
+ "semi": true,
6
+ "singleQuote": true,
7
+ "trailingComma": "es5",
8
+ "bracketSpacing": true,
9
+ "arrowParens": "always"
10
+ }
@@ -0,0 +1 @@
1
+ nodeLinker: node-modules
@@ -0,0 +1,12 @@
1
+ # Changelog
2
+
3
+ All notable changes to JupyPress will be documented in this file.
4
+
5
+ This project follows semantic versioning once public releases begin.
6
+
7
+ ## 0.1.0 - Initial Release
8
+
9
+ - Add JupyterLab extension for building slide decks from notebook metadata.
10
+ - Add JupyterLab-backed preview and present modes using notebook output areas.
11
+ - Add standalone HTML export for static, shareable presentations.
12
+ - Add slide layouts, theming, keyboard navigation, and live code execution support.
@@ -0,0 +1,23 @@
1
+ # Code of Conduct
2
+
3
+ JupyPress contributors are expected to keep project discussions professional, constructive, and focused on improving the software.
4
+
5
+ ## Expected Behavior
6
+
7
+ - Be respectful of different experience levels and use cases.
8
+ - Provide actionable feedback.
9
+ - Keep issues and pull requests focused on the technical topic.
10
+ - Assume good intent while still being clear about defects, risks, and tradeoffs.
11
+
12
+ ## Unacceptable Behavior
13
+
14
+ - Harassment, intimidation, or personal attacks.
15
+ - Dismissive or discriminatory language.
16
+ - Publishing private information without permission.
17
+ - Repeated off-topic or disruptive comments.
18
+
19
+ ## Enforcement
20
+
21
+ Maintainers may edit, hide, or remove comments; close issues; reject contributions; or block participants when needed to keep the project usable for contributors and users.
22
+
23
+ Report conduct concerns through GitHub issue moderation tools or directly to the maintainers if contact information is available.
@@ -0,0 +1,126 @@
1
+ # Contributing to JupyPress
2
+
3
+ We welcome contributions! Here's how to get started.
4
+
5
+ ## Code of Conduct
6
+
7
+ Be respectful and inclusive. We're building a welcoming community.
8
+
9
+ ## Getting Started
10
+
11
+ 1. Fork the repository
12
+ 2. Clone your fork
13
+ 3. Follow [DEVELOPMENT.md](docs/DEVELOPMENT.md) for setup
14
+ 4. Create a feature branch: `git checkout -b feature/my-feature`
15
+
16
+ ## Development Workflow
17
+
18
+ See [DEVELOPMENT.md](docs/DEVELOPMENT.md) for the full setup and dev-cycle instructions.
19
+
20
+ ### Making Changes
21
+
22
+ 1. Write code following the style guide
23
+ 2. Write tests for new features
24
+ 3. Rebuild and reinstall: `python -m build && pip install --force-reinstall ./dist/jupypress-0.1.0-py3-none-any.whl`
25
+ 4. Ensure all tests pass: `hatch run test && jlpm run test`
26
+ 5. Format code: `jlpm run format`
27
+ 6. Lint: `jlpm run lint` and `hatch run lint`
28
+
29
+ ### Testing
30
+
31
+ ```bash
32
+ # Python tests
33
+ hatch run test
34
+
35
+ # JavaScript tests
36
+ jlpm run test
37
+
38
+ # Watch mode (JS)
39
+ jlpm run test:watch
40
+ ```
41
+
42
+ ### Code Style
43
+
44
+ - **Python**: PEP 8, enforced by `ruff`
45
+ - **TypeScript**: ESLint + Prettier
46
+ - **React**: Functional components with hooks
47
+ - **CSS**: CSS variables for theming
48
+
49
+ ### Commit Messages
50
+
51
+ Follow [Conventional Commits](https://www.conventionalcommits.org/):
52
+
53
+ ```
54
+ feat: add new layout type
55
+ fix: correct slide ordering bug
56
+ docs: update theming guide
57
+ test: add tests for cell renderer
58
+ chore: update dependencies
59
+ ```
60
+
61
+ ## Submitting Changes
62
+
63
+ 1. Push to your fork
64
+ 2. Create a Pull Request
65
+ 3. Describe what your PR does
66
+ 4. Link any related issues
67
+ 5. Ensure CI passes
68
+ 6. Request review
69
+
70
+ ## Adding Features
71
+
72
+ ### New Slide Layouts
73
+
74
+ 1. Add to `LAYOUTS` in `src/components/LayoutSelector.tsx`
75
+ 2. Add CSS in `jupypress/templates/static/css/base.css`
76
+ 3. Update `slide_builder.py` validation
77
+ 4. Write tests
78
+
79
+ ### New Themes
80
+
81
+ 1. Create `jupypress/templates/themes/my-theme/theme.css`
82
+ 2. Define CSS variables
83
+ 3. Add tests
84
+ 4. Document in README
85
+
86
+ ### New Renderers
87
+
88
+ 1. Extend `CellRenderer` in `jupypress/cell_renderer.py`
89
+ 2. Add MIME type handler
90
+ 3. Write tests with sample outputs
91
+
92
+ ## Documentation
93
+
94
+ - Update README.md for user-facing changes
95
+ - Add docstrings to Python functions
96
+ - Add JSDoc comments to TypeScript
97
+ - Update docs/DEVELOPMENT.md for setup changes
98
+
99
+ ## Performance
100
+
101
+ - Profile before optimizing
102
+ - Consider notebook size (large notebooks should still export quickly)
103
+ - Minimize CSS/JS bundle size
104
+ - Cache theme parsing
105
+
106
+ ## Accessibility
107
+
108
+ - Ensure keyboard navigation works
109
+ - Add ARIA labels to UI components
110
+ - Test with screen readers
111
+ - Maintain color contrast ratios
112
+
113
+ ## Security
114
+
115
+ - Validate file paths (prevent directory traversal)
116
+ - Escape HTML properly
117
+ - Don't execute untrusted code by default
118
+ - Review dependencies for vulnerabilities
119
+
120
+ ## Questions?
121
+
122
+ - Check existing issues
123
+ - Start a discussion
124
+ - Contact maintainers
125
+
126
+ Thank you for contributing!
@@ -0,0 +1,28 @@
1
+ BSD 3-Clause License
2
+
3
+ Copyright (c) 2026, JupyPress Contributors
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ 1. Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ 2. Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ 3. Neither the name of the copyright holder nor the names of its
16
+ contributors may be used to endorse or promote products derived from
17
+ this software without specific prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1,10 @@
1
+ recursive-include jupypress/templates *
2
+ recursive-include jupypress/labextension *
3
+ recursive-include jupypress *.py
4
+ global-exclude node_modules
5
+ global-exclude .yarn
6
+ global-exclude .git
7
+ global-exclude __pycache__
8
+ global-exclude *.pyc
9
+ global-exclude .pytest_cache
10
+ global-exclude .ruff_cache
@@ -0,0 +1,178 @@
1
+ Metadata-Version: 2.4
2
+ Name: jupypress
3
+ Version: 0.1.0
4
+ Summary: A JupyterLab extension for converting notebooks into HTML slide presentations
5
+ Project-URL: Homepage, https://github.com/andibuwono/jupypress
6
+ Project-URL: Repository, https://github.com/andibuwono/jupypress
7
+ Project-URL: Issues, https://github.com/andibuwono/jupypress/issues
8
+ Project-URL: Documentation, https://github.com/andibuwono/jupypress#readme
9
+ Project-URL: Changelog, https://github.com/andibuwono/jupypress/blob/main/CHANGELOG.md
10
+ Author: JupyPress Contributors
11
+ License: BSD 3-Clause License
12
+
13
+ Copyright (c) 2026, JupyPress Contributors
14
+
15
+ Redistribution and use in source and binary forms, with or without
16
+ modification, are permitted provided that the following conditions are met:
17
+
18
+ 1. Redistributions of source code must retain the above copyright notice, this
19
+ list of conditions and the following disclaimer.
20
+
21
+ 2. Redistributions in binary form must reproduce the above copyright notice,
22
+ this list of conditions and the following disclaimer in the documentation
23
+ and/or other materials provided with the distribution.
24
+
25
+ 3. Neither the name of the copyright holder nor the names of its
26
+ contributors may be used to endorse or promote products derived from
27
+ this software without specific prior written permission.
28
+
29
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
30
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
31
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
32
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
33
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
34
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
35
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
36
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
37
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39
+ License-File: LICENSE
40
+ Keywords: html,jupyter,jupyterlab,presentation,slides
41
+ Classifier: Development Status :: 3 - Alpha
42
+ Classifier: Framework :: Jupyter
43
+ Classifier: Framework :: Jupyter :: JupyterLab
44
+ Classifier: Framework :: Jupyter :: JupyterLab :: 4
45
+ Classifier: Intended Audience :: Developers
46
+ Classifier: Intended Audience :: Science/Research
47
+ Classifier: License :: OSI Approved :: BSD License
48
+ Classifier: Programming Language :: Python :: 3
49
+ Classifier: Programming Language :: Python :: 3.10
50
+ Classifier: Programming Language :: Python :: 3.11
51
+ Classifier: Programming Language :: Python :: 3.12
52
+ Classifier: Programming Language :: Python :: 3.13
53
+ Classifier: Topic :: Scientific/Engineering :: Visualization
54
+ Requires-Python: >=3.10
55
+ Requires-Dist: jinja2>=3.1.0
56
+ Requires-Dist: jupyter-core>=5.0.0
57
+ Requires-Dist: jupyter-server<3,>=2.0.0
58
+ Requires-Dist: markdown-it-py>=3.0.0
59
+ Requires-Dist: nbconvert>=7.8.0
60
+ Requires-Dist: nbformat>=5.9.0
61
+ Requires-Dist: pygments>=2.16.0
62
+ Provides-Extra: dev
63
+ Requires-Dist: build; extra == 'dev'
64
+ Requires-Dist: hatch; extra == 'dev'
65
+ Requires-Dist: pre-commit; extra == 'dev'
66
+ Requires-Dist: ruff>=0.1.0; extra == 'dev'
67
+ Requires-Dist: twine; extra == 'dev'
68
+ Provides-Extra: test
69
+ Requires-Dist: jupyter-server[test]>=2.0.0; extra == 'test'
70
+ Requires-Dist: pytest-asyncio; extra == 'test'
71
+ Requires-Dist: pytest>=7.0; extra == 'test'
72
+ Description-Content-Type: text/markdown
73
+
74
+ # JupyPress
75
+
76
+ JupyPress is a JupyterLab extension for turning notebooks into HTML slide presentations.
77
+
78
+ It supports two output paths:
79
+
80
+ - JupyterLab-backed preview and present modes for live notebook outputs, widgets, and live code execution.
81
+ - Standalone HTML export for static, shareable presentations that do not require a running kernel.
82
+
83
+ ## Requirements
84
+
85
+ - Python 3.10 or newer
86
+ - JupyterLab 4.x
87
+ - A modern Chromium, Firefox, or Safari browser
88
+
89
+ ## Installation
90
+
91
+ ```bash
92
+ pip install jupypress
93
+ jupyter lab
94
+ ```
95
+
96
+ Open a notebook, then use the JupyPress toolbar button or the command palette command `JupyPress: Open Editor`.
97
+
98
+ ## Basic Usage
99
+
100
+ 1. Create slides in the JupyPress editor.
101
+ 2. Choose a slide layout.
102
+ 3. Assign notebook cells to slide slots.
103
+ 4. Use preview for JupyterLab-backed rendering.
104
+ 5. Use present mode for a browser presentation backed by the active notebook session.
105
+ 6. Export to HTML for a static file that can be opened without JupyterLab.
106
+
107
+ ## Features
108
+
109
+ - Slide metadata stored directly in the notebook.
110
+ - Built-in layouts for title, content, two-column, and multi-row slides.
111
+ - JupyterLab-backed preview and present modes using notebook output areas.
112
+ - Static HTML export with embedded presentation CSS and navigation.
113
+ - Theme support through CSS variables.
114
+ - Markdown, code, rich outputs, images, Plotly, Leaflet/Folium, and saved widget output support.
115
+ - Live code execution in JupyterLab-backed presentation mode.
116
+
117
+ ## Output Modes
118
+
119
+ ### Preview and Present
120
+
121
+ Preview and present modes run inside the JupyterLab environment and render assigned cells with JupyterLab output areas. This is the right mode for live notebook work, active kernels, widgets, and outputs that need JupyterLab renderers.
122
+
123
+ ### HTML Export
124
+
125
+ HTML export creates a standalone static presentation. The exported file is designed for sharing and viewing without JupyterLab. Dynamic widget kernels are not available in this mode, but saved/static DOM output is included where possible.
126
+
127
+ ## Screenshots
128
+
129
+ Release screenshots are stored under `docs/images/`:
130
+
131
+ - `docs/images/editor.png`
132
+ - `docs/images/export-html.png`
133
+ - `docs/images/launch.png`
134
+ - `docs/images/present-livecode.png`
135
+
136
+ See `docs/images/README.md` for the intended use of each capture.
137
+
138
+ ## Development
139
+
140
+ ```bash
141
+ git clone https://github.com/andibuwono/jupypress.git
142
+ cd jupypress
143
+ jlpm install
144
+ jlpm run build:labextension
145
+ python -m build
146
+ pip install --force-reinstall ./dist/jupypress-0.1.0-py3-none-any.whl
147
+ jupyter lab
148
+ ```
149
+
150
+ Use `jlpm` rather than `npm`; JupyterLab manages the Yarn environment.
151
+
152
+ See:
153
+
154
+ - `docs/DEVELOPMENT.md` for local setup and development workflow.
155
+ - `docs/BACKEND_STRUCTURE.md` for the Python backend map.
156
+ - `docs/FRONTEND_STRUCTURE.md` for the TypeScript/React frontend map.
157
+ - `docs/TEST.md` for test commands.
158
+ - `docs/theming.md` for theme variables.
159
+
160
+ ## Testing
161
+
162
+ ```bash
163
+ hatch run test
164
+ jlpm run test
165
+ jlpm run build:labextension
166
+ ```
167
+
168
+ ## Release
169
+
170
+ See `docs/RELEASE.md` for the PyPI and GitHub release checklist.
171
+
172
+ ## Contributing
173
+
174
+ Contributions are welcome. See `CONTRIBUTING.md` and `CODE_OF_CONDUCT.md`.
175
+
176
+ ## License
177
+
178
+ JupyPress is distributed under the BSD 3-Clause License. See `LICENSE`.
@@ -0,0 +1,105 @@
1
+ # JupyPress
2
+
3
+ JupyPress is a JupyterLab extension for turning notebooks into HTML slide presentations.
4
+
5
+ It supports two output paths:
6
+
7
+ - JupyterLab-backed preview and present modes for live notebook outputs, widgets, and live code execution.
8
+ - Standalone HTML export for static, shareable presentations that do not require a running kernel.
9
+
10
+ ## Requirements
11
+
12
+ - Python 3.10 or newer
13
+ - JupyterLab 4.x
14
+ - A modern Chromium, Firefox, or Safari browser
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ pip install jupypress
20
+ jupyter lab
21
+ ```
22
+
23
+ Open a notebook, then use the JupyPress toolbar button or the command palette command `JupyPress: Open Editor`.
24
+
25
+ ## Basic Usage
26
+
27
+ 1. Create slides in the JupyPress editor.
28
+ 2. Choose a slide layout.
29
+ 3. Assign notebook cells to slide slots.
30
+ 4. Use preview for JupyterLab-backed rendering.
31
+ 5. Use present mode for a browser presentation backed by the active notebook session.
32
+ 6. Export to HTML for a static file that can be opened without JupyterLab.
33
+
34
+ ## Features
35
+
36
+ - Slide metadata stored directly in the notebook.
37
+ - Built-in layouts for title, content, two-column, and multi-row slides.
38
+ - JupyterLab-backed preview and present modes using notebook output areas.
39
+ - Static HTML export with embedded presentation CSS and navigation.
40
+ - Theme support through CSS variables.
41
+ - Markdown, code, rich outputs, images, Plotly, Leaflet/Folium, and saved widget output support.
42
+ - Live code execution in JupyterLab-backed presentation mode.
43
+
44
+ ## Output Modes
45
+
46
+ ### Preview and Present
47
+
48
+ Preview and present modes run inside the JupyterLab environment and render assigned cells with JupyterLab output areas. This is the right mode for live notebook work, active kernels, widgets, and outputs that need JupyterLab renderers.
49
+
50
+ ### HTML Export
51
+
52
+ HTML export creates a standalone static presentation. The exported file is designed for sharing and viewing without JupyterLab. Dynamic widget kernels are not available in this mode, but saved/static DOM output is included where possible.
53
+
54
+ ## Screenshots
55
+
56
+ Release screenshots are stored under `docs/images/`:
57
+
58
+ - `docs/images/editor.png`
59
+ - `docs/images/export-html.png`
60
+ - `docs/images/launch.png`
61
+ - `docs/images/present-livecode.png`
62
+
63
+ See `docs/images/README.md` for the intended use of each capture.
64
+
65
+ ## Development
66
+
67
+ ```bash
68
+ git clone https://github.com/andibuwono/jupypress.git
69
+ cd jupypress
70
+ jlpm install
71
+ jlpm run build:labextension
72
+ python -m build
73
+ pip install --force-reinstall ./dist/jupypress-0.1.0-py3-none-any.whl
74
+ jupyter lab
75
+ ```
76
+
77
+ Use `jlpm` rather than `npm`; JupyterLab manages the Yarn environment.
78
+
79
+ See:
80
+
81
+ - `docs/DEVELOPMENT.md` for local setup and development workflow.
82
+ - `docs/BACKEND_STRUCTURE.md` for the Python backend map.
83
+ - `docs/FRONTEND_STRUCTURE.md` for the TypeScript/React frontend map.
84
+ - `docs/TEST.md` for test commands.
85
+ - `docs/theming.md` for theme variables.
86
+
87
+ ## Testing
88
+
89
+ ```bash
90
+ hatch run test
91
+ jlpm run test
92
+ jlpm run build:labextension
93
+ ```
94
+
95
+ ## Release
96
+
97
+ See `docs/RELEASE.md` for the PyPI and GitHub release checklist.
98
+
99
+ ## Contributing
100
+
101
+ Contributions are welcome. See `CONTRIBUTING.md` and `CODE_OF_CONDUCT.md`.
102
+
103
+ ## License
104
+
105
+ JupyPress is distributed under the BSD 3-Clause License. See `LICENSE`.
@@ -0,0 +1,19 @@
1
+ # Security Policy
2
+
3
+ ## Supported Versions
4
+
5
+ Security fixes are provided for the latest released version of JupyPress.
6
+
7
+ ## Reporting a Vulnerability
8
+
9
+ Please report security issues using GitHub private vulnerability reporting if it is enabled for the repository. If private reporting is not available, open a GitHub issue with a minimal description and avoid including exploit details publicly.
10
+
11
+ Include:
12
+
13
+ - Affected JupyPress version
14
+ - JupyterLab and Python versions
15
+ - Reproduction steps
16
+ - Expected and actual behavior
17
+ - Any relevant notebook or export configuration, with sensitive data removed
18
+
19
+ Maintainers will confirm receipt, assess impact, and coordinate a fix before public disclosure where appropriate.