animated-modal
aceternity/animated-modalUnverifiedComponent
aceternity publishes no description for this item.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/rickhallett/becoming-diamond-nextjs/main/animated-modal.jsonSource
1"use client";2import { cn } from "@/lib/utils";3import { AnimatePresence, motion } from "motion/react";4import React, {5 ReactNode,6 createContext,7 useContext,8 useEffect,9 useRef,10 useState,11} from "react";1213interface ModalContextType {14 open: boolean;15 setOpen: (open: boolean) => void;16}1718const ModalContext = createContext<ModalContextType | undefined>(undefined);1920export const ModalProvider = ({ children }: { children: ReactNode }) => {21 const [open, setOpen] = useState(false);2223 return (24 <ModalContext.Provider value={{ open, setOpen }}>25 {children}26 </ModalContext.Provider>27 );28};2930export const useModal = () => {31 const context = useContext(ModalContext);32 if (!context) {33 throw new Error("useModal must be used within a ModalProvider");34 }35 return context;36};3738export function Modal({ children }: { children: ReactNode }) {39 return <ModalProvider>{children}</ModalProvider>;40}4142export const ModalTrigger = ({43 children,44 className,45}: {46 children: ReactNode;47 className?: string;48}) => {49 const { setOpen } = useModal();50 return (51 <button52 className={cn(53 "px-4 py-2 rounded-md text-black dark:text-white text-center relative overflow-hidden",54 className55 )}56 onClick={() => setOpen(true)}57 >58 {children}59 </button>60 );61};6263export const ModalBody = ({64 children,65 className,66}: {67 children: ReactNode;68 className?: string;69}) => {70 const { open } = useModal();7172 useEffect(() => {73 if (open) {74 document.body.style.overflow = "hidden";75 } else {76 document.body.style.overflow = "auto";77 }78 }, [open]);7980 const modalRef = useRef(null);81 const { setOpen } = useModal();82 useOutsideClick(modalRef, () => setOpen(false));8384 return (85 <AnimatePresence>86 {open && (87 <motion.div88 initial={{89 opacity: 0,90 }}91 animate={{92 opacity: 1,93 backdropFilter: "blur(10px)",94 }}95 exit={{96 opacity: 0,97 backdropFilter: "blur(0px)",98 }}99 className="fixed [perspective:800px] [transform-style:preserve-3d] inset-0 h-full w-full flex items-center justify-center z-50"100 >101 <Overlay />102103 <motion.div104 ref={modalRef}105 className={cn(106// … truncated
What it pulls in
npm packages
Files it writes
More from aceternity
All 89 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| 3d-card3d-card | aceternity | Components | Unverified | no deps | |
| 3d Globe3d-globe | aceternity | Components | Free | 3 deps | |
| 3d-marquee3d-marquee | aceternity | Components | Unverified | no deps | |
| 3d-pin3d-pin | aceternity | Components | Unverified | 1 dep | |
| animated-testimonialsanimated-testimonials | aceternity | Components | Unverified | 2 deps | |
| animated-tooltipanimated-tooltip | aceternity | Components | Unverified | 1 dep | |
| apple-cards-carouselapple-cards-carousel | aceternity | Components | Unverified | 2 deps | |
| Ascii Artascii-art | aceternity | Components | Free | 1 dep |
