import * as React from "react" import { formatCode } from "@/lib/format-code" import { highlightCode } from "@/lib/highlight-code" import { readFileFromRoot } from "@/lib/read-file" import { getDemoItem, getRegistryItem } from "@/lib/registry" import { cn } from "@/lib/utils" import { CodeCollapsibleWrapper } from "@/components/code-collapsible-wrapper" import { CopyButton } from "@/components/copy-button" import { getIconForLanguageExtension } from "@/components/icons" export async function ComponentSource({ name, src, title, language, collapsible = true, className, styleName = "new-york-v4", maxLines, }: React.ComponentProps<"div"> & { name?: string src?: string title?: string language?: string collapsible?: boolean styleName?: string maxLines?: number }) { if (!name && !src) { return null } let code: string | undefined if (name) { const item = (await getDemoItem(name, styleName)) ?? (await getRegistryItem(name, styleName)) code = item?.files?.[0]?.content } if (src) { code = await readFileFromRoot(src) } if (!code) { return null } code = await formatCode(code, styleName) code = code.replaceAll("/* eslint-disable react/no-children-prop */\n", "") // Truncate code if maxLines is set. if (maxLines) { code = code.split("\n").slice(0, maxLines).join("\n") } const lang = language ?? title?.split(".").pop() ?? "tsx" const highlightedCode = await highlightCode(code, lang) if (!collapsible) { return (