gemini-coder / components /code-viewer.tsx
osanseviero's picture
Upload 54 files
63c7991 verified
"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>
`,
};