diff --git a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx index 454afb6af..c704b93e0 100644 --- a/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx +++ b/apps/dashboard/src/app/(main)/(protected)/projects/[projectId]/(overview)/setup-page.tsx @@ -2,7 +2,7 @@ import { CodeBlock } from '@/components/code-block'; import { DesignButton } from "@/components/design-components"; -import { APIEnvKeys, NextJsEnvKeys, ViteEnvKeys } from '@/components/env-keys'; +import { APIEnvKeys, NextJsEnvKeys, ViteEnvKeys, codePanelShellClasses } from '@/components/env-keys'; import { InlineCode } from '@/components/inline-code'; import { StyledLink } from '@/components/link'; import { Tabs, TabsContent, TabsList, TabsTrigger, Typography, cn } from "@/components/ui"; @@ -826,40 +826,42 @@ function HexclaveKeys(props: { onGenerateKeys: () => Promise, type: 'next' | 'vite' | 'raw', }) { - return ( -
- {props.keys ? ( - <> - {props.type === 'next' ? ( - - ) : props.type === 'vite' ? ( - - ) : ( - - )} - - - {`Save these keys securely - they won't be shown again after leaving this page.`} - - - ) : ( + if (!props.keys) { + return ( +
Generate Keys
+
+ ); + } + + return ( +
+ {props.type === 'next' ? ( + + ) : props.type === 'vite' ? ( + + ) : ( + )} + + + {`Save these keys securely - they won't be shown again after leaving this page.`} +
); } diff --git a/apps/dashboard/src/components/env-keys.tsx b/apps/dashboard/src/components/env-keys.tsx index 62d4dbffc..93fa7dace 100644 --- a/apps/dashboard/src/components/env-keys.tsx +++ b/apps/dashboard/src/components/env-keys.tsx @@ -1,20 +1,22 @@ "use client"; import { getPublicEnvVar } from '@/lib/env'; -import { Button, CopyField, Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui"; +import { Button, CopyButton, CopyField, Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui"; import React, { useState } from "react"; -import { EyeIcon, EyeSlashIcon, CopyIcon, CheckIcon, FileTextIcon } from "@phosphor-icons/react"; +import { EyeIcon, EyeSlashIcon, FileTextIcon } from "@phosphor-icons/react"; import { cn } from "@/lib/utils"; -import { runAsynchronously } from "@hexclave/shared/dist/utils/promises"; type EnvFileViewerProps = { filename: string; value: string; } +export const codePanelShellClasses = "overflow-hidden transition-all duration-150 hover:transition-none rounded-xl bg-white/90 dark:bg-background/60 dark:backdrop-blur-xl ring-1 ring-black/[0.06] hover:ring-black/[0.1] dark:ring-white/[0.06] dark:hover:ring-white/[0.1] shadow-none border border-black/[0.06] dark:border-white/[0.06]"; + +const codePanelHeaderClasses = "text-muted-foreground font-medium pl-4 pr-2 text-sm flex justify-between items-center bg-black/[0.015] dark:bg-white/[0.015] py-2.5 border-b border-black/[0.06] dark:border-white/[0.06]"; + export function EnvFileViewer({ filename, value }: EnvFileViewerProps) { const [revealAll, setRevealAll] = useState(false); - const [copied, setCopied] = useState(false); const lines = value.split("\n").map((line, idx) => { const eqIndex = line.indexOf("="); @@ -24,60 +26,29 @@ export function EnvFileViewer({ filename, value }: EnvFileViewerProps) { return { key, val, isComment: false }; }); - const handleCopyAll = () => { - runAsynchronously(async () => { - await navigator.clipboard.writeText(value); - setCopied(true); - setTimeout(() => setCopied(false), 2000); - }); - }; - return ( -
- {/* Tab/Header Bar */} -
+
+
+
+ + {filename} +
- - {filename} -
-
- - - + {revealAll ? : } + +
- {/* Editor Body */} -
+
{lines.map((line, idx) => {