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