'use client'; import { type HTMLAttributes, type ReactNode, forwardRef, useCallback, useRef, useState, } from 'react'; import { cn } from '@workspace/ui/lib/utils'; import { ScrollArea, ScrollBar, ScrollViewport, } from '@workspace/ui/components/ui/scroll-area'; import type { ScrollArea as ScrollAreaPrimitive } from 'radix-ui'; import { CopyButton } from '@/registry/buttons/copy'; export type CodeBlockProps = HTMLAttributes & { icon?: ReactNode; allowCopy?: boolean; viewportProps?: ScrollAreaPrimitive.ScrollAreaViewportProps; onCopy?: () => void; }; export const Pre = forwardRef>( ({ className, ...props }, ref) => { return (
        {props.children}
      
); }, ); Pre.displayName = 'Pre'; export const CodeBlock = forwardRef( ( { title, allowCopy = true, icon, viewportProps, onCopy: onCopyEvent, ...props }, ref, ) => { const [isCopied, setIsCopied] = useState(false); const areaRef = useRef(null); const onCopy = useCallback(() => { const pre = areaRef.current?.getElementsByTagName('pre').item(0); if (!pre) return; const clone = pre.cloneNode(true) as HTMLElement; clone.querySelectorAll('.nd-copy-ignore').forEach((node) => { node.remove(); }); void navigator.clipboard.writeText(clone.textContent ?? '').then(() => { setIsCopied(true); onCopyEvent?.(); setTimeout(() => setIsCopied(false), 3000); }); }, [onCopyEvent]); return (
{title ? (
{icon ? (
{typeof icon !== 'string' ? icon : null}
) : null}
{title}
{allowCopy ? ( ) : null}
) : ( allowCopy && ( ) )} {props.children}
); }, ); CodeBlock.displayName = 'CodeBlock';