Spaces:
Running on Zero
Running on Zero
| import * as React from 'react'; | |
| import * as DialogPrimitive from '@radix-ui/react-dialog'; | |
| import { cva, type VariantProps } from 'class-variance-authority'; | |
| import { X } from 'lucide-react'; | |
| import { cn } from '../../lib/utils'; | |
| const Sheet = DialogPrimitive.Root; | |
| const SheetTrigger = DialogPrimitive.Trigger; | |
| const SheetClose = DialogPrimitive.Close; | |
| const SheetPortal = DialogPrimitive.Portal; | |
| const SheetOverlay = React.forwardRef< | |
| React.ElementRef<typeof DialogPrimitive.Overlay>, | |
| React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay> | |
| >(({ className, ...props }, ref) => ( | |
| <DialogPrimitive.Overlay | |
| className={cn('fixed inset-0 z-50 bg-ink/14 backdrop-blur-[1.5px]', className)} | |
| {...props} | |
| ref={ref} | |
| /> | |
| )); | |
| SheetOverlay.displayName = DialogPrimitive.Overlay.displayName; | |
| const sheetVariants = cva( | |
| 'fixed z-50 gap-4 bg-paper/98 shadow-[0_22px_46px_-28px_color-mix(in_oklab,var(--color-ink)_18%,transparent)] transition ease-out', | |
| { | |
| variants: { | |
| side: { | |
| top: 'inset-x-4 top-4 rounded-[2rem] border border-line p-6', | |
| bottom: 'inset-x-3 bottom-3 rounded-[2rem] border border-line p-5 pb-7', | |
| left: 'inset-y-3 left-3 h-auto w-3/4 rounded-[1.9rem] border border-line p-5 sm:max-w-sm', | |
| right: 'inset-y-3 right-3 h-auto w-3/4 rounded-[1.9rem] border border-line p-5 sm:max-w-sm', | |
| }, | |
| }, | |
| defaultVariants: { | |
| side: 'right', | |
| }, | |
| }, | |
| ); | |
| interface SheetContentProps | |
| extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>, | |
| VariantProps<typeof sheetVariants> {} | |
| const SheetContent = React.forwardRef< | |
| React.ElementRef<typeof DialogPrimitive.Content>, | |
| SheetContentProps | |
| >(({ side = 'right', className, children, ...props }, ref) => ( | |
| <SheetPortal> | |
| <SheetOverlay /> | |
| <DialogPrimitive.Content ref={ref} className={cn(sheetVariants({ side }), className)} {...props}> | |
| {children} | |
| <DialogPrimitive.Close className="absolute right-5 top-5 rounded-full p-2 text-muted transition hover:bg-sand hover:text-ink focus:outline-none focus:ring-2 focus:ring-clay/20"> | |
| <X className="h-4 w-4" /> | |
| <span className="sr-only">Close</span> | |
| </DialogPrimitive.Close> | |
| </DialogPrimitive.Content> | |
| </SheetPortal> | |
| )); | |
| SheetContent.displayName = DialogPrimitive.Content.displayName; | |
| const SheetHeader = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => ( | |
| <div className={cn('flex flex-col gap-1.5 pr-10 text-left', className)} {...props} /> | |
| ); | |
| const SheetFooter = ({ className, ...props }: React.HTMLAttributes<HTMLDivElement>) => ( | |
| <div className={cn('mt-4 flex flex-col-reverse gap-2 sm:flex-row sm:justify-end', className)} {...props} /> | |
| ); | |
| const SheetTitle = React.forwardRef< | |
| React.ElementRef<typeof DialogPrimitive.Title>, | |
| React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title> | |
| >(({ className, ...props }, ref) => ( | |
| <DialogPrimitive.Title ref={ref} className={cn('text-lg font-semibold text-ink', className)} {...props} /> | |
| )); | |
| SheetTitle.displayName = DialogPrimitive.Title.displayName; | |
| const SheetDescription = React.forwardRef< | |
| React.ElementRef<typeof DialogPrimitive.Description>, | |
| React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description> | |
| >(({ className, ...props }, ref) => ( | |
| <DialogPrimitive.Description ref={ref} className={cn('text-sm text-muted', className)} {...props} /> | |
| )); | |
| SheetDescription.displayName = DialogPrimitive.Description.displayName; | |
| export { | |
| Sheet, | |
| SheetClose, | |
| SheetContent, | |
| SheetDescription, | |
| SheetFooter, | |
| SheetHeader, | |
| SheetTitle, | |
| SheetTrigger, | |
| }; | |