| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- 'use client';
- import { Button } from '@/components/ui/button';
- import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip';
- import { cn } from '@/lib/utils';
- import { type LucideIcon, XIcon } from 'lucide-react';
- import type { ComponentProps, HTMLAttributes } from 'react';
- export type ArtifactProps = HTMLAttributes<HTMLDivElement>;
- export const Artifact = ({ className, ...props }: ArtifactProps) => (
- <div
- className={cn(
- 'flex flex-col overflow-hidden rounded-lg border bg-background shadow-sm',
- className,
- )}
- {...props}
- />
- );
- export type ArtifactHeaderProps = HTMLAttributes<HTMLDivElement>;
- export const ArtifactHeader = ({ className, ...props }: ArtifactHeaderProps) => (
- <div
- className={cn('flex items-center justify-between border-b bg-muted/50 px-4 py-3', className)}
- {...props}
- />
- );
- export type ArtifactCloseProps = ComponentProps<typeof Button>;
- export const ArtifactClose = ({
- className,
- children,
- size = 'sm',
- variant = 'ghost',
- ...props
- }: ArtifactCloseProps) => (
- <Button
- className={cn('size-8 p-0 text-muted-foreground hover:text-foreground', className)}
- size={size}
- type="button"
- variant={variant}
- {...props}
- >
- {children ?? <XIcon className="size-4" />}
- <span className="sr-only">Close</span>
- </Button>
- );
- export type ArtifactTitleProps = HTMLAttributes<HTMLParagraphElement>;
- export const ArtifactTitle = ({ className, ...props }: ArtifactTitleProps) => (
- <p className={cn('font-medium text-foreground text-sm', className)} {...props} />
- );
- export type ArtifactDescriptionProps = HTMLAttributes<HTMLParagraphElement>;
- export const ArtifactDescription = ({ className, ...props }: ArtifactDescriptionProps) => (
- <p className={cn('text-muted-foreground text-sm', className)} {...props} />
- );
- export type ArtifactActionsProps = HTMLAttributes<HTMLDivElement>;
- export const ArtifactActions = ({ className, ...props }: ArtifactActionsProps) => (
- <div className={cn('flex items-center gap-1', className)} {...props} />
- );
- export type ArtifactActionProps = ComponentProps<typeof Button> & {
- tooltip?: string;
- label?: string;
- icon?: LucideIcon;
- };
- export const ArtifactAction = ({
- tooltip,
- label,
- icon: Icon,
- children,
- className,
- size = 'sm',
- variant = 'ghost',
- ...props
- }: ArtifactActionProps) => {
- const button = (
- <Button
- className={cn('size-8 p-0 text-muted-foreground hover:text-foreground', className)}
- size={size}
- type="button"
- variant={variant}
- {...props}
- >
- {Icon ? <Icon className="size-4" /> : children}
- <span className="sr-only">{label || tooltip}</span>
- </Button>
- );
- if (tooltip) {
- return (
- <TooltipProvider>
- <Tooltip>
- <TooltipTrigger asChild>{button}</TooltipTrigger>
- <TooltipContent>
- <p>{tooltip}</p>
- </TooltipContent>
- </Tooltip>
- </TooltipProvider>
- );
- }
- return button;
- };
- export type ArtifactContentProps = HTMLAttributes<HTMLDivElement>;
- export const ArtifactContent = ({ className, ...props }: ArtifactContentProps) => (
- <div className={cn('flex-1 overflow-auto p-4', className)} {...props} />
- );
|