/* Copyright 2026 Marimo. All rights reserved. */ import type { Meta, StoryObj } from "@storybook/react-vite"; import { createStore, Provider } from "jotai"; import { createRef } from "react"; import { cellId } from "@/__tests__/branded"; import { type NotebookState, notebookAtom } from "@/core/cells/cells"; import { type CellRuntimeState, createCellRuntimeState, } from "@/core/cells/types"; import { defaultUserConfig } from "@/core/config/config-schema"; import { connectionAtom } from "@/core/network/connection"; import { requestClientAtom } from "@/core/network/requests"; import { resolveRequestClient } from "@/core/network/resolve"; import type { CellConfig } from "@/core/network/types"; import { WebSocketState } from "@/core/websocket/types"; import { MultiColumn } from "@/utils/id-tree"; import type { Milliseconds, Seconds } from "@/utils/time"; import { Cell as EditorCell } from "../components/editor/notebook-cell"; import { TooltipProvider } from "../components/ui/tooltip"; type Story = StoryObj; const Cell: React.FC<{ overrides?: { runElapsedTimeMs?: Milliseconds; output?: CellRuntimeState["output"]; edited?: boolean; interrupted?: boolean; errored?: boolean; status?: CellRuntimeState["status"]; staleInputs?: boolean; config?: CellConfig; }; }> = ({ overrides = {} }) => { const cid = cellId("1"); const notebook: NotebookState = { cellData: { [cid]: { id: cid, name: "cell_1", code: "import marimo as mo", edited: overrides.edited ?? false, serializedEditorState: null, config: { hide_code: overrides.config?.hide_code ?? false, disabled: overrides.config?.disabled ?? false, column: null, }, lastCodeRun: null, lastExecutionTime: null, }, }, cellIds: MultiColumn.from([[cid]]), cellRuntime: { [cid]: createCellRuntimeState({ output: overrides.output ?? null, runElapsedTimeMs: overrides.runElapsedTimeMs ?? (10 as Milliseconds), status: overrides.status ?? "idle", consoleOutputs: [], interrupted: overrides.interrupted ?? false, errored: overrides.errored ?? false, stopped: false, staleInputs: overrides.staleInputs ?? false, runStartTimestamp: 0 as Seconds, lastRunStartTimestamp: 0 as Seconds, debuggerActive: false, outline: null, }), }, cellHandles: { [cid]: createRef(), }, cellLogs: [], history: [], scrollKey: null, untouchedNewCells: new Set(), }; const store = createStore(); store.set(notebookAtom, notebook); store.set(connectionAtom, { state: WebSocketState.OPEN }); store.set(requestClientAtom, resolveRequestClient()); return ( ); }; export default { title: "Cell", component: Cell, args: {}, } satisfies Meta; export const Primary: Story = { render: () => (
), }; export const WithOutput: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const WithLargeOutput: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

".repeat( 10, ), mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const UnsavedEditsOutput: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const InterruptedOutput: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const WithError: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const Disabled: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const DisabledTransitively: Story = { render: () => (
), }; export const StaleStatus: Story = { render: () => (
), }; export const StaleAndEditedStatus: Story = { render: () => (
), }; export const DisabledAndStaleStatus: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), }; export const Running: Story = { render: () => (

Layout

\n

marimo provides functions to help you lay out your output, such as\nin rows and columns, accordions, tabs, and callouts. This tutorial\nshows some examples.

", mimetype: "text/html", timestamp: 1_686_863_688, }, }} />
), };