import type { Meta, StoryObj } from "@storybook/react"; import { InlineToolItem } from "../run/inline-tool-item"; import type { ToolPart } from "../types/parts"; const meta: Meta = { title: "Foundations/Theme Showcase", parameters: { layout: "fullscreen" }, }; export default meta; type Story = StoryObj; const THEMES: { name: string; theme?: string }[] = [ { name: "Tangle (neutral)", theme: undefined }, // default :root dark { name: "Tangle · dark", theme: "tangle-dark" }, // the same spine, named { name: "Tangle · light", theme: "tangle-light" }, { name: "Aubergine (bazaar)", theme: "aubergine" }, { name: "Aubergine · light", theme: "aubergine-light" }, { name: "Experimental green", theme: "arena" }, { name: "Experimental green · light", theme: "arena-light" }, ]; const NOW = Date.now(); const themeToolParts: ToolPart[] = [ { type: "tool", id: "theme-read", tool: "read", state: { status: "completed", input: { file_path: "src/batch-writer.ts" }, time: { start: NOW - 3100, end: NOW - 2500 }, }, }, { type: "tool", id: "theme-search", tool: "grep", state: { status: "completed", input: { pattern: "await sleep\\(" }, time: { start: NOW - 2200, end: NOW - 1800 }, }, }, { type: "tool", id: "theme-build", tool: "bash", state: { status: "error", input: { command: "pnpm test" }, error: "1 failing test", time: { start: NOW - 1600, end: NOW - 400 }, }, }, ]; function Cell({ name, theme }: { name: string; theme?: string }) { return (
{name} {theme?.includes("light") ? "Light" : "Dark"}
Agent 4 tools · 3s
{themeToolParts.map((part, index) => ( ))}

Body copy on the canvas. Surfaces separate by fill; the border is a quiet edge.

); } export const AllThemes: Story = { render: () => (
{THEMES.map((t) => ( ))}
), };