|
"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> |
|
`, |
|
}; |
|
|