Perspective Tilt
ratneshc/perspective-tiltFreeComponent
A 3D card with perspective tilt and blur transitions.
Install it
npx shadcn@latest add https://ratneshc.com/r/perspective-tilt.jsonSource
1"use client";23import * as React from "react";4import { AnimatePresence, motion } from "motion/react";56import { cn } from "@/lib/utils";78type PerspectiveTiltContextType = {9 /** Whether the dialog is currently open. */10 open: boolean;11 /** Function to update the open state. */12 setOpen: (open: boolean) => void;13};1415const PerspectiveTiltContext =16 React.createContext<PerspectiveTiltContextType | null>(null);1718function usePerspectiveTilt() {19 const context = React.useContext(PerspectiveTiltContext);20 if (!context) {21 throw new Error(22 "PerspectiveTilt components must be wrapped in <PerspectiveTilt />"23 );24 }25 return context;26}2728/** Hook to detect and respect the user's reduced motion system preference. */29function useReducedMotion() {30 const [prefersReducedMotion, setPrefersReducedMotion] = React.useState(false);3132 React.useEffect(() => {33 const mediaQuery = window.matchMedia("(prefers-reduced-motion: reduce)");34 setPrefersReducedMotion(mediaQuery.matches);3536 const handler = (event: MediaQueryListEvent) =>37 setPrefersReducedMotion(event.matches);38 mediaQuery.addEventListener("change", handler);39 return () => mediaQuery.removeEventListener("change", handler);40 }, []);4142 return prefersReducedMotion;43}4445export interface PerspectiveTiltProps {46 /** Controlled open state of the dialog. */47 open?: boolean;48 /** Callback fired when the open state changes. */49 onOpenChange?: (open: boolean) => void;50 /** Children nodes to render within the root. */51 children: React.ReactNode;52}5354export function PerspectiveTilt({55 open: controlledOpen,56 onOpenChange,57 children,58}: PerspectiveTiltProps) {59 const [uncontrolledOpen, setUncontrolledOpen] = React.useState(false);6061 const open = controlledOpen ?? uncontrolledOpen;62 const setOpen = React.useCallback(63 (value: boolean) => {64 if (controlledOpen === undefined) {65 setUncontrolledOpen(value);66 }67 onOpenChange?.(value);68 },69 [controlledOpen, onOpenChange]70 );7172 return (73 <PerspectiveTiltContext.Provider value={{ open, setOpen }}>74 {children}75 </PerspectiveTiltContext.Provider>76 );77}7879export interface PerspectiveTiltTriggerProps {80 /** Custom styling for the trigger element. */81 className?: string;82 /** Whether to merge props onto the child component. */83 asChild?: boolean;84 /** The element that triggers the dialog. */85 children: React.ReactNode;86}8788export function PerspectiveTiltTrigger({89 className,90 asChild,91// … truncated
What it pulls in
npm packages
Files it writes
More from ratneshc
All 6 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| Blur Shimmer Textblur-shimmer-text | ratneshc | Components | Free | 1 dep | |
| Copy Buttoncopy-button | ratneshc | Components | Free | 1 dep | |
| Stars Travelstars-travel | ratneshc | Components | Free | 1 dep |
