{
	"$schema": "https://shadcn-svelte.com/schema/registry-item.json",
	"name": "markdown",
	"title": "Markdown",
	"type": "registry:ui",
	"description": "Render user-generated content, blog posts, or comments with optimized typography and safety.",
	"files": [
		{
			"content": "<script lang=\"ts\">\r\n\timport { cn } from '$UTILS$';\r\n\r\n\tlet {\r\n\t\tcontent = '',\r\n\t\tclass: className\r\n\t}: {\r\n\t\tcontent: string;\r\n\t\tclass?: string;\r\n\t} = $props();\r\n\r\n\tfunction parseMarkdown(md: string) {\r\n\t\tlet html = md.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;');\r\n\r\n\t\thtml = html.replace(/^---$/gm, '<hr class=\"my-4 border-t border-border\" />');\r\n\r\n\t\thtml = html.replace(/^### (.*$)/gm, '<h3 class=\"text-lg font-bold mt-4 mb-1\">$1</h3>');\r\n\t\thtml = html.replace(/^## (.*$)/gm, '<h2 class=\"text-xl font-bold mt-5 mb-2\">$1</h2>');\r\n\t\thtml = html.replace(/^# (.*$)/gm, '<h1 class=\"text-2xl font-black mt-6 mb-3\">$1</h1>');\r\n\r\n\t\thtml = html.replace(\r\n\t\t\t/^(?:>|&gt;) (.*$)/gm,\r\n\t\t\t'<blockquote class=\"border-l-4 border-primary/30 pl-4 py-1 italic text-muted-foreground my-3\">$1</blockquote>'\r\n\t\t);\r\n\r\n\t\thtml = html.replace(/\\*\\*\\*(.*?)\\*\\*\\*/g, '<strong><em>$1</em></strong>');\r\n\t\thtml = html.replace(/\\*\\*(.*?)\\*\\*/g, '<strong>$1</strong>');\r\n\t\thtml = html.replace(/\\*(.*?)\\*/g, '<em>$1</em>');\r\n\t\thtml = html.replace(/__(.*?)__/g, '<strong>$1</strong>');\r\n\t\thtml = html.replace(/_(.*?)_/g, '<em>$1</em>');\r\n\r\n\t\thtml = html.replace(\r\n\t\t\t/\\[([^\\]]+)\\]\\(([^)]+)\\)/g,\r\n\t\t\t'<a href=\"$2\" class=\"text-primary font-medium underline underline-offset-4 hover:opacity-80 transition-opacity\" target=\"_blank\" rel=\"noopener noreferrer\">$1</a>'\r\n\t\t);\r\n\r\n\t\thtml = html.replace(\r\n\t\t\t/`(.*?)`/g,\r\n\t\t\t'<code class=\"bg-muted px-1.5 py-0.5 rounded text-[0.85em] font-mono border border-border/50\">$1</code>'\r\n\t\t);\r\n\r\n\t\thtml = html.replace(/^[\\*\\+-] (.*$)/gm, '<li class=\"ml-4 list-disc pl-1\">$1</li>');\r\n\t\thtml = html.replace(/^\\d+\\. (.*$)/gm, '<li class=\"ml-4 list-decimal pl-1\">$1</li>');\r\n\r\n\t\tconst lines = html.split('\\n');\r\n\t\tlet processed = [];\r\n\t\tlet inList = false;\r\n\r\n\t\tfor (let line of lines) {\r\n\t\t\tconst l = line.trim();\r\n\t\t\tconst isLi = l.startsWith('<li');\r\n\r\n\t\t\tif (isLi && !inList) {\r\n\t\t\t\tprocessed.push('<ul class=\"my-3 space-y-1\">');\r\n\t\t\t\tinList = true;\r\n\t\t\t} else if (!isLi && inList) {\r\n\t\t\t\tprocessed.push('</ul>');\r\n\t\t\t\tinList = false;\r\n\t\t\t}\r\n\r\n\t\t\tif (\r\n\t\t\t\tl &&\r\n\t\t\t\t!l.startsWith('<h') &&\r\n\t\t\t\t!l.startsWith('<li') &&\r\n\t\t\t\t!l.startsWith('<hr') &&\r\n\t\t\t\t!l.startsWith('<blockquote') &&\r\n\t\t\t\t!l.startsWith('<ul') &&\r\n\t\t\t\t!l.startsWith('</ul')\r\n\t\t\t) {\r\n\t\t\t\tprocessed.push(`<p class=\"mb-3 last:mb-0\">${line}</p>`);\r\n\t\t\t} else {\r\n\t\t\t\tprocessed.push(line);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (inList) processed.push('</ul>');\r\n\r\n\t\treturn processed.join('\\n').trim();\r\n\t}\r\n\r\n\tconst rendered = $derived(parseMarkdown(content));\r\n</script>\r\n\r\n<div class={cn('text-base leading-relaxed', className)}>\r\n\t{@html rendered}\r\n</div>\r\n",
			"type": "registry:ui",
			"target": "markdown/markdown.svelte"
		},
		{
			"content": "import Markdown from './markdown.svelte';\r\n\r\nexport { Markdown, Markdown as default };\r\n",
			"type": "registry:ui",
			"target": "markdown/index.ts"
		}
	]
}