React components for building your own Python editor/notebook in the browser, powered by marimo and Pyodide.
npm install @marimo-team/blocks
# or
yarn add @marimo-team/blocks
# or
pnpm add @marimo-team/blocks
import {
Provider as MarimoProvider,
CellEditor,
CellOutput,
CellRunButton,
NotebookRunButton,
} from "@marimo-team/blocks";
function MyNotebook() {
return (
<MarimoProvider
pyodideUrl="https://cdn.jsdelivr.net/pyodide/v0.25.0/full/pyodide.js"
dependencies={["numpy", "pandas"]}
onReady={() => console.log("Pyodide ready!")}
>
<div className="cell">
<CellEditor
id="cell1"
code="import numpy as np\nnp.random.rand(10)"
onChange={(code) => console.log("Code changed:", code)}
/>
<CellOutput id="cell1" />
<CellRunButton
id="cell1"
onExecutionComplete={(error) => {
if (error) console.error("Execution failed:", error);
}}
/>
</div>
<NotebookRunButton
onExecutionComplete={() => console.log("All cells executed!")}
/>
</MarimoProvider>
);
}
The root component that initializes Pyodide and provides context to child components.
A code editor component built on CodeMirror with Python syntax highlighting.
Displays the output of Python code execution, including stdout, stderr, and rich output types.
A button to execute a single cell's code.
A button to execute all cells in sequence.
You can add custom renderers to handle specific MIME types in cell outputs. Here's an example using @textea/json-viewer for JSON output:
import { JsonViewer } from "@textea/json-viewer";
<MarimoProvider
dependencies={["numpy"]}
renderers={[
{
mimeType: "application/json",
priority: 1,
render: (data) => (
<JsonViewer value={data} displayDataTypes={false} />
),
},
]}
>
{/* ... */}
</MarimoProvider>
# Install dependencies
pnpm install
# Start development server
pnpm dev
# Run tests
pnpm test
# Build for production
pnpm build
Apache-2.0