Files
shadcn-ui/apps/www/components/code-block-wrapper.tsx
2023-01-24 19:51:29 +04:00

57 lines
1.5 KiB
TypeScript

"use client"
import * as React from "react"
import { cn } from "@/lib/utils"
import { Button } from "@/components/ui/button"
import {
Collapsible,
CollapsibleContent,
CollapsibleTrigger,
} from "@/components/ui/collapsible"
interface CodeBlockProps extends React.HTMLAttributes<HTMLDivElement> {
expandButtonTitle?: string
}
export function CodeBlockWrapper({
expandButtonTitle = "View Code",
className,
children,
...props
}: CodeBlockProps) {
const [isOpened, setIsOpened] = React.useState(false)
return (
<Collapsible open={isOpened} onOpenChange={setIsOpened}>
<div className={cn("relative overflow-hidden", className)} {...props}>
<CollapsibleContent
forceMount
className={cn("overflow-hidden", !isOpened && "max-h-32")}
>
<div
className={cn(
"[&_pre]:max-h-[650px [&_pre]:my-0 [&_pre]:pb-[100px]",
!isOpened ? "[&_pre]:overflow-hidden" : "[&_pre]:overflow-auto]"
)}
>
{children}
</div>
</CollapsibleContent>
<div
className={cn(
"absolute flex items-center justify-center bg-gradient-to-b from-slate-900/30 to-slate-900/90 p-2",
isOpened ? "inset-x-0 bottom-3 h-12" : "inset-0"
)}
>
<CollapsibleTrigger asChild>
<Button variant="subtle" className="h-8 text-xs">
{isOpened ? "Collapse" : expandButtonTitle}
</Button>
</CollapsibleTrigger>
</div>
</div>
</Collapsible>
)
}