{
	"$schema": "https://ui.shadcn.com/schema/registry-item.json",
	"name": "reasoning",
	"type": "registry:ui",
	"title": "Reasoning",
	"description": "A component for displaying AI reasoning content with collapsible sections and streaming support.",
	"dependencies": ["ai"],
	"registryDependencies": ["collapsible", "@simple-ai/markdown-content"],
	"files": [
		{
			"path": "./src/registry/ui/reasoning.tsx",
			"content": "\"use client\";\n\nimport { Brain } from \"lucide-react\";\n\nimport { useMemo, useState } from \"react\";\n\nimport {\n\tCollapsible,\n\tCollapsibleContent,\n\tCollapsibleTrigger,\n} from \"@/components/ui/collapsible\";\n\nimport { MarkdownContent } from \"@/registry/ui/markdown-content\";\n\n/**\n * Parses reasoning content to extract title and content.\n * Supports formats like:\n * - \"**Title**\\n\\nContent\"\n * - \"# Title\\n\\nContent\"\n * - \"Title\\n\\nContent\" (fallback for plain text with blank line)\n * - Plain text (returns as content with no title)\n */\nfunction parseReasoningContent(text: string): {\n\ttitle?: string;\n\tcontent: string;\n} {\n\tif (!text || text.trim() === \"\") {\n\t\treturn { title: undefined, content: \"\" };\n\t}\n\n\tconst trimmed = text.trim();\n\n\t// Define matchers for explicit title formats\n\tconst matchers = [\n\t\t{\n\t\t\t// Check for markdown bold title format (**Title**)\n\t\t\tpattern: /^\\*\\*(.+?)\\*\\*(?:\\n\\n|\\n|$)/,\n\t\t},\n\t\t{\n\t\t\t// Check for markdown heading format\n\t\t\tpattern: /^#+\\s+(.+?)(?:\\n\\n|\\n|$)/,\n\t\t},\n\t];\n\n\t// Try each matcher in order\n\tfor (const matcher of matchers) {\n\t\tconst match = trimmed.match(matcher.pattern);\n\t\tif (match) {\n\t\t\tconst title = match[1].trim();\n\t\t\tconst content = trimmed.slice(match[0].length).trim();\n\t\t\treturn { title, content: content || trimmed };\n\t\t}\n\t}\n\n\t// Fallback: Check for title/content split (first line as title if followed by blank line)\n\tconst lines = trimmed.split(\"\\n\");\n\tif (lines.length > 1 && lines[1].trim() === \"\") {\n\t\tconst title = lines[0].trim();\n\t\tconst content = lines.slice(2).join(\"\\n\").trim();\n\t\treturn { title, content: content || trimmed };\n\t}\n\n\t// No title found, return content only\n\treturn { content: trimmed };\n}\n\ninterface ReasoningProps {\n\tcontent: string;\n\tisLastPart: boolean;\n}\n\nexport function Reasoning({ content, isLastPart }: ReasoningProps) {\n\tconst [isOpen, setIsOpen] = useState(false);\n\n\tconst parsedContent = useMemo(\n\t\t() => parseReasoningContent(content),\n\t\t[content],\n\t);\n\tconst title = parsedContent.title;\n\tconst finalContent = parsedContent.content;\n\n\tif (isLastPart) {\n\t\treturn (\n\t\t\t<div className=\"flex flex-col items-start gap-4 my-2 ml-2 text-muted-foreground\">\n\t\t\t\t<div className=\"flex items-center gap-2 text-sm\">\n\t\t\t\t\t<Brain className=\"size-4\" />\n\t\t\t\t\t{title ?? \"Thinking...\"}\n\t\t\t\t</div>\n\n\t\t\t\t{finalContent.trim() !== \"\" && (\n\t\t\t\t\t<div className=\"text-sm\">\n\t\t\t\t\t\t<MarkdownContent content={finalContent} />\n\t\t\t\t\t</div>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tif (finalContent.trim() === \"\") {\n\t\treturn (\n\t\t\t<div className=\"my-3 ml-2\">\n\t\t\t\t<div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n\t\t\t\t\t<Brain className=\"size-4\" />\n\t\t\t\t\t<span className=\"flex-1 break-all\">\n\t\t\t\t\t\t{title ?? \"Finished thinking\"}\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<Collapsible open={isOpen} onOpenChange={setIsOpen}>\n\t\t\t<div className=\"my-3 ml-2\">\n\t\t\t\t<CollapsibleTrigger className=\"flex items-center gap-2 text-sm hover:text-foreground transition-colors cursor-pointer\">\n\t\t\t\t\t<Brain className=\"size-4\" />\n\t\t\t\t\t<span className=\"flex-1 break-all\">\n\t\t\t\t\t\t{title ?? \"Finished thinking\"}\n\t\t\t\t\t</span>\n\t\t\t\t\t<span className=\"text-xs opacity-70 ml-2 flex-shrink-0\">\n\t\t\t\t\t\t{isOpen ? \"collapse\" : \"expand\"}\n\t\t\t\t\t</span>\n\t\t\t\t</CollapsibleTrigger>\n\n\t\t\t\t<CollapsibleContent>\n\t\t\t\t\t<div className=\"text-sm text-muted-foreground mt-4\">\n\t\t\t\t\t\t<MarkdownContent content={finalContent} />\n\t\t\t\t\t</div>\n\t\t\t\t</CollapsibleContent>\n\t\t\t</div>\n\t\t</Collapsible>\n\t);\n}\n",
			"type": "registry:ui"
		}
	]
}
