MkDocs plugin for interactive side-by-side JavaScript documentation examples.
Project description
MkDocs Sidecode
mkdocs-sidecode is a separate MkDocs plugin project for interactive side-by-side documentation examples. It turns specially marked JavaScript fences into side-by-side examples with an editable editor, live output, optional console capture, named fragments, and deterministic fragment references.
The fence intentionally stays javascript so ordinary Markdown editors still highlight the source as JavaScript:
```javascript sidecode title="Counter Example" console=true height=420
//@HEADER counter_setup
container.innerHTML = '<button type="button">Count: 0</button>';
const button = container.querySelector('button');
let count = 0;
function setCount(value) {
count = value;
button.textContent = `Count: ${count}`;
}
//@BODY counter_body
setCount(3);
console.log('counter initialized');
```
Why javascript Fences Stay Intact
The plugin does not introduce a custom fence language such as sidecode. Instead it recognizes JavaScript fences whose info string also contains sidecode. That keeps normal editor highlighting intact while still giving MkDocs a reliable marker.
Supported forms:
```javascript sidecode title="Basic Example"```javascript sidecode```javascript {sidecode} title="Basic Example"
Fence options:
title="...": optional heading. Omit it for an untitled example.console=true: add a console panel and captureconsole.log,console.info,console.warn, andconsole.error.render=false console=true: show only the console panel. A hidden runtime container is still created so examples can safely usecontainer.width=720orwidth="42rem": set the example width. Bare numbers are treated as pixels.height=420orheight="32rem": set the editor/output height. Bare numbers are treated as pixels.autorun=false: disable initial and debounced edit-time execution. The Run button andCmd/Ctrl+Enterstill execute the example.autorun=true: default behavior. Edits rerun with a short debounce, and incomplete JavaScript is skipped until it parses.
Authoring Syntax
Supported directives inside the fence:
//@HEADER <name>: hidden setup code that runs before the editable body.//@BODY <name>: visible editable code shown in the editor.//@REF HEADER <name>: include a previously defined named header fragment on the same page.//@REF BODY <name>: include a previously defined named body fragment on the same page.
Example with references:
```javascript sidecode title="Counter Follow-up" console=true
//@REF HEADER counter_setup
//@REF BODY counter_body
//@BODY counter_followup
button.style.fontWeight = '700';
console.log(`current count: ${count}`);
```
Rules:
- Fragment names are page-local.
- Referenced fragments must already exist earlier on the page.
- Missing references fail the docs build clearly.
- Circular references are rejected clearly.
- Body-fragment propagation is one-way in this milestone: editing a source body updates dependent examples that reference that body fragment.
- Examples with
REFdirectives show a small "Uses code from" strip above the editor with the imported HEADER/BODY fragment names.
Execution Model
Each interactive example receives:
container: the render target DOM node.consoleTarget: the console panel DOM node when enabled.context: an execution context with cleanup registration and an abort signal.registerCleanup(fn): helper for disposal hooks.
The runtime composes execution code in this order:
- Referenced header fragments.
- Local header fragment.
- Referenced body fragments.
- Local editable body fragment.
Header code is hidden by default. Body code is editable. Console capture uses a scoped console object inside the example module so async callbacks keep writing into the example console panel instead of depending on browser devtools.
Cleanup Model
Before rerunning an example, the runtime:
- Aborts the previous execution signal.
- Runs registered cleanup callbacks in reverse order.
- Clears render and console containers.
- Re-executes the current composed example.
This gives the docs runtime a standard cleanup contract for canvases, listeners, timers, and retained DOM nodes without forcing each author to reimplement boilerplate.
Local Development
Install Python and frontend dependencies:
cd mkdocs-sidecode
python -m pip install '.[dev]'
npm install
npm run build
Run tests:
pytest
npm test
Run the demo site:
mkdocs serve -f demo/mkdocs.yml
Build the package artifacts:
python -m build
MkDocs Material compatibility and theming:
mkdocs-sidecode uses standard MkDocs plugin hooks plus extra_css and extra_javascript asset registration, so it works with the built-in MkDocs theme and Material for MkDocs. Material's instant navigation is supported by listening for its document$ page-change event when it is present.
The stylesheet follows Material's data-md-color-scheme attribute for light/dark palettes and falls back to prefers-color-scheme outside Material. The editor uses the same CSS variables as the surrounding sidecode frame, so it tracks the active docs theme rather than forcing a fixed light UI.
MkDocs Integration
Add the plugin to your MkDocs config after installing it:
plugins:
- search
- sidecode:
import_map:
helios-web: ../vendor/helios/helios-web.es.js
helios-network: ../vendor/helios/helios-network.js
The plugin injects its own runtime script and styles when a page contains interactive example fences.
import_map lets examples show package-style ES imports while the runtime rewrites
those specifiers to local browser assets. Relative mapped paths resolve from
assets/mkdocs-sidecode/runtime.js, so ../vendor/... points at
assets/vendor/... in the built site.
Release
Recommended release flow:
- Run local verification:
npm test npm run build PYTHONPATH=src pytest mkdocs build -f demo/mkdocs.yml python -m build
- Commit and push
main. - Create a Git tag such as
v0.1.2and push it. - Let GitHub Actions publish the built package to PyPI through trusted publishing.
Initial GitHub setup:
- Create a GitHub repository for this directory.
- Push the
mainbranch. - In PyPI, create the
mkdocs-sidecodeproject and configure trusted publishing for the GitHub repository. - After that, each pushed
v*tag can publish automatically through.github/workflows/publish.yml.
Deploying docs that use this plugin:
pip install mkdocs-material mkdocs-sidecode
mkdocs build
mkdocs gh-deploy
For GitHub Pages through Actions, install mkdocs-sidecode in the docs workflow before running mkdocs build.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mkdocs_sidecode-0.1.6.tar.gz.
File metadata
- Download URL: mkdocs_sidecode-0.1.6.tar.gz
- Upload date:
- Size: 211.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
550bb54e4b9cc04cf7f8b2d1de672280daf297e3a2a9a40a7132dbed64865902
|
|
| MD5 |
bb521f33c302842ce313b2babdb0562c
|
|
| BLAKE2b-256 |
4d76bd131f29e02b14dce5f685c41432d08697edb7a2069a957fd61fc493b38e
|
Provenance
The following attestation bundles were made for mkdocs_sidecode-0.1.6.tar.gz:
Publisher:
publish.yml on filipinascimento/mkdocs-sidecode
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mkdocs_sidecode-0.1.6.tar.gz -
Subject digest:
550bb54e4b9cc04cf7f8b2d1de672280daf297e3a2a9a40a7132dbed64865902 - Sigstore transparency entry: 1410946735
- Sigstore integration time:
-
Permalink:
filipinascimento/mkdocs-sidecode@355b13529e002a1a704c3bb8e2b1c99d2df4e737 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/filipinascimento
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@355b13529e002a1a704c3bb8e2b1c99d2df4e737 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mkdocs_sidecode-0.1.6-py3-none-any.whl.
File metadata
- Download URL: mkdocs_sidecode-0.1.6-py3-none-any.whl
- Upload date:
- Size: 182.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa8343643d1e2d2ecb3767b18416312f0ae2c9b1eb0111f30a41abf0259e0f98
|
|
| MD5 |
bfdfe3d7a948db27fb05d31a03ed5fa8
|
|
| BLAKE2b-256 |
105912246d40a237e991c38282c74beb77b55cfb2b5eb93ff24047cf4c748fd2
|
Provenance
The following attestation bundles were made for mkdocs_sidecode-0.1.6-py3-none-any.whl:
Publisher:
publish.yml on filipinascimento/mkdocs-sidecode
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mkdocs_sidecode-0.1.6-py3-none-any.whl -
Subject digest:
fa8343643d1e2d2ecb3767b18416312f0ae2c9b1eb0111f30a41abf0259e0f98 - Sigstore transparency entry: 1410946798
- Sigstore integration time:
-
Permalink:
filipinascimento/mkdocs-sidecode@355b13529e002a1a704c3bb8e2b1c99d2df4e737 -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/filipinascimento
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@355b13529e002a1a704c3bb8e2b1c99d2df4e737 -
Trigger Event:
push
-
Statement type: