{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "code-block",
  "dependencies": [
    "shiki"
  ],
  "registryDependencies": [
    "https://turnui.xyz/r/turn-button.json",
    "utils"
  ],
  "files": [
    {
      "path": "src/registry/ui/code-block.tsx",
      "content": "\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"@/lib/utils\";\nimport { Button } from \"./turn-button\";\n\nexport function CodeBlock({\n  code,\n  lang = \"text\",\n  className,\n}: {\n  code: string;\n  lang?: string;\n  className?: string;\n}) {\n  const [html, setHtml] = React.useState<string | null>(null);\n  const [copied, setCopied] = React.useState(false);\n\n  React.useEffect(() => {\n    let cancelled = false;\n    import(\"shiki\").then(({ codeToHtml }) =>\n      codeToHtml(code, {\n        lang,\n        themes: { light: \"github-light-high-contrast\", dark: \"github-dark-default\" },\n        defaultColor: false,\n      })\n        .catch(() => null)\n        .then((out) => !cancelled && setHtml(out)),\n    );\n    return () => {\n      cancelled = true;\n    };\n  }, [code, lang]);\n\n  async function copy() {\n    try {\n      await navigator.clipboard.writeText(code);\n    } catch {\n      return;\n    }\n    setCopied(true);\n    setTimeout(() => setCopied(false), 1500);\n  }\n\n  return (\n    <div\n      className={cn(\n        \"overflow-hidden rounded border bg-muted/40 text-[13px]\",\n        className,\n      )}\n    >\n      <div className=\"flex h-9 items-center justify-between border-b px-3\">\n        <span className=\"font-mono text-xs text-muted-foreground\">{lang}</span>\n        <Button variant=\"ghost\" size=\"sm\" onClick={copy} className=\"font-mono text-xs\">\n          {copied ? (\n            <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden><path d=\"m3 8.5 3.5 3.5L13 4.5\" /></svg>\n          ) : (\n            <svg viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinejoin=\"round\" aria-hidden><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8\" rx=\"1\" /><path d=\"M10.5 5.5v-2a1 1 0 0 0-1-1h-6a1 1 0 0 0-1 1v6a1 1 0 0 0 1 1h2\" /></svg>\n          )}\n          {copied ? \"Copied\" : \"Copy\"}\n        </Button>\n        <span role=\"status\" className=\"sr-only\">{copied ? \"Copied to clipboard\" : \"\"}</span>\n      </div>\n      {html ? (\n        <div\n          tabIndex={0}\n          className=\"overflow-x-auto p-3 font-mono outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring [&_.shiki]:!bg-transparent [&_.shiki_span]:text-[var(--shiki-light)] dark:[&_.shiki_span]:text-[var(--shiki-dark)]\"\n          dangerouslySetInnerHTML={{ __html: html }}\n        />\n      ) : (\n        <pre tabIndex={0} className=\"overflow-x-auto p-3 font-mono outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\">\n          <code>{code}</code>\n        </pre>\n      )}\n    </div>\n  );\n}\n",
      "type": "registry:ui"
    }
  ],
  "type": "registry:ui"
}