mirror of
https://github.com/formbricks/formbricks.git
synced 2025-12-30 02:10:12 -06:00
* preview hint, warnings, survey status indicator * add event in survey builder, add surveystatusdropdown * update wording, add survey status toasts, update LP --------- Co-authored-by: Matthias Nannt <mail@matthiasnannt.com>
76 lines
2.8 KiB
TypeScript
76 lines
2.8 KiB
TypeScript
import { Dialog, Transition } from "@headlessui/react";
|
|
import { XMarkIcon } from "@heroicons/react/24/solid";
|
|
import { Fragment } from "react";
|
|
import clsx from "clsx";
|
|
|
|
type Modal = {
|
|
open: boolean;
|
|
setOpen: (v: boolean) => void;
|
|
children: React.ReactNode;
|
|
title?: string;
|
|
noPadding?: boolean;
|
|
closeOnOutsideClick?: boolean;
|
|
};
|
|
|
|
const Modal: React.FC<Modal> = ({
|
|
open,
|
|
setOpen,
|
|
children,
|
|
title,
|
|
noPadding,
|
|
closeOnOutsideClick = true,
|
|
}) => {
|
|
return (
|
|
<>
|
|
<Transition.Root show={open} as={Fragment}>
|
|
<Dialog as="div" className="relative z-20" onClose={() => closeOnOutsideClick && setOpen(false)}>
|
|
<Transition.Child
|
|
as={Fragment}
|
|
enter="ease-out duration-300"
|
|
enterFrom="opacity-0"
|
|
enterTo="opacity-100"
|
|
leave="ease-in duration-200"
|
|
leaveFrom="opacity-100"
|
|
leaveTo="opacity-0">
|
|
<div className="fixed inset-0 bg-slate-500 bg-opacity-30 backdrop-blur-md transition-opacity" />
|
|
</Transition.Child>
|
|
|
|
<div className="fixed inset-0 z-10 overflow-y-auto">
|
|
<div className="flex min-h-full items-end justify-center p-4 text-center sm:items-center sm:p-0">
|
|
<Transition.Child
|
|
as={Fragment}
|
|
enter="ease-out duration-300"
|
|
enterFrom="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95"
|
|
enterTo="opacity-100 translate-y-0 sm:scale-100"
|
|
leave="ease-in duration-200"
|
|
leaveFrom="opacity-100 translate-y-0 sm:scale-100"
|
|
leaveTo="opacity-0 translate-y-4 sm:translate-y-0 sm:scale-95">
|
|
<Dialog.Panel
|
|
className={clsx(
|
|
"relative transform rounded-lg bg-slate-100 text-left shadow-xl transition-all dark:bg-slate-800 sm:my-8 sm:w-full sm:max-w-xl ",
|
|
`${noPadding ? "" : "px-4 pt-5 pb-4 sm:p-6"}`
|
|
)}>
|
|
<div className="absolute top-0 right-0 hidden pt-4 pr-4 sm:block">
|
|
<button
|
|
type="button"
|
|
className="rounded-md bg-white text-slate-400 hover:text-slate-500 focus:outline-none focus:ring-0 focus:ring-offset-2 dark:bg-slate-900"
|
|
onClick={() => setOpen(false)}>
|
|
<span className="sr-only">Close</span>
|
|
<XMarkIcon className="h-6 w-6" aria-hidden="true" />
|
|
</button>
|
|
</div>
|
|
{title && <h3 className="mb-4 text-xl font-bold text-slate-500">{title}</h3>}
|
|
|
|
{children}
|
|
</Dialog.Panel>
|
|
</Transition.Child>
|
|
</div>
|
|
</div>
|
|
</Dialog>
|
|
</Transition.Root>
|
|
</>
|
|
);
|
|
};
|
|
|
|
export default Modal;
|