feat: add boot and webui

This commit is contained in:
ReaJason
2024-12-08 16:59:18 +08:00
parent 146f67c653
commit f7fc98b388
46 changed files with 2340 additions and 1 deletions
+78
View File
@@ -0,0 +1,78 @@
import { Button, ButtonProps } from "@/components/ui/button.tsx";
import { cn } from "@/lib/utils.ts";
import { CheckIcon, ClipboardIcon } from "lucide-react";
import { useEffect, useState } from "react";
import { Prism as SyntaxHighlighter } from "react-syntax-highlighter";
import { materialDark } from "react-syntax-highlighter/dist/esm/styles/prism";
interface CopyButtonProps extends ButtonProps {
value: string;
src?: string;
}
export function copyToClipboardWithMeta(value: string) {
navigator.clipboard.writeText(value);
}
export function CopyButton({
value,
className,
src,
variant = "ghost",
...props
}: CopyButtonProps) {
const [hasCopied, setHasCopied] = useState(false);
useEffect(() => {
setTimeout(() => {
setHasCopied(false);
}, 2000);
}, []);
return (
<Button
size="icon"
variant={variant}
className={cn(
"relative z-10 h-6 w-6 text-zinc-50 hover:bg-zinc-700 hover:text-zinc-50 [&_svg]:h-3 [&_svg]:w-3",
className,
)}
onClick={() => {
copyToClipboardWithMeta(value);
setHasCopied(true);
}}
{...props}
>
<span className="sr-only">Copy</span>
{hasCopied ? <CheckIcon /> : <ClipboardIcon />}
</Button>
);
}
export function CodeViewer({
code,
language,
showLineNumbers = true,
}: {
code: string;
language: string;
showLineNumbers?: boolean;
}) {
return (
<div className="relative overflow-hidden text-xs">
<CopyButton value={code} className="absolute right-4 top-2" />
<SyntaxHighlighter
language={language}
style={materialDark}
showLineNumbers={showLineNumbers}
customStyle={{
margin: 0,
borderRadius: "var(--radius)",
height: 600,
}}
>
{code}
</SyntaxHighlighter>
</div>
);
}