mirror of
https://github.com/shadcn-ui/ui.git
synced 2026-06-15 11:51:34 +00:00
57 lines
1.6 KiB
TypeScript
57 lines
1.6 KiB
TypeScript
"use client"
|
|
|
|
import * as React from "react"
|
|
|
|
import { cn } from "@/lib/utils"
|
|
import { Button } from "@/registry/new-york/ui/button"
|
|
import {
|
|
Collapsible,
|
|
CollapsibleContent,
|
|
CollapsibleTrigger,
|
|
} from "@/registry/new-york/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]:my-0 [&_pre]:max-h-[650px] [&_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-zinc-700/30 to-zinc-950/90 p-2",
|
|
isOpened ? "inset-x-0 bottom-0 h-12" : "inset-0"
|
|
)}
|
|
>
|
|
<CollapsibleTrigger asChild>
|
|
<Button variant="secondary" className="h-8 text-xs">
|
|
{isOpened ? "Collapse" : expandButtonTitle}
|
|
</Button>
|
|
</CollapsibleTrigger>
|
|
</div>
|
|
</div>
|
|
</Collapsible>
|
|
)
|
|
}
|