{"$schema":"https://ui.shadcn.com/schema/registry.json","name":"scrim-ui","homepage":"https://scrimui.dev","items":[{"name":"all","type":"registry:block","title":"All free components","description":"Every free Scrim UI component — 55 in total, from prompt inputs and streaming messages to tool calls and citations.","categories":["collection"],"registryDependencies":["https://scrimui.dev/r/prompt-input.json","https://scrimui.dev/r/prompt-input-attachments.json","https://scrimui.dev/r/prompt-input-model-selector.json","https://scrimui.dev/r/prompt-editor.json","https://scrimui.dev/r/streaming-message.json","https://scrimui.dev/r/user-message.json","https://scrimui.dev/r/message-actions.json","https://scrimui.dev/r/error-message.json","https://scrimui.dev/r/markdown-message.json","https://scrimui.dev/r/streaming-markdown.json","https://scrimui.dev/r/response-versions.json","https://scrimui.dev/r/conversation-sidebar.json","https://scrimui.dev/r/artifact-preview.json","https://scrimui.dev/r/reasoning.json","https://scrimui.dev/r/thinking-indicator.json","https://scrimui.dev/r/reasoning-steps.json","https://scrimui.dev/r/tool-call.json","https://scrimui.dev/r/search-tool-call.json","https://scrimui.dev/r/code-execution.json","https://scrimui.dev/r/generative-ui.json","https://scrimui.dev/r/generated-media.json","https://scrimui.dev/r/source-card.json","https://scrimui.dev/r/source-list.json","https://scrimui.dev/r/citation-ui.json","https://scrimui.dev/r/citation-popover.json","https://scrimui.dev/r/agent-status.json","https://scrimui.dev/r/approval-request.json","https://scrimui.dev/r/approval-gate.json","https://scrimui.dev/r/agent-plan.json","https://scrimui.dev/r/agent-handoff.json","https://scrimui.dev/r/agent-run-timeline.json","https://scrimui.dev/r/response-rating.json","https://scrimui.dev/r/inline-correction.json","https://scrimui.dev/r/output-comparison.json","https://scrimui.dev/r/eval-results.json","https://scrimui.dev/r/edit-diff-view.json","https://scrimui.dev/r/file-upload.json","https://scrimui.dev/r/context-files.json","https://scrimui.dev/r/context-picker.json","https://scrimui.dev/r/context-usage.json","https://scrimui.dev/r/memory-list.json","https://scrimui.dev/r/memory-suggestion.json","https://scrimui.dev/r/memory-chip.json","https://scrimui.dev/r/model-selector.json","https://scrimui.dev/r/reasoning-level.json","https://scrimui.dev/r/tool-toggle.json","https://scrimui.dev/r/cost-meter.json","https://scrimui.dev/r/voice-input.json","https://scrimui.dev/r/voice-waveform.json","https://scrimui.dev/r/voice-conversation.json","https://scrimui.dev/r/refusal-message.json","https://scrimui.dev/r/moderation-flag.json","https://scrimui.dev/r/confidence-answer.json","https://scrimui.dev/r/voice-call-controls.json","https://scrimui.dev/r/memory-toast.json"],"files":[]},{"name":"prompt-input","type":"registry:ui","title":"Prompt Input","description":"The message input at the heart of an AI chat app — file attachments, model picker, tool toggles, voice, and a send button that turns into stop.","categories":["prompt-input"],"files":[{"path":"src/showcase/prompt-input/prompt-input.tsx","type":"registry:ui","target":"components/ui/prompt-input.tsx"}]},{"name":"prompt-input-attachments","type":"registry:ui","title":"Prompt Input + Attachments","description":"A chat input that accepts file uploads — attachment chips with upload progress, type icons, and one-click removal.","categories":["prompt-input"],"files":[{"path":"src/showcase/prompt-input-attachments/prompt-input-attachments.tsx","type":"registry:ui","target":"components/ui/prompt-input-attachments.tsx"}]},{"name":"prompt-input-model-selector","type":"registry:ui","title":"Prompt Input + Model Selector","description":"A chat input with the model picker built in — switch models inline, with badges for what each one can do.","categories":["prompt-input"],"files":[{"path":"src/showcase/prompt-input-model-selector/prompt-input-model-selector.tsx","type":"registry:ui","target":"components/ui/prompt-input-model-selector.tsx"}]},{"name":"prompt-editor","type":"registry:ui","title":"Prompt Editor","description":"A prompt template editor with {{variables}} highlighted as you type, a rendered preview, and a line diff against the previous version.","categories":["prompt-input"],"files":[{"path":"src/showcase/prompt-editor/prompt-editor.tsx","type":"registry:ui","target":"components/ui/prompt-editor.tsx"}]},{"name":"streaming-message","type":"registry:ui","title":"Streaming Message","description":"Render an AI reply token by token like ChatGPT's typing effect — blinking cursor, stop button, and no layout jump as the text grows.","categories":["messages"],"files":[{"path":"src/showcase/streaming-message/streaming-message.tsx","type":"registry:ui","target":"components/ui/streaming-message.tsx"}]},{"name":"user-message","type":"registry:ui","title":"User Message","description":"The user's chat bubble — right-aligned, with hover actions to copy, edit the prompt, or regenerate the answer.","categories":["messages"],"files":[{"path":"src/showcase/user-message/user-message.tsx","type":"registry:ui","target":"components/ui/user-message.tsx"}]},{"name":"message-actions","type":"registry:ui","title":"Message Actions","description":"The action row under an AI reply — copy, regenerate, share and thumbs up/down feedback, revealed on hover.","categories":["messages"],"files":[{"path":"src/showcase/message-actions/message-actions.tsx","type":"registry:ui","target":"components/ui/message-actions.tsx"}]},{"name":"error-message","type":"registry:ui","title":"Error & Retry","description":"What to show when a generation fails — a plain-English reason, a retry button, and a countdown for rate limits.","categories":["messages"],"files":[{"path":"src/showcase/error-message/error-message.tsx","type":"registry:ui","target":"components/ui/error-message.tsx"}]},{"name":"markdown-message","type":"registry:ui","title":"Markdown Message","description":"A rendered markdown reply — syntax-highlighted code blocks with copy buttons, plus tables, lists and safe links.","categories":["messages"],"files":[{"path":"src/showcase/markdown-message/markdown-message.tsx","type":"registry:ui","target":"components/ui/markdown-message.tsx"}]},{"name":"streaming-markdown","type":"registry:ui","title":"Streaming Markdown","description":"Markdown that renders correctly while it is still arriving — bold, code spans, links and tables settle without ever flashing raw syntax or reflowing.","categories":["messages"],"files":[{"path":"src/showcase/streaming-markdown/streaming-markdown.tsx","type":"registry:ui","target":"components/ui/streaming-markdown.tsx"}]},{"name":"response-versions","type":"registry:ui","title":"Response Versions","description":"The 1/3 pager after a regenerate — previous and next versions, branch markers, continue-from-here, and honest generating, failed and stopped states.","categories":["messages"],"files":[{"path":"src/showcase/response-versions/response-versions.tsx","type":"registry:ui","target":"components/ui/response-versions.tsx"}]},{"name":"conversation-sidebar","type":"registry:ui","title":"Conversation Sidebar","description":"The chat-history sidebar every AI app rebuilds — search, inline rename, pin, and delete with undo, grouped by date, with loading and empty states.","categories":["conversation"],"files":[{"path":"src/showcase/conversation-sidebar/conversation-sidebar.tsx","type":"registry:ui","target":"components/ui/conversation-sidebar.tsx"}]},{"name":"artifact-preview","type":"registry:ui","title":"Artifact Preview","description":"The side panel for generated output — preview/code toggle, copy, download, version switching, and streaming, error and stale states.","categories":["conversation"],"files":[{"path":"src/showcase/artifact-preview/artifact-preview.tsx","type":"registry:ui","target":"components/ui/artifact-preview.tsx"}]},{"name":"reasoning","type":"registry:ui","title":"Thinking / Reasoning","description":"A collapsible chain-of-thought panel — show the model's reasoning trace with elapsed time, folded away by default.","categories":["reasoning"],"files":[{"path":"src/showcase/reasoning/reasoning.tsx","type":"registry:ui","target":"components/ui/reasoning.tsx"}]},{"name":"thinking-indicator","type":"registry:ui","title":"Thinking Indicator","description":"The loading state before the first token — bouncing dots, a blinking caret, or a labeled status line while the model thinks.","categories":["reasoning"],"files":[{"path":"src/showcase/thinking-indicator/thinking-indicator.tsx","type":"registry:ui","target":"components/ui/thinking-indicator.tsx"}]},{"name":"reasoning-steps","type":"registry:ui","title":"Reasoning Steps","description":"A multi-step reasoning trace — each step with its own status and timer, so a long think reads as progress, not a hang.","categories":["reasoning"],"files":[{"path":"src/showcase/reasoning-steps/reasoning-steps.tsx","type":"registry:ui","target":"components/ui/reasoning-steps.tsx"}]},{"name":"tool-call","type":"registry:ui","title":"Tool Call","description":"How to show a function call in chat — the arguments sent, the result returned, run status, and an expand toggle.","categories":["tool-calls"],"files":[{"path":"src/showcase/tool-call/tool-call.tsx","type":"registry:ui","target":"components/ui/tool-call.tsx"}]},{"name":"search-tool-call","type":"registry:ui","title":"Search Tool Call","description":"A web search the model ran — the query it chose, how many results came back, and previews of the sources it read.","categories":["tool-calls"],"files":[{"path":"src/showcase/search-tool-call/search-tool-call.tsx","type":"registry:ui","target":"components/ui/search-tool-call.tsx"}]},{"name":"code-execution","type":"registry:ui","title":"Code Execution","description":"A code interpreter run inside chat — the snippet, a running state, stdout as it streams, and errors that stay readable.","categories":["tool-calls"],"files":[{"path":"src/showcase/code-execution/code-execution.tsx","type":"registry:ui","target":"components/ui/code-execution.tsx"}]},{"name":"generative-ui","type":"registry:ui","title":"Generative UI","description":"Render a React component from a tool result instead of text — a skeleton in the widget's own shape, and a text fallback when the client has no renderer.","categories":["tool-calls"],"files":[{"path":"src/showcase/generative-ui/generative-ui.tsx","type":"registry:ui","target":"components/ui/generative-ui.tsx"}]},{"name":"generated-media","type":"registry:ui","title":"Generated Media Result","description":"The result card for AI-generated images, audio and video — queue and stage states, variants, download and regenerate, and a safety block that isn't an error.","categories":["tool-calls"],"files":[{"path":"src/showcase/generated-media/generated-media.tsx","type":"registry:ui","target":"components/ui/generated-media.tsx"}]},{"name":"source-card","type":"registry:ui","title":"Source Card","description":"A cited source as a card — favicon, page title, domain, and the snippet the answer actually drew from.","categories":["sources"],"files":[{"path":"src/showcase/source-card/source-card.tsx","type":"registry:ui","target":"components/ui/source-card.tsx"}]},{"name":"source-list","type":"registry:ui","title":"Source List","description":"The passages retrieval actually returned, with similarity scores and a visible relevance floor — including the case where nothing cleared it.","categories":["sources"],"files":[{"path":"src/showcase/source-list/source-list.tsx","type":"registry:ui","target":"components/ui/source-list.tsx"}]},{"name":"citation-ui","type":"registry:ui","title":"Citation UI","description":"Inline citation markers in generated text — numbered footnotes that reveal the source in a hover preview card.","categories":["sources"],"files":[{"path":"src/showcase/citation-ui/citation-ui.tsx","type":"registry:ui","target":"components/ui/citation-ui.tsx"}]},{"name":"citation-popover","type":"registry:ui","title":"Citation Popover","description":"A citation marker that shows the passage it came from — fixed positioning that survives a scrolling answer, touch and keyboard, and an honest state for a number the model invented.","categories":["sources"],"files":[{"path":"src/showcase/citation-popover/citation-popover.tsx","type":"registry:ui","target":"components/ui/citation-popover.tsx"}]},{"name":"agent-status","type":"registry:ui","title":"Agent Status","description":"Status for an AI agent working on its own — running, waiting on you, completed or failed, with what it did last.","categories":["agents"],"files":[{"path":"src/showcase/agent-status/agent-status.tsx","type":"registry:ui","target":"components/ui/agent-status.tsx"}]},{"name":"approval-request","type":"registry:ui","title":"Approval Request","description":"The human-in-the-loop confirmation — what the agent wants to do, the exact details, and allow or deny before it acts.","categories":["agents"],"files":[{"path":"src/showcase/approval-request/approval-request.tsx","type":"registry:ui","target":"components/ui/approval-request.tsx"}]},{"name":"approval-gate","type":"registry:ui","title":"Approval Gate","description":"The approval card as a lifecycle: a decision that survives a closed tab, is idempotent across two open ones, and says what happened when it lands after the request expired.","categories":["agents"],"files":[{"path":"src/showcase/approval-gate/approval-gate.tsx","type":"registry:ui","target":"components/ui/approval-gate.tsx"}]},{"name":"agent-plan","type":"registry:ui","title":"Agent Plan","description":"The checklist an agent writes for itself and then edits mid-run — steps added, skipped and re-ordered, without the list jumping under the reader.","categories":["agents"],"files":[{"path":"src/showcase/agent-plan/agent-plan.tsx","type":"registry:ui","target":"components/ui/agent-plan.tsx"}]},{"name":"agent-handoff","type":"registry:ui","title":"Agent Handoff","description":"One agent passing work to another — who asked, what was carried across, and what the receiving agent was not told.","categories":["agents"],"files":[{"path":"src/showcase/agent-handoff/agent-handoff.tsx","type":"registry:ui","target":"components/ui/agent-handoff.tsx"}]},{"name":"agent-run-timeline","type":"registry:ui","title":"Agent Run Timeline","description":"The activity log for a long agent run — collapsible success clusters, retry-linked events, approval gates in place, and a follow that respects the reader.","categories":["agents"],"files":[{"path":"src/showcase/agent-run-timeline/agent-run-timeline.tsx","type":"registry:ui","target":"components/ui/agent-run-timeline.tsx"}]},{"name":"response-rating","type":"registry:ui","title":"Response Rating","description":"Thumbs up and down that ask the one follow-up question worth asking — with a state for feedback that has been sent and cannot be taken back.","categories":["feedback"],"files":[{"path":"src/showcase/response-rating/response-rating.tsx","type":"registry:ui","target":"components/ui/response-rating.tsx"}]},{"name":"inline-correction","type":"registry:ui","title":"Inline Correction","description":"Fix the answer where it is wrong, in place — the edit becomes training data, so the component keeps the original alongside it rather than overwriting it.","categories":["feedback"],"files":[{"path":"src/showcase/inline-correction/inline-correction.tsx","type":"registry:ui","target":"components/ui/inline-correction.tsx"}]},{"name":"output-comparison","type":"registry:ui","title":"Output Comparison","description":"Two answers, side by side, with the model names hidden until a winner is picked — because a visible label is the thing being measured.","categories":["feedback"],"files":[{"path":"src/showcase/output-comparison/output-comparison.tsx","type":"registry:ui","target":"components/ui/output-comparison.tsx"}]},{"name":"eval-results","type":"registry:ui","title":"Eval Results","description":"Pass rates per test case across two runs, with the regressions surfaced first and a sample size honest enough to say when a delta means nothing.","categories":["feedback"],"files":[{"path":"src/showcase/eval-results/eval-results.tsx","type":"registry:ui","target":"components/ui/eval-results.tsx"}]},{"name":"edit-diff-view","type":"registry:ui","title":"Edit Diff View","description":"A streamed AI edit as hunks you accept or reject one by one — id-keyed decisions, word-level marks, and buttons that stay disabled while a hunk is still arriving.","categories":["feedback"],"files":[{"path":"src/showcase/edit-diff-view/edit-diff-view.tsx","type":"registry:ui","target":"components/ui/edit-diff-view.tsx"}]},{"name":"file-upload","type":"registry:ui","title":"File Upload","description":"A drag-and-drop upload zone — per-file progress bars, type icons, and error states for files too big or of the wrong type.","categories":["files"],"files":[{"path":"src/showcase/file-upload/file-upload.tsx","type":"registry:ui","target":"components/ui/file-upload.tsx"}]},{"name":"context-files","type":"registry:ui","title":"Context Files","description":"The files currently in the model's context — sizes, how many tokens each one costs, and removal without leaving the chat.","categories":["files"],"files":[{"path":"src/showcase/context-files/context-files.tsx","type":"registry:ui","target":"components/ui/context-files.tsx"}]},{"name":"context-picker","type":"registry:ui","title":"Context Picker","description":"The @-mention menu for adding context to a prompt — files, web pages and knowledge bases with search, recent items, access states and token cost.","categories":["files"],"files":[{"path":"src/showcase/context-picker/context-picker.tsx","type":"registry:ui","target":"components/ui/context-picker.tsx"}]},{"name":"context-usage","type":"registry:ui","title":"Context Usage","description":"How much of the context window is gone and to what — system prompt, files, history — plus what gets dropped first when the next message does not fit.","categories":["files"],"files":[{"path":"src/showcase/context-usage/context-usage.tsx","type":"registry:ui","target":"components/ui/context-usage.tsx"}]},{"name":"memory-list","type":"registry:ui","title":"Memory List","description":"The memory panel — every fact the assistant has saved about the user, with the ability to add one or make it forget.","categories":["memory"],"files":[{"path":"src/showcase/memory-list/memory-list.tsx","type":"registry:ui","target":"components/ui/memory-list.tsx"}]},{"name":"memory-suggestion","type":"registry:ui","title":"Memory Suggestion","description":"The prompt an assistant shows before saving something about you — the fact it noticed, and your choice to keep or dismiss it.","categories":["memory"],"files":[{"path":"src/showcase/memory-suggestion/memory-suggestion.tsx","type":"registry:ui","target":"components/ui/memory-suggestion.tsx"}]},{"name":"memory-chip","type":"registry:ui","title":"Memory Chip","description":"A small inline chip confirming a fact was saved to memory — quiet enough to ignore, clear enough to undo.","categories":["memory"],"files":[{"path":"src/showcase/memory-chip/memory-chip.tsx","type":"registry:ui","target":"components/ui/memory-chip.tsx"}]},{"name":"model-selector","type":"registry:ui","title":"Model Selector","description":"A standalone model picker — compare models in a dropdown with badges for speed, context length and what each supports.","categories":["model-settings"],"files":[{"path":"src/showcase/model-selector/model-selector.tsx","type":"registry:ui","target":"components/ui/model-selector.tsx"}]},{"name":"reasoning-level","type":"registry:ui","title":"Reasoning Level","description":"A control for how hard the model should think — light, balanced or deep, with the tradeoff between speed and depth shown.","categories":["model-settings"],"files":[{"path":"src/showcase/reasoning-level/reasoning-level.tsx","type":"registry:ui","target":"components/ui/reasoning-level.tsx"}]},{"name":"tool-toggle","type":"registry:ui","title":"Tool Toggle","description":"Switches for the tools a model may use — web search, code execution, file access — with unmistakable on and off states.","categories":["model-settings"],"files":[{"path":"src/showcase/tool-toggle/tool-toggle.tsx","type":"registry:ui","target":"components/ui/tool-toggle.tsx"}]},{"name":"cost-meter","type":"registry:ui","title":"Cost Meter","description":"Live spend per message and per conversation — cached input priced apart from fresh, reasoning tokens shown without double-counting, and a visible ~ when a provider did not report enough to be sure.","categories":["model-settings"],"files":[{"path":"src/showcase/cost-meter/cost-meter.tsx","type":"registry:ui","target":"components/ui/cost-meter.tsx"}]},{"name":"voice-input","type":"registry:ui","title":"Voice Input","description":"A microphone button that expands into a recording panel — live waveform, a running transcript, and cancel or send.","categories":["voice"],"files":[{"path":"src/showcase/voice-input/voice-input.tsx","type":"registry:ui","target":"components/ui/voice-input.tsx"}]},{"name":"voice-waveform","type":"registry:ui","title":"Voice Waveform","description":"An animated audio waveform — distinct bar motion for listening, recording, and the assistant speaking back.","categories":["voice"],"files":[{"path":"src/showcase/voice-waveform/voice-waveform.tsx","type":"registry:ui","target":"components/ui/voice-waveform.tsx"}]},{"name":"voice-conversation","type":"registry:ui","title":"Voice Conversation","description":"A voice conversation as it happens — who is speaking, the live transcript, and replay for any individual turn.","categories":["voice"],"files":[{"path":"src/showcase/voice-conversation/voice-conversation.tsx","type":"registry:ui","target":"components/ui/voice-conversation.tsx"}]},{"name":"refusal-message","type":"registry:ui","title":"Refusal Message","description":"How to say no without ending the conversation — the refusal, a plain-language reason, and one redirect the reader can click.","categories":["safety"],"files":[{"path":"src/showcase/refusal-message/refusal-message.tsx","type":"registry:ui","target":"components/ui/refusal-message.tsx"}]},{"name":"moderation-flag","type":"registry:ui","title":"Moderation Flag","description":"What to show when the content filter fires — a stopped stream that keeps its partial text, or a blocked prompt, with a false-positive path.","categories":["safety"],"files":[{"path":"src/showcase/moderation-flag/moderation-flag.tsx","type":"registry:ui","target":"components/ui/moderation-flag.tsx"}]},{"name":"confidence-answer","type":"registry:ui","title":"Confidence Answer","description":"An answer that says how sure it is — a warning badge only when there is something to warn about, and a hedge that names what to verify.","categories":["safety"],"files":[{"path":"src/showcase/confidence-answer/confidence-answer.tsx","type":"registry:ui","target":"components/ui/confidence-answer.tsx"}]},{"name":"voice-call-controls","type":"registry:ui","title":"Voice Call Controls","description":"The chrome around a live voice call — an unmistakable mute toggle, a running call timer, and an end button that's always one tap away.","categories":["voice"],"files":[{"path":"src/showcase/voice-call-controls/voice-call-controls.tsx","type":"registry:ui","target":"components/ui/voice-call-controls.tsx"}]},{"name":"memory-toast","type":"registry:ui","title":"Memory Toast","description":"The 'Memory updated' receipt — shows the exact fact that was saved, with one-tap Undo and a quiet link to manage memories.","categories":["memory"],"files":[{"path":"src/showcase/memory-toast/memory-toast.tsx","type":"registry:ui","target":"components/ui/memory-toast.tsx"}]},{"name":"ai-chat","type":"registry:block","title":"AI Chat","description":"The canonical chat interface — sidebar, streaming messages, prompt input with model selector, and sources.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/ai-chat/ai-chat.tsx","type":"registry:block","target":"components/blocks/ai-chat.tsx"}]},{"name":"research-assistant","type":"registry:block","title":"AI Research Assistant","description":"A research flow that shows search tool calls, reasoning, sources and a cited final answer.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/research-assistant/research-assistant.tsx","type":"registry:block","target":"components/blocks/research-assistant.tsx"}]},{"name":"coding-agent","type":"registry:block","title":"AI Coding Agent","description":"A coding run with agent status, tool calls, diffs and a human-in-the-loop approval gate.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/coding-agent/coding-agent.tsx","type":"registry:block","target":"components/blocks/coding-agent.tsx"}]},{"name":"voice-assistant","type":"registry:block","title":"AI Voice Assistant","description":"A voice-first conversation — live waveform states, a recording input, a spoken transcript and a typed fallback.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/voice-assistant/voice-assistant.tsx","type":"registry:block","target":"components/blocks/voice-assistant.tsx"}]},{"name":"model-preferences","type":"registry:block","title":"Model & Memory Preferences","description":"A preferences screen that picks the model, reasoning level and tools, and manages persistent memory.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/model-preferences/model-preferences.tsx","type":"registry:block","target":"components/blocks/model-preferences.tsx"}]},{"name":"artifact-workspace","type":"registry:block","title":"Artifact Workspace","description":"Chat on the left, generated output on the right — artifacts open from the answer, stream, version, and fail without breaking the conversation.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/artifact-workspace/artifact-workspace.tsx","type":"registry:block","target":"components/blocks/artifact-workspace.tsx"}]},{"name":"rag-workspace","type":"registry:block","title":"Document Q&A Workspace","description":"Ask your own documents — upload and parse, cited answers with inspectable passages, an honest not-found state, and a visible context budget.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/rag-workspace/rag-workspace.tsx","type":"registry:block","target":"components/blocks/rag-workspace.tsx"}]},{"name":"extraction-review","type":"registry:block","title":"Structured Extraction & Review","description":"Upload a document, watch fields fill in, then review the flagged ones — per-field confidence, corrections that keep the original, export earned.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/extraction-review/extraction-review.tsx","type":"registry:block","target":"components/blocks/extraction-review.tsx"}]},{"name":"image-studio","type":"registry:block","title":"Image Generation Studio","description":"A one-screen generation studio — prompt composer and model picker beside a feed of queued, staged, blocked and ready image results with variants.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/image-studio/image-studio.tsx","type":"registry:block","target":"components/blocks/image-studio.tsx"}]},{"name":"agent-console","type":"registry:block","title":"Multi-agent Ops Console","description":"Watch a fleet of agents at once — parallel statuses, an inspectable handoff, a waiting approval, a failed child run, and per-run plus fleet cost.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/agent-console/agent-console.tsx","type":"registry:block","target":"components/blocks/agent-console.tsx"}]},{"name":"support-copilot","type":"registry:block","title":"Customer Support Copilot","description":"Grounded reply drafts with citations, honest low-confidence answers, inline corrections, an approval gate on refunds, and a rating row on every draft.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/support-copilot/support-copilot.tsx","type":"registry:block","target":"components/blocks/support-copilot.tsx"}]},{"name":"generative-dashboard","type":"registry:block","title":"Generative UI Dashboard","description":"The model assembles a dashboard from a controlled widget registry — streamed props, an unsupported-request fallback, and widget clicks that re-enter the chat.","categories":["pattern"],"files":[{"path":"src/showcase/patterns/generative-dashboard/generative-dashboard.tsx","type":"registry:block","target":"components/blocks/generative-dashboard.tsx"}]}]}