* B2B-99: add pacakge comparison modal * B2B-99: add package comparison modal --------- Co-authored-by: Helena <helena@Helenas-MacBook-Pro.local>
127 lines
3.7 KiB
TypeScript
127 lines
3.7 KiB
TypeScript
'use client';
|
|
|
|
import * as React from 'react';
|
|
|
|
import * as DialogPrimitive from '@radix-ui/react-dialog';
|
|
import { Cross2Icon } from '@radix-ui/react-icons';
|
|
|
|
import { cn } from '../lib/utils';
|
|
|
|
const Dialog = DialogPrimitive.Root;
|
|
|
|
const DialogTrigger = DialogPrimitive.Trigger;
|
|
|
|
const DialogPortal = DialogPrimitive.Portal;
|
|
|
|
const DialogClose = DialogPrimitive.Close;
|
|
|
|
const DialogOverlay: React.FC<
|
|
React.ComponentPropsWithRef<typeof DialogPrimitive.Overlay>
|
|
> = ({ className, ...props }) => (
|
|
<DialogPrimitive.Overlay
|
|
className={cn(
|
|
'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 fixed inset-0 z-1000 bg-black/30',
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
);
|
|
DialogOverlay.displayName = DialogPrimitive.Overlay.displayName;
|
|
|
|
const DialogContent: React.FC<
|
|
React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {
|
|
customClose?: React.JSX.Element;
|
|
preventAutoFocus?: boolean;
|
|
}
|
|
> = ({ className, children, customClose, preventAutoFocus, ...props }) => (
|
|
<DialogPortal>
|
|
<DialogOverlay />
|
|
<DialogPrimitive.Content
|
|
className={cn(
|
|
'bg-background data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 fixed top-[50%] left-[50%] z-1000 grid w-full max-w-lg translate-x-[-50%] translate-y-[-50%] gap-4 border p-6 shadow-lg duration-200 sm:rounded-lg',
|
|
className,
|
|
)}
|
|
onOpenAutoFocus={
|
|
preventAutoFocus ? (e) => e.preventDefault() : props.onOpenAutoFocus
|
|
}
|
|
onCloseAutoFocus={
|
|
preventAutoFocus ? (e) => e.preventDefault() : props.onOpenAutoFocus
|
|
}
|
|
{...props}
|
|
>
|
|
{children}
|
|
<DialogPrimitive.Close className="ring-offset-background focus:ring-ring data-[state=open]:bg-accent data-[state=open]:text-muted-foreground absolute top-4 right-4 rounded-xs transition-opacity hover:opacity-70 focus:ring-2 focus:ring-offset-2 focus:outline-hidden disabled:pointer-events-none">
|
|
{customClose || (
|
|
<>
|
|
<Cross2Icon className="h-4 w-4" />
|
|
<span className="sr-only">Close</span>
|
|
</>
|
|
)}
|
|
</DialogPrimitive.Close>
|
|
</DialogPrimitive.Content>
|
|
</DialogPortal>
|
|
);
|
|
|
|
DialogContent.displayName = DialogPrimitive.Content.displayName;
|
|
|
|
const DialogHeader = ({
|
|
className,
|
|
...props
|
|
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
<div
|
|
className={cn('flex flex-col space-y-1.5 text-left', className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
DialogHeader.displayName = 'DialogHeader';
|
|
|
|
const DialogFooter = ({
|
|
className,
|
|
...props
|
|
}: React.HTMLAttributes<HTMLDivElement>) => (
|
|
<div
|
|
className={cn(
|
|
'flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2',
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
);
|
|
DialogFooter.displayName = 'DialogFooter';
|
|
|
|
const DialogTitle: React.FC<
|
|
React.ComponentPropsWithRef<typeof DialogPrimitive.Title>
|
|
> = ({ className, ...props }) => (
|
|
<DialogPrimitive.Title
|
|
className={cn(
|
|
'text-2xl leading-none font-semibold tracking-tight',
|
|
className,
|
|
)}
|
|
{...props}
|
|
/>
|
|
);
|
|
DialogTitle.displayName = DialogPrimitive.Title.displayName;
|
|
|
|
const DialogDescription: React.FC<
|
|
React.ComponentPropsWithRef<typeof DialogPrimitive.Description>
|
|
> = ({ className, ...props }) => (
|
|
<DialogPrimitive.Description
|
|
className={cn('text-muted-foreground text-sm', className)}
|
|
{...props}
|
|
/>
|
|
);
|
|
DialogDescription.displayName = DialogPrimitive.Description.displayName;
|
|
|
|
export {
|
|
Dialog,
|
|
DialogPortal,
|
|
DialogOverlay,
|
|
DialogTrigger,
|
|
DialogClose,
|
|
DialogContent,
|
|
DialogHeader,
|
|
DialogFooter,
|
|
DialogTitle,
|
|
DialogDescription,
|
|
};
|