"use client" import * as React from "react" import { Repeat } from "lucide-react" import { cn } from "@/lib/utils" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { Icons } from "@/components/icons" import { registry } from "@/fancy/index" import { CodeSnippet } from "./code-snippet" import { OpenInV0Button } from "./open-in-v0" import { RestartButton } from "./restart-button" import { Button } from "./ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger, } from "./ui/dropdown-menu" interface ComponentPreviewProps extends React.HTMLAttributes { name: string extractClassname?: boolean extractedClassNames?: string align?: "center" | "start" | "end" framerLink?: string description?: string } export function ComponentPreview({ name, children, className, framerLink, extractClassname, extractedClassNames, align = "center", description, ...props }: ComponentPreviewProps) { const [sourceCode, setSourceCode] = React.useState("") const [previewKey, setPreviewKey] = React.useState(0) const [showRestartButton, setShowRestartButton] = React.useState(true) React.useEffect(() => { async function loadSourceCode() { try { const mod = await import(`../../public/r/${name}.json`) const json = mod.default // Find the main component file that matches the name const mainFile = json.files.find( (file: any) => file.path.split("/").pop().replace(".tsx", "") === name ) if (mainFile) { setSourceCode(mainFile.content) } else { console.error(`Could not find main file for ${name}`) setSourceCode("") } } catch (error) { console.error(`Failed to load source for ${name}:`, error) setSourceCode("") } } loadSourceCode() }, [name]) const handleRestart = React.useCallback(() => { setPreviewKey((prev) => prev + 1) }, []) React.useEffect(() => { const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "r" || event.key === "R") { handleRestart() } // Toggle restart button visibility with Cmd+D if ((event.metaKey || event.ctrlKey) && event.key === "1") { event.preventDefault() setShowRestartButton((prev) => !prev) } } window.addEventListener("keydown", handleKeyDown) return () => window.removeEventListener("keydown", handleKeyDown) }, [handleRestart]) const Preview = React.useMemo(() => { const Component = registry[name]?.component if (!Component) { return (

Component{" "} {name} {" "} not found.

) } return }, [name]) return (
Demo Code
{/*
*/} Loading...
} > {showRestartButton && (
{framerLink ? ( ) : ( )}
)} {Preview}
) }