Spaces:
Running
Running
"use client"; | |
import * as shadcnComponents from "@/utils/shadcn"; | |
import { Sandpack } from "@codesandbox/sandpack-react"; | |
import { | |
SandpackPreview, | |
SandpackProvider, | |
} from "@codesandbox/sandpack-react/unstyled"; | |
import { dracula as draculaTheme } from "@codesandbox/sandpack-themes"; | |
import dedent from "dedent"; | |
import "./code-viewer.css"; | |
export default function CodeViewer({ | |
code, | |
showEditor = false, | |
}: { | |
code: string; | |
showEditor?: boolean; | |
}) { | |
return showEditor ? ( | |
<Sandpack | |
options={{ | |
showNavigator: true, | |
editorHeight: "80vh", | |
showTabs: false, | |
...sharedOptions, | |
}} | |
files={{ | |
"App.tsx": code, | |
...sharedFiles, | |
}} | |
{...sharedProps} | |
/> | |
) : ( | |
<SandpackProvider | |
files={{ | |
"App.tsx": code, | |
...sharedFiles, | |
}} | |
className="flex h-full w-full grow flex-col justify-center" | |
options={{ ...sharedOptions }} | |
{...sharedProps} | |
> | |
<SandpackPreview | |
className="flex h-full w-full grow flex-col justify-center p-4 md:pt-16" | |
showOpenInCodeSandbox={false} | |
showRefreshButton={false} | |
/> | |
</SandpackProvider> | |
); | |
} | |
let sharedProps = { | |
template: "react-ts", | |
theme: draculaTheme, | |
customSetup: { | |
dependencies: { | |
"lucide-react": "latest", | |
recharts: "2.9.0", | |
"react-router-dom": "latest", | |
"@radix-ui/react-accordion": "^1.2.0", | |
"@radix-ui/react-alert-dialog": "^1.1.1", | |
"@radix-ui/react-aspect-ratio": "^1.1.0", | |
"@radix-ui/react-avatar": "^1.1.0", | |
"@radix-ui/react-checkbox": "^1.1.1", | |
"@radix-ui/react-collapsible": "^1.1.0", | |
"@radix-ui/react-dialog": "^1.1.1", | |
"@radix-ui/react-dropdown-menu": "^2.1.1", | |
"@radix-ui/react-hover-card": "^1.1.1", | |
"@radix-ui/react-label": "^2.1.0", | |
"@radix-ui/react-menubar": "^1.1.1", | |
"@radix-ui/react-navigation-menu": "^1.2.0", | |
"@radix-ui/react-popover": "^1.1.1", | |
"@radix-ui/react-progress": "^1.1.0", | |
"@radix-ui/react-radio-group": "^1.2.0", | |
"@radix-ui/react-select": "^2.1.1", | |
"@radix-ui/react-separator": "^1.1.0", | |
"@radix-ui/react-slider": "^1.2.0", | |
"@radix-ui/react-slot": "^1.1.0", | |
"@radix-ui/react-switch": "^1.1.0", | |
"@radix-ui/react-tabs": "^1.1.0", | |
"@radix-ui/react-toast": "^1.2.1", | |
"@radix-ui/react-toggle": "^1.1.0", | |
"@radix-ui/react-toggle-group": "^1.1.0", | |
"@radix-ui/react-tooltip": "^1.1.2", | |
"class-variance-authority": "^0.7.0", | |
clsx: "^2.1.1", | |
"date-fns": "^3.6.0", | |
"embla-carousel-react": "^8.1.8", | |
"react-day-picker": "^8.10.1", | |
"tailwind-merge": "^2.4.0", | |
"tailwindcss-animate": "^1.0.7", | |
vaul: "^0.9.1", | |
}, | |
}, | |
} as const; | |
let sharedOptions = { | |
externalResources: [ | |
"https://unpkg.com/@tailwindcss/ui/dist/tailwind-ui.min.css", | |
], | |
}; | |
let sharedFiles = { | |
"/lib/utils.ts": shadcnComponents.utils, | |
"/components/ui/accordion.tsx": shadcnComponents.accordian, | |
"/components/ui/alert-dialog.tsx": shadcnComponents.alertDialog, | |
"/components/ui/alert.tsx": shadcnComponents.alert, | |
"/components/ui/avatar.tsx": shadcnComponents.avatar, | |
"/components/ui/badge.tsx": shadcnComponents.badge, | |
"/components/ui/breadcrumb.tsx": shadcnComponents.breadcrumb, | |
"/components/ui/button.tsx": shadcnComponents.button, | |
"/components/ui/calendar.tsx": shadcnComponents.calendar, | |
"/components/ui/card.tsx": shadcnComponents.card, | |
"/components/ui/carousel.tsx": shadcnComponents.carousel, | |
"/components/ui/checkbox.tsx": shadcnComponents.checkbox, | |
"/components/ui/collapsible.tsx": shadcnComponents.collapsible, | |
"/components/ui/dialog.tsx": shadcnComponents.dialog, | |
"/components/ui/drawer.tsx": shadcnComponents.drawer, | |
"/components/ui/dropdown-menu.tsx": shadcnComponents.dropdownMenu, | |
"/components/ui/input.tsx": shadcnComponents.input, | |
"/components/ui/label.tsx": shadcnComponents.label, | |
"/components/ui/menubar.tsx": shadcnComponents.menuBar, | |
"/components/ui/navigation-menu.tsx": shadcnComponents.navigationMenu, | |
"/components/ui/pagination.tsx": shadcnComponents.pagination, | |
"/components/ui/popover.tsx": shadcnComponents.popover, | |
"/components/ui/progress.tsx": shadcnComponents.progress, | |
"/components/ui/radio-group.tsx": shadcnComponents.radioGroup, | |
"/components/ui/select.tsx": shadcnComponents.select, | |
"/components/ui/separator.tsx": shadcnComponents.separator, | |
"/components/ui/skeleton.tsx": shadcnComponents.skeleton, | |
"/components/ui/slider.tsx": shadcnComponents.slider, | |
"/components/ui/switch.tsx": shadcnComponents.switchComponent, | |
"/components/ui/table.tsx": shadcnComponents.table, | |
"/components/ui/tabs.tsx": shadcnComponents.tabs, | |
"/components/ui/textarea.tsx": shadcnComponents.textarea, | |
"/components/ui/toast.tsx": shadcnComponents.toast, | |
"/components/ui/toaster.tsx": shadcnComponents.toaster, | |
"/components/ui/toggle-group.tsx": shadcnComponents.toggleGroup, | |
"/components/ui/toggle.tsx": shadcnComponents.toggle, | |
"/components/ui/tooltip.tsx": shadcnComponents.tooltip, | |
"/components/ui/use-toast.tsx": shadcnComponents.useToast, | |
"/public/index.html": dedent` | |
<!DOCTYPE html> | |
<html lang="en"> | |
<head> | |
<meta charset="UTF-8"> | |
<meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
<title>Document</title> | |
<script src="https://cdn.tailwindcss.com"></script> | |
</head> | |
<body> | |
<div id="root"></div> | |
</body> | |
</html> | |
`, | |
}; | |