CollapsibleCodeBlock.tsx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { Code, X } from 'lucide-react'
  2. import { Button, cn, HoverCard, HoverCardContent, HoverCardTrigger } from 'ui'
  3. import { CodeBlock, type CodeBlockProps } from 'ui-patterns/CodeBlock'
  4. interface CollapsibleCodeBlockProps extends CodeBlockProps {
  5. onRemove?: () => void
  6. }
  7. export const CollapsibleCodeBlock = ({ onRemove, ...props }: CollapsibleCodeBlockProps) => {
  8. const codeString = (props.value || props.children) as string
  9. const firstLine = codeString?.substring(0, codeString.indexOf('\n')) || codeString
  10. return (
  11. <div className="relative">
  12. <div
  13. className={cn(
  14. 'flex items-center gap-1 px-2 py-1.5 bg-surface-100 border border-default w-full overflow-hidden',
  15. 'rounded-md',
  16. props.className
  17. )}
  18. >
  19. <HoverCard>
  20. <HoverCardTrigger asChild>
  21. <div className="flex flex-1 items-center gap-2 text-foreground-light px-2 hover:text-foreground cursor-pointer overflow-hidden">
  22. <Code size={14} strokeWidth={1.5} />
  23. <span className="text-xs font-mono flex-1 truncate pointer">{firstLine}...</span>
  24. </div>
  25. </HoverCardTrigger>
  26. <HoverCardContent className="w-96 max-h-96 overflow-auto p-0">
  27. <CodeBlock
  28. {...props}
  29. value={codeString}
  30. className={cn('text-xs font-mono border-none p-3')}
  31. />
  32. </HoverCardContent>
  33. </HoverCard>
  34. {onRemove && (
  35. <Button
  36. type="text"
  37. size="tiny"
  38. className="shrink-0 w-6 h-6"
  39. onClick={onRemove}
  40. icon={<X size={14} />}
  41. />
  42. )}
  43. </div>
  44. </div>
  45. )
  46. }