This component no longer exists. It was in motion-primitives’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-06 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Morphing Dialog
motion-primitives/morphing-dialogRemovedComponent
A dialog that morphs from its trigger element with smooth transitions.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/ibelick/motion-primitives/HEAD/public/c/morphing-dialog.jsonSource
1'use client';23import React, {4 useCallback,5 useContext,6 useEffect,7 useId,8 useMemo,9 useRef,10 useState,11} from 'react';12import {13 motion,14 AnimatePresence,15 MotionConfig,16 Transition,17 Variant,18} from 'motion/react';19import { createPortal } from 'react-dom';20import { cn } from '@/lib/utils';21import { XIcon } from 'lucide-react';22import useClickOutside from '@/hooks/useClickOutside';2324export type MorphingDialogContextType = {25 isOpen: boolean;26 setIsOpen: React.Dispatch<React.SetStateAction<boolean>>;27 uniqueId: string;28 triggerRef: React.RefObject<HTMLButtonElement | null>;29};3031const MorphingDialogContext =32 React.createContext<MorphingDialogContextType | null>(null);3334function useMorphingDialog() {35 const context = useContext(MorphingDialogContext);36 if (!context) {37 throw new Error(38 'useMorphingDialog must be used within a MorphingDialogProvider'39 );40 }41 return context;42}4344export type MorphingDialogProviderProps = {45 children: React.ReactNode;46 transition?: Transition;47};4849function MorphingDialogProvider({50 children,51 transition,52}: MorphingDialogProviderProps) {53 const [isOpen, setIsOpen] = useState(false);54 const uniqueId = useId();55 const triggerRef = useRef<HTMLButtonElement>(null!);5657 const contextValue = useMemo(58 () => ({59 isOpen,60 setIsOpen,61 uniqueId,62 triggerRef,63 }),64 [isOpen, uniqueId]65 );6667 return (68 <MorphingDialogContext.Provider value={contextValue}>69 <MotionConfig transition={transition}>{children}</MotionConfig>70 </MorphingDialogContext.Provider>71 );72}7374export type MorphingDialogProps = {75 children: React.ReactNode;76 transition?: Transition;77};7879function MorphingDialog({ children, transition }: MorphingDialogProps) {80 return (81 <MorphingDialogProvider>82 <MotionConfig transition={transition}>{children}</MotionConfig>83 </MorphingDialogProvider>84 );85}8687export type MorphingDialogTriggerProps = {88 children: React.ReactNode;89 className?: string;90 style?: React.CSSProperties;91 triggerRef?: React.RefObject<HTMLButtonElement>;92};9394function MorphingDialogTrigger({95 children,96 className,97 style,98 triggerRef,99}: MorphingDialogTriggerProps) {100 const { setIsOpen, isOpen, uniqueId } = useMorphingDialog();101102 const handleClick = useCallback(() => {103 setIsOpen(!isOpen);104 }, [isOpen, setIsOpen]);105106 const handleKeyDown = useCallback(107 (event: React.KeyboardEvent) => {108 if (event.key === 'Enter' || event.key === ' ') {109// … truncated
What it pulls in
npm packages
